1.shell脚本
#!/bin/bash(脚本声明,表示用哪种shell解释器。)
#(井号开头代表脚本里面的注释信息,系统不执行注释信息,是给其他人读,明白其中的信息。)
声明与脚本注释写完后,就可以接着写要执行的脚本命令。
如遇到权限不足导致的脚本无法执行,则用“bash 脚本.sh”执行脚本命令。
2.shell脚本接受参数的变量
$0 对应脚本本身;
$1 对应脚本后的第一个参数,($2、$3、$4.....以此类推)
$# 对应的是总共有多少个参数;
$* 对应所有位置的参数值。
[root@linuxprobe ~]# vim example.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。"
echo "第1 个参数为$1,第5 个为$5。"
[root@linuxprobe ~]# sh example.sh one two three four five six
当前脚本名称为example.sh
总共有6 个参数,分别是one two three four five six。
第 1 个参数为one,第5 个为five。
3.条件测试语句
测试语句格式:[ 条件表达式 ](中括号与条件表达式两边应有空格)。
按测试对象来划分,可划分为:文件测试语句、逻辑测试语句、整数值比较语句、字符串比较语句。
[root@linuxprobe ~]# [ -d /etc/fstab ]
[root@linuxprobe ~]# echo $?
1
[root@linuxprobe ~]# [ -f /etc/fstab ]
[root@linuxprobe ~]# echo $?
0
运算符-d用来测试文件是否是目录类型,fstab文件是/etc目录下的一个配置文件,所以肯定不是目录类型。$?代表上一次命令的执行返回值,返回值为非0数值,如果是的话,返回值为0。
逻辑操作符:
"&&"(与):若前面的命令执行成功,则执行后面的命令;-e运算符测试该/dev/cdrom存在,执行成功就会继续执行“与”后面的命令,输出Exist。
[root@linuxprobe ~]# [ -e /dev/cdrom ] && echo "Exist"
Exist
"||"(或):若前面的命令执行不成功,则执行后面的命令;由echo输出USER变量值,当前用户为root用户,所以$USER=root,前面执行成功,“或”逻辑符就不会执行后面的命令。当切换用户为普通用户“linuxprobe”,$USER=linuxprobe,所以满足“或”的逻辑,前面执行不成功,则执行后面的命令。
[root@linuxprobe ~]# echo $USER
root
[root@linuxprobe ~]# [ $USER = root ] || echo "user"
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ [ $USER = root ] || echo "user"
user
"!"(非):取反值。当前用户为root用户,$USER=root,经“非”逻辑符取反操作后,表示当前用户不是root用户。所以满足“或”的逻辑,去执行后面的命令。
[root@linuxprobe root]# [ ! $USER = root ] || echo "administrator"
administrator
整数值比较语句:
通过执行命令可以更轻松的理解
[root@linuxprobe ~]# [ 10 -gt 10 ]
[root@linuxprobe ~]# echo $?
1
[root@linuxprobe ~]# [ 10 -eq 10 ]
[root@linuxprobe ~]# echo $?
0
还可以使用一个综合命令来判断服务器内存是否不足。free -m命令以M为单位查看系统内存量,通过grep命令,查看Mem这一行,再由管道符执行awk命令打印第4列,将这一部分用反引号,代表直接运行返回结果,再跟1024作比较,判断是否小于(-lt)1024。如果小于,则由与逻辑执行下个命令,输出lack,如果大于,则执行或逻辑,输出enough。
[root@linuxprobe ~]# [ `free -m | grep Mem: | awk '{print $4}'` -lt 1024 ] && echo "lack" || echo "enough"
字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。
接下来通过判断 String 变量是否为空值,进而判断是否定义了这个变量:
[root@linuxprobe ~]# [ -z $String]
[root@linuxprobe ~]# echo $?
0
4.if条件测试语句
if 语句分为单分支结构、双分支结构、多分支结构。
[root@linuxprobe ~]# vim chkscore.sh
#!/bin/bash
read -p "Enter your score(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi
[root@linuxprobe ~]# bash chkscore.sh
Enter your score(0-100):88
88 is Excellent
[root@linuxprobe ~]# bash chkscore.sh
Enter your score(0-100):80
80 is Pass
此为多分支结构的if条件测试语句。首先是声明用哪个shell解释器,注释可以不写。命令read,用来读取用户输入的信息,把用户输入的信息赋值给后面的变量GRADE,-p参数,提示用户的信息。首先if判断是否在大于等于85小于等于100,是的话(返回值为0),则输出excellent,如果返回值是是非0数字,则执行elif的条件,判断是否在70到84之间,如果满足则输出pass,不满足则执行else的命令。结尾用fi结束命令的执行。该命令有兜底策略,如果分数大于100或者小于0,则都执行else语句,输出fail。
5.for条件循环语句
[root@linuxprobe ~]# vim users.txt
andy
barry
carl
duke
eric
george
首先创建一个文件,让for条件执行的取值列表,用vim查看,即为要执行的用户名列表。
[root@linuxprobe ~]# vim Example.sh
#!/bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done
编辑(vim)Example.sh文件,首先是声明,注释省略,用read命令赋值给后面的变量PASSWD,-p:跟随给用户的提示“Enter The Users Password"。for语句变量名UNAME从users.txt中获取,do 命令序列,id命令判断是否有该账户,通过比较返回值$?是否等于0,如果=0,则执行Already exists,如果不等于0,则useradd $UNAME,创建该用户,同时通过echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null,给创建的新用户创建密码。创建成功后,其返回值=0,再进行第二次if条件语句输出Create success,如果未创建成功,则输出Create failure。通过两个fi结束两个if条件测试语句,通过done结束for条件循环语句。
来源:oschina
链接:https://my.oschina.net/u/4437431/blog/3170778