if 单分支if语句 例子1:写一个脚本,实现如下功能: 如果用户存在,就说明其存在; #!/bin/bash UserName=user1 if grep "^$UserName\>" /etc/passwd &> /dev/null; then
echo "$UserName exists." fi
#!/bin/bash
UserName=user1
if id $UserName &> /dev/null; then echo "$UserName exists."
练习:写一个脚本,实现如下功能: 如果用存在,就显示其UID和SHELL; #!/bin/bash UserName=user1 if id $UserName &> /dev/null; then grep "^$UserName\>" /etc/passwd | cut -d: -f3,7 fi
练习:写一个脚本,实现如下功能: 如果设备/dev/sda3已经挂载,就显示其挂载点; #!/bin/bash Device='/dev/sda3' if mount | grep "^$Device" &> /dev/null; then
mount | grep "/dev/sda3" | cut -d' ' -f3 fi
练习:写一个脚本,实现如下功能: 如果/etc/rc.d/rc.sysinit中有空白行,就显示其空白行数; #!/bin/bash File='/etc/rc.d/rc.sysinit' if grep "^$" $File &> /dev/null; then
grep "^$" $File | wc -l fi
双分支if语句:
例子:写一个脚本: 如果指定的用户存,先说明其已经存在,并显示其ID号和SHELL;否则,就添加用户,并显示其ID号 #!/bin/bash
UserName=user1 if id $UserName &> /dev/null; then echo "$UserName exists." grep "^$UserName:" /etc/passwd | cut -d: -f3,7 else useradd $UserName grep "^$UserName:" /etc/passwd | cut -d: -f3 fi
练习:写一个脚本,实现如下功能: 如果设备/dev/sda3已经挂载,就显示其挂载点;否则,就说明其未挂载或设备不存在; #!/bin/bash Device='/dev/sda3' if mount | grep "^$Device" &> /dev/null; then
mount | grep "/dev/sda3" | cut -d' ' -f3 else echo "$Device not mounted or not exist." fi
整数测试: expression: 数值1 比较符号 数值2 $A 比较符号 $B 大于:-gt, 例如 $A -gt $B 大于或等于:-ge 等于:-eq 小于:-lt 小于或等于:-le 不等于:-ne 例子:写一个脚本,生成两个随机数,比较其大小;显示大数; 注:bash有个内置变量:$RANDOM
#!/bin/bash # A=$RANDOM B=$RANDOM if [ $A -ge $B ]; then
echo "Max number is $A." else echo "Max number is $B." fi
练习:写一脚本,随机生成一个整数,判定,显示其奇偶性;
#!/bin/bash A=$RANDOM if [ $[$A%2] -eq 0 ]; then
echo "$A: Even" else echo "$A: Odd" fi
练习:给定一个用户,如果其ID号大于499,就说明其是普通用户,否则,就说明其是管理员或系统用户 #!/bin/bash UserName=daemon Uid=`id -u $UserName`
if [ $Uid -gt 499 ]; then
echo "A common user: $UserName." else echo "admin user or system user: $UserName." fi
练习:求200以内所有为3的整数倍的整数之和; #!/bin/bash Sum=0
for I in {1..200}; do
if [ $[$I%3] -eq 0 ]; then Sum=$[$Sum+$I] fi done echo "Sum: $Sum."
练习:给定一个用户,如果其UID等于GID,就说明这是个“good guy”,否则,“Bad guy.” #!/bin/bash UserName=user1 if [ `id -u $UserName` -eq `id -g $UserName` ]; then
echo "Good Guy." else echo "Bad Guy." fi echo "EvenSum is: $EvenSum. OddSum is: $OddSum."
写一个脚本: 计算N以内所有奇数的和以及所有偶数的和;分别显示之;N是通过参数传递过来的正整数; #!/bin/bash
EvenSum=0
OddSum=0 for I in `seq 1 $1`;do
if [ $[$I%2] -eq 1 ]; then OddSum=$[$OddSum+$I] else EvenSum=$[$EvenSum+$I] fi done
echo "EvenSum: $EvenSum." echo "OddSUm: $OddSum."
echo "Sum: $[$EvenSum+$OddSum]"
shift [n]:实现位置参数轮替;
例子:通过参数传递n个正整数给脚本,求其和; #!/bin/bash Sum=0 for I in `seq 1 $#`; do Sum=$[$Sum+$1] shift done echo $Sum
练习,写一个脚本,完成以下要求:
1、添加10个用户user1, user2, ..., user10;但要先判断用户是否存在,不存在而后再添加; 2、添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的; 3、最后显示当前系统上共有多少个用户; #!/bin/bash Count=0 for I in {1..10}; do
if id user$I &> /dev/null; then echo "user$I exists." else useradd user$I echo "Add user$I successfully." Count=$[$Count+1] fi done
echo "Add $Count new users." echo "Total users: `wc -l /etc/passwd | cut -d' ' -f1`."
练习,写一个脚本,完成以下要求: 1、通过参数传递一系列用户名给脚本,让脚本添加这些用户;但要先判断用户是否存在,不存在而后再添加; 2、添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的; #!/bin/bash Count=0 for UserName in $@; do
if id $UserName &> /dev/null; then echo "$UserName exists." else useradd $UserName echo "Add $UserName successfully." Count=$[$Count+1] fi done echo "Add $Count new users."
单目: -z $STRING: 为空则为真,不空则为假; -n $STRING: 为空则为假,不空则真;
例子:写一个脚本,判定用户的shell是否为bash; [ "$Shell" == "/bin/bash" ]
#!/bin/bash
Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ "$Shell" == "/bin/bash" ]; then echo "Bash User." Ret=0 else echo "Not Bash User." Ret=9 fi
exit $Ret 改进版: #!/bin/bash Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ -z $Shell ]; then echo "No such user or User's shell is null." exit 10 fi
if [ "$Shell" == "/bin/bash" ]; then echo "Bash User." Ret=0 else echo "Not Bash User." Ret=9 fi exit $Re
bash字符测试: >: 大于 <: 小于 ==: 等于 =~: 判断左边的字符串是否能够被右边的模式所匹配;通常用于[[]]; [[ $opt1 =~ $opt2 ]]
例子:根据用户shell的结束符是否为sh来判定其是否为登录用户: #!/bin/bash Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ -z $Shell ]; then
echo "No shell." exit 3 fi if [[ "$Shell" =~ sh$ ]]; then
echo "Login User." Ret=0 else echo "None Login User." Ret=4 fi exit $Ret
写一个脚本: 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。 如果其生产商为GenuineIntel,就显示其为Intel公司; 否则,就显示其为AMD公司; uniq 取重 #!/bin/bash # Vendor=`grep "vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`
if [[ "$Vendor" =~ [[:space:]]*GenuineIntel$ ]]; then echo "Intel" else echo "AMD" fi
练习:写一个脚本 通过参数传递一个字符串给脚本,如果传递的字符串为“memory”或“Memory”,就以MB为单位显示当前主机的内存信息; 否则,就显示/proc/uptime文件的内容。 #!/bin/bash # if [[ $1 =~ [Mm]emory$ ]]; then free -m else cat /proc/uptime fi
bash知识点:组合条件测试 -a: 与 -o: 或 !: 非,单目操作符
写一脚本,给定用户,如果其不存在,就退出脚本。
if ! id $1 &> /dev/null; then echo "No such user." exit 6 fi
bash条件判断之多分支if语句: 语法格式: if 条件1; then 语句1 语句2 ... elif 条件2; then 语句1 语句2 ... elif 条件3; then 语句1 语句2 ... else 语句1 语句2 ... fi 例:写一个脚本: 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。 如果其生产商为GenuineIntel,就显示其为Intel公司; 如果其生产商为AuthenticAMD,就显示其为AMD公司; 否则,就显示无法识别; #!/bin/bash # Vendor=`grep "vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`
if [[ $Vendor =~ [[:space:]]*GenuineIntel$ ]]; then echo "intel" elif [[ $Vendor =~ [[:space:]]*AuthenticAMD$ ]]; then echo "AMD" else echo "Unknown" fi
bash测试之文件测试: 操作符 文件路径 -f: 测试其是否为普通文件,即ls -l时文件类型为-的文件; -d: 测试其是否为目录文件,即ls -l时文件类型为d的文件; -e: 测试文件是否存在;存在为真,否则为假; -r: 测试文件对当前用户来说是否可读; -w: 测试文件对当前用户来说是否可写; -x: 测试文件对当前用户来说是否可执行; -s: 测试文件大小是否不空,不空则真,空则假; -l:用来车市文件是否为链接文件
如果/tmp/test10不存在,就创建之; if [ ! -e /tmp/test10 ]; then mkdir /tmp/test10 fi
短路操作:只要前半段已经可以决定最终结果,后半段就不再运算; 与运算: 真 && 真 = 真 真 && 假 = 假 假 && {真|假} = 假
或运算: 假 || 0 = 0 假 || 1 = 1
真 || =1
例子:给定一个路径,判断 如果为普通文件,显示之; 如果为目录,显示之; 否则,说无法识别;
#!/bin/bash # if [ ! -e $1 ]; then echo "No such file." exit 7 fi
if [ -f $1 ]; then echo "Common file." elif [ -d $1 ]; then echo "Directory." else echo "Unknown file." fi
|