0x04-2 RHEL linux Shell脚本

编写Shell脚本
可以将Shell终端解释器当作人与计算机硬件之间的“翻译官”,它作为用户与Linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环、分支等高级编程语言才有的控制结构特性。要想正确使用Shell中的这些功能特性,准确下达命令尤为重要。Shell脚本命令的工作方式有两种:交互式和批处理。

交互式(Interactive):用户每输入一条命令就立即执行。

批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。

shell脚本不仅用到前面学习过的很多Linux命令以及正则表达式、管道符、数据流重定向等语法规则还需要把内部功能模块化通过逻辑语句进行处理。最近形成shell脚本。

系统本身已经默认使用了bash作为命令行终端解释器了:

[root@pantao ~]# echo $SHELL
/bin/bash

 

编写简单的shell脚本

linux命令按照顺序依次写入一个文件中,这就是一个简单的shell脚本

shell脚本的组成:①#!/bin/bash 脚本申明#注释脚本命令

例如:列出当前的目录,以及当前文件下所有文件的属性信息。

#!/bin/bash
#pwd,ls
pwd
ls -la

  

输出:

[root@pantao shell]# bash ls.sh
/root/shell
total 32
drwxr-xr-x. 2 root root    77 Nov 18 15:22 .
dr-xr-x---. 6 root root  4096 Nov 18 15:22 ..
-rw-r--r--. 1 root root   144 Nov  5 10:48 115.txt
-rw-r--r--. 1 root root 12288 Nov  5 11:35 .115.txt.swp
-rw-r--r--. 1 root root    31 Nov 18 15:20 ls.sh
-rw-r--r--. 1 root root     7 Nov  1 10:36 l.txt
-rw-r--r--. 1 root root    51 Nov  1 10:34 test.py

  

接收用户的参数

内设了用于接收参数的变量,变量之间可以使用空格间隔。例如$0对应的是当前Shell脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,而$1、$2、$3……则分别对应着第N个位置的参数值。

我们来看一个小例子:

#!/bin/bash
echo "当前的脚本名称$0"
echo "总共有$#个参数,分别是$*"
echo "第一个参数为$1,第四个为$4"
[root@pantao shell]# bash example.sh 1 2 3 4 5 6 7
当前的脚本名称example.sh
总共有7个参数,分别是1 2 3 4 5 6 7
第一个参数为1,第四个为4

  

 判断用户参数

测试对象来划分,条件测试语句可以分为4种:

文件测试语句;

逻辑测试语句;

整数值比较语句;

字符串比较语句。

 

 文件测试所用的参数

操作符 作用
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行

 

[root@pantao ~]# [空格 -d /etc/passwd 空格]
[root@pantao ~]# echo $?
1

上面的$?是shell内设的,是显示上一条命令的返回值,如果为0,则目录存在,如果为非0,目录则不存在

逻辑测试语句

&& 与  -命令执行为真(0)时候输出后面的命令  与两个都为真才为真,如果第一个是假,那么就不会输出后面

||   或  -命令执行为假(1)时候输出后面的命令   或任意一个为真就为真,如果第一个是真了,那么后面不会去执行,他就已经是真了

! 非  前面参数是真(0) 后面就为假(1) -假就为真

例子:

[root@pantao ~]# [ -d /etc/ ] && echo "是目录"
是目录

 

例子2:

[root@pantao ~]# [ $USER = root ] || echo "普通用户"#没输出,说明是root
[root@pantao ~]# su - pantao                       #切换用户
[pantao@pantao ~]$  [ $USER = root ] || echo "普通用户"
普通用户

  

例子3:

[root@pantao ~]#  [ $USER != root ] && echo "user" || echo "root"
root

  可用的整数比较运算符

操作符 作用 英文全称方便记忆
-eq 是否等于 equal
-ne 是否不等于 not equal
-gt 是否大于 greater than
-lt 是否小于 less than
-le 是否等于或小于 less than or equal
-ge 是否大于或等于 greater than or equal

测试一下10是否大于10以及10是否等于10(通过输出的返回值内容来判断):

[root@pantao ~]# [ 10 -eq 10  ]
[root@pantao ~]# echo $?
0
[root@pantao ~]# [ 10 -gt 10  ]
[root@pantao ~]# echo $?
1
[root@pantao ~]#

 

设置内存超出预期自动报警

[root@pantao ~]# FreeM=`free -m |grep Mem: | awk '{print $4}'`
[root@pantao ~]# [ $FreeM -gt 1024 ] && echo "内存不足"

 

 

流控制语句

常见的有if 、for 、while、case

使用格式

if语句

if 条件

  then 命令

if 

 

if 条件

  then

  else

if

 

 

if

  then

elif

  then

else

  命令

fi

 

例如判断改文件夹是否存在/media/cdrom文件是否存在,存在就结束,不存在就创建一个这个目录

#!/bin/bash
#ls
dir="/media/cdrom"
if [ ! -e $dir ]
then
mkdir -p $dir
fi
~
~

  

for条件循环语句

 

 

 

for 变量名 in 取值列表

do

  命令序列

done

我们使用一个批量添加新用户,用户面先写到一个文件里。

#!/bin/bash
#添加用户
for i in $(cat /root/bash/users.txt)
do
  useradd $i
  echo "123456" |passwd --stdin $i
done
~


[root@pantao bash]# bash for.sh
Changing password for user cat.
passwd: all authentication tokens updated successfully.
Changing password for user xiao.
passwd: all authentication tokens updated successfully.
Changing password for user qiao.
passwd: all authentication tokens updated successfully.
Changing password for user liu.
passwd: all authentication tokens updated successfully.
Changing password for user pan.
passwd: all authentication tokens updated successfully.
Changing password for user li.
passwd: all authentication tokens updated successfully.

  

while条件循环语句

 

 

while 条件

do

  命令

done

例子:猜商品价格

 

case条件测试语句

case 变量值 in

模式1)

  命令

  ;;

  。。。。

*)

  默认命令序列

esac

这个有点像c语言里面的swich语句

例如:

#!/bin/bash
read -p  "随你输入:" GILL
case "$GILL" in
[a-z]|[A-Z])
echo "字母"
;;
[0-9])
echo "数字"
;;
*)
echo "其他字符"
esac
[root@pantao ~]# bash case
随你输入:a
字母
[root@pantao ~]# bash case
随你输入:1
数字
[root@pantao ~]# bash case
随你输入:aa11
其他字符

  

 

posted @ 2018-11-18 19:19  Admpt  阅读(79)  评论(0)    收藏  举报