|
18、bash脚本编程之四 字符串测试,组合测试及for循环
2021年07月13日 |
|
练习: 传递一个用户名参数给脚本,判断此用户的用户名跟其基本组的组名是否一致,并将结果显示出来。 18.1 字符(串)测试: ==:测试是否相等,相等为真,不等为假(等号两端必须要加空格) !=: 测试是否不等,不等为真,等为假 >:测试一个字符串是否大于另外一个字符串 <:测试一个字符串是否小于另外一个字符串 -n string: 测试指定字符串是否为空,空则真,不空则假 -z string: 测试指定字符串是否不空,不空为真,空则为假 [root@Daniel-R480 ~]# A=hello [root@Daniel-R480 ~]# B=hi [root@Daniel-R480 ~]# [ “$A”==”B” ] [root@Daniel-R480 ~]# echo $? 0 [root@Daniel-R480 ~]# [ “$A” == “B” ] [root@Daniel-R480 ~]# echo $? 1 [root@Daniel-R480 ~]# [ “$A” = “$B” ] [root@Daniel-R480 ~]# echo $? 1 #‘’代表着直接对比A和B [root@Daniel-R480 ~]# [ ‘$A’ = ‘$B’ ] [root@Daniel-R480 ~]# echo $? 1 [root@Daniel-R480 ~]# [ “$A” = “$B” ] [root@Daniel-R480 ~]# echo $? 1 [root@Daniel-R480 ~]# [root@Daniel-R480 ~]# [ “$A” != “$B” ] [root@Daniel-R480 ~]# echo $? 0 [root@Daniel-R480 ~]# 练习:写一个脚本 传递一个参数(单字符就行)给脚本,如参数为q,就退出脚本;否则,就显示用户的参数; 练习:写一个脚本 传递一个参数(单字符就行)给脚本,如参数为q、Q、quit或Quit,就退出脚本;否则,就显示用户的参数; #!/bin/bash # if [ $1 = ‘q’ ];then echo “Quiting…” exit 1 elif [ $1 = ‘Q’ ];then echo “Quiting…” exit 2 elif [ $1 = ‘quit’ ];then echo “Quiting…” exit 3 elif [ $1 = ‘Quit’ ];then echo “Quiting…” exit 4 else echo $1 fi 18.2 组合测试条件 -a: 与关系 -o: 或关系 !: 非关系 if [ $# -gt 1 -a $# -le 3 ] if [ $# -gt 1 ] && [ $# -le 3 ] q, Q, quit, Quit 练习: 传递三个参数给脚本,第一个为整数,第二个为算术运算符,第三个为整数,将计算结果显示出来,要求保留两位精度。形如: ./calc.sh 5 / 2 练习: 传递3个参数给脚本,参数均为用户名。将此些用户的帐号信息提取出来后放置于/tmp/testusers.txt文件中,并要求每一行行首有行号。 写一个脚本: 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。 如果其生产商为AuthenticAMD,就显示其为AMD公司; 如果其生产商为GenuineIntel,就显示其为Intel公司; 否则,就说其为非主流公司; 写一个脚本: 给脚本传递三个整数,判断其中的最大数和最小数,并显示出来。 MAX=0 MAX -eq $1 MAX=$1 MAX -lt $2 MAX=$2 18.3 for循环 循环:进入条件,退出条件 for while until for 变量 in 列表; do 循环体 done for I in 1 2 3 4 5 6 7 8 9 10; do 加法运算 done 遍历完成之后,退出; 如何生成列表: (1){1..100}:直接通过数字列表 (2)`seq [起始数 [步进长度]] 结束数`:通过seq命令 [root@Daniel-R480 ~]# seq 3 1 2 3 [root@Daniel-R480 ~]# seq 5 10 5 6 7 8 9 10 [root@Daniel-R480 ~]# seq 2 2 10 2 4 6 8 10 [root@Daniel-R480 ~]# #!/bin/bash # declare -i SUM=0 for I in {1..100};do let SUM=$[$SUM+$I] done echo “The sum is : $SUM” 1,…,100 declare -i SUM=0 integer -x 写一个脚本: 1、设定变量FILE的值为/etc/passwd 2、依次向/etc/passwd中的每个用户问好,并显示对方的shell,形如: Hello, root, your shell: /bin/bash [root@Daniel-R480 ~]# for I in `seq 1 $LINES`; do echo “Hello, `head -n $I /etc/passwd | tail -1 | cut -d: -f1`”; done Hello, root Hello, bin Hello, daemon Hello, adm Hello, lp Hello, sync Hello, shutdown Hello, halt Hello, mail Hello, operator Hello, games Hello, ftp Hello, nobody Hello, systemd-network Hello, dbus Hello, polkitd Hello, rpc Hello, rpcuser Hello, nfsnobody Hello, sshd Hello, postfix Hello, chrony Hello, daniel Hello, daniel Hello, daniel Hello, daniel Hello, daniel Hello, daniel Hello, daniel 3、统计一共有多少个用户 for I in `seq 1 $LINES`; do echo “Hello, `head -n $I /etc/passwd | tail -1 | cut -d: -f1`”; done 只向默认shell为bash的用户问声好 写一个脚本: 1、添加10个用户user1到user10,密码同用户名;但要求只有用户不存在的情况下才能添加; #!/bin/bash # for I in {1..10};do if id user$I &>/dev/null; then echo “user$I exists.” else useradd user$I echo user$I | passwd –stdin user$I &> /dev/null fi done #!/bin/bash # for I in {1..10}; do if id user$I &>/dev/null; then userdel -r user$I echo “Delete user$I finished.” else echo “user$I not exist.” fi done 扩展: 接受一个参数: add: 添加用户user1..user10 del: 删除用户user1..user10 其它:退出 #!/bin/bash # if [ $# -lt 1 ];then echo “Usage; adminusers –ARG” exit 7 fi if [ $1 == ‘–add’ ];then for I in {1..10}; do if id user$I &> /dev/null; then echo “user$I exists.” else useradd user$I echo user$I | passwd –stdin user$I &> /dev/null echo “Add user$I finished.” fi done elif [ $1 == ‘–del’ ]; then for I in {1..10};do if id user$I &> /dev/null;then userdel -r user$I echo “Delete user$I finished.” else echo “No user$I.” fi done else echo “Unknown ARG” exit 8 fi 设置adminusers user1,user2,user3,hello,hi #!/bin/bash # if [ $1 == ‘–add’ ]; then for I in `echo $2 | sed ‘s/,/ /g’`;do if id $I &> /dev/null;then echo “$I exists.” else useradd $I echo $I | passwd –stdin $I &> /dev/null echo “add $I finished.” fi done elif [ $1 == ‘–del’ ]; then for I in `echo $2 | sed ‘s/,/ /g’`;do if id $I &> /dev/null;then userdel -r $I echo “Delete $I finished.” else echo “$I NOT exist.” fi done elif [ $1 == ‘–help’ ]; then echo “Usage:adminuser2.sh –add USER1,USER2,… | –del USER1,USER@@,…” else echo “Unknown options.” fi 写一个脚本: 计算100以内所有能被3整除的正整数的和; 取模,取余:% 3%2=1 100%55=45 写一个脚本: 计算100以内所有奇数的和以及所有偶数的和;分别显示之; 18.4 let命令和数据计算 let命令 let I=$[$I+1] SUM=$[$SUM+$I]和let SUM+=$I是一个意思 let I+=1 相当于 let I++ [root@Daniel-R480 ~]# I=3 [root@Daniel-R480 ~]# let I++ [root@Daniel-R480 ~]# echo $I 4 [root@Daniel-R480 ~]# let I++ [root@Daniel-R480 ~]# echo $I 5 -=:表示=-相对应的数值 let I-=1 相当于 let I– ++I, –I *=:表示=*相对应的数值 /=:表示=/相对应的数值 %=:表示=%(取余)相对应的数值 写一个脚本, 分别显示当前系统上所有默认shell为bash的用户和默认shell为/sbin/nologin的用户,并统计各类shell下的用户总数。显示结果形如: BASH,3users,they are: root,redhat,gentoo NOLOGIN, 2users, they are: bin,ftp #!/bin/bash # NUMBASH=`grep “bash$” /etc/passwd | wc -l` BASHUSERS=`grep “bash$” /etc/passwd | cut -d: -f1` BASHUSERS=`echo $BASHUSERS | sed ‘s@[[:space:]]@,@g’` echo “BASH, $NUMBASH users, they are:” echo “$BASHUSERS |