LINUX(for、while、unatli)循环

什么是shell循环

将某代码段重复运行多次; 重复运行多少次: 循环次数事先已知 ;循环次数事先未知 ;有进入条件和退出条件

显示1-10

echo {1..10}
echo $(seq 1 10)

1-10 递加

echo {1..10..2}
echo $(seq 1 2 10)

1-10 递减

echo {10..1..2}
 echo $(seq 10 -2 1)

1-100间的奇数和偶数

 echo {1..100..2}		# 1-100奇数
 echo {2..100..2}		# 2-100偶数
 echo {100..1..2}		# 100-2偶数
 echo {99..1..2}		# 100-1奇数       

随机生成16位包含数字、大小写字母、符号的密码

cat /dev/urandom |tr -dc '0-9a-zA-Z!@_#?.,' |head -c 16

tr -d 和 tr -dc 的用法

echo 12324345 |tr -d 2 #不要数字2
echo 12324345 |tr -dc 2 #支取数字2

for循环

在这里插入图片描述
格式

for 变量名 in 列表;do 
        循环体 
done

执行机制

执行机制: 

依次将列表中的元素赋值给“变量名”; 每次赋值后即执 行一次循环体; 直到列表中的元素耗尽,循环结束

for循环的列表生成方式: 
 (1) 直接给出列表 
 (2) 整数列表: 
                      (a) {start..end}   
                    (b) $(seq [start [step]] end) 
(3) 返回列表的命令 $(COMMAND) 
(4) 使用glob,如:*.sh 
(5) 变量引用; $@, $*

实例1

要求:批量创建user1至user10,要求设置随机16位密码,包含数字、大小写字母、符号。并要求用户使用密码首次登录后,强制设置新密码。

#!/bin/bash
> /root/user.log
for i in {1..10};do
#创建十个用户
        useradd user$i && echo user$i is created
#随机生成密码
        password=$(cat /dev/urandom |tr -dc '0-9a-zA-Z!@_#?.,' |head -c 16)
#将用户和密码导出
        echo user$i:$password >> /root/user.log
#设置密码
        echo $password |passwd --stdin user$i &> /dev/null
#强制下次登录修改密码
        passwd -e user$i &> /dev/null
done

实例2

要求:使用♥,利用for,显示出一个等腰三角形。

方法一:
for ((i=1;i<10;i++))
do
        for ((j=1;j<=i;j++))
do
                echo -n "♥"
        done
        echo
done
for ((i=1;i<9;i++))
do
        for ((j=9;j>i;j--))
do
                echo -n "♥"
        done
        echo
done

方法二:
#!/bin/bash2
read -p "请输入三角形的高度: " num
for i in  `seq $num`;do
        for x in `seq 1 $[$num-$i]`;do
                echo -e " \c"
        done
        for n in `seq 1 $[2*$i-1]`;do
                #yanse=`tr -dc '1-6' < /dev/urandom  | head -c 1`
                #echo -e "\e[3"$yanse"m♥\e[0m\c"
                echo -e "\e[34m♥\e[0m\c"
        done
        echo 
done

方法三:
#!/bin/bash
for ((i = 1; i < 10; i++))
do
   for ((j = 10; j > i; j--))
   do  
      echo -n " ";
   done
   for ((m = 1; m <= i; m++))
   do  
       echo -n "$i "
   done
   echo ""
done

方法四:
#!/bin/bash
#彩色闪烁山角形
read -p "请输入三角形边长: " w
for (( i=1;i<=$w;i++ )); do
        for(( j=$w;j>$i;j--  ));do
                echo -n " "
        done
        for (( m=1;m<=i;m++   ));do
                we=`cat /dev/urandom |tr -dc '1-6' |head -c 1 `
                echo -e  "\033[3"$we";5m♥\033[0m\c"   #红色加闪烁
                done
        echo
done

实例3

要求:添加10个用户user1-user10,密码为8位随机字符、

#!/bin/bash
> /root/user.log
for i in {1..10};do    
    useradd user$i && echo user$i is created
    pass=$(cat /dev/urandom |tr -dc '0-9a-zA-Z!@_#?.,' |head -c 16)   #生成随机数
    echo user$i:---pass:$pass >> /root/user.log
    echo $pass |password --stdin user$i &> /dev/null
done

实例4

要求:/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop  S66filename start

#!/bin/bash
for i in $(ls /etc/rc.d/rc3.d/);do   #查看文件内容确定循环次数
        if [[ $i =~ ^K.* ]];then
                echo "$i stop"
        elif [[ $i =~ ^S.* ]];then
                echo "$i start"
        fi
done

实例5

要求:提示输入正整数n的值,计算1+2+…+n的总和

#!/bin/bash
read -p "请输入一个正整数" s
w=0
if [[ "$s" =~ ^[0-9]+$ ]] ;then
    for i in  $(seq 1 $s) ;do
    w=$[$w+$i]                      
    
    done
    echo "整数1到$s的和为$w"
else echo "请输入正整数"
fi

实例6

要求:计算100以内所有能被3整除的整数之和

方法一:
echo {3..100..3} |tr " " "+"|bc

方法二:
#!/bin/bash
for i in {3..100..3};do    #步进,相加
	n=$[$n+$i]  &> /devnull
 	done
echo $n

方法三:
#!/bin/bash
sum=0
for n in $(seq 1 100);do
        i=$[$n/3]    #进行相除
        y=$[3*$i]    #进行相乘 、运算成功则成立
        if [ $y -eq $n ];then
                sum=$[$n+$sum]
        fi
done  
        echo $sum

方法四:
sum=0
for i in {1..100};do
    if [ $[$i%3] -eq 0 ];then  #相除取余进行判定
    let sum+=$i   #进行加法运算
    fi  
done
echo $sum

实例7

要求:打印九九乘法表

for (( i=1 ;i<=9;i++ ));do
        for ((n=1;n<=9;n++)) ;do
                w=0
                w=$[$n*$i]
        if [ $n -le $i   ];then
        echo -n  " $i*$n=$w "
        fi
        done
echo
done

实例8

要求:在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html

方法一:
#!/bin/bash
cd /testdir &> /dev/null
if [ ! $(echo $?) -eq 0 ] ;then   #判断文件是否存在
    mkdir /testdir &> /dev/null
fi
for i in $(seq 1 10 );do
    w=$(cat /dev/urandom |tr -dc '0-9a-zA-Z!@_#?.,' |head -c 8)
    touch $i$w.html
done

方法二:
if ! [ -d /testdir ];then   #判断文件是否存在
  mkdir /testdir &> /dev/null   #如果没有创建文件
fi
for i in {1..10};do  
  touch /testdir/$i`cat /dev/urandom |tr -dc [:alpha:] |head -c 8`.html    #创建文件
done

实例9

要求:探测局域网内的主机, 172.18.250-254.X,能ping通显示并保存至/root/ip.log,要求并行探测提高效率。

 #!/bin/bash
> /root/ip.log
for i in {250..255};do
    for n in {1..255};do
    {
    ping -c1 -w1 172.18."$i"."$n" &> /dev/null
    if [ $? -eq  0  ] ;then
    echo "ping 172.18."$i"."$n"  is up"  #>> /root/ip.log
    fi
    }&
    done
done

实例10

要求:打印国际象棋棋盘

方法一:
#!/bin/bash
for n in {1..8};do
    for i in {1..8} ;do
        if [ $[$n%2]  -eq 0   ];then
            if [ $[$i%2]  -eq 0   ];then
                 echo -e "\033[41m  \033[0m\c"
            fi
            if [ $[$i%2] -ne 0   ] ;then
                  echo -e "\033[47m  \033[0m\c"              
            fi
        else
             if [ $[$i%2]  -eq 0   ];then
                                  echo -e "\033[47m  \033[0m\c"
                        fi
                        if [ $[$i%2] -ne 0   ] ;then
                                 echo -e "\033[41m  \033[0m\c"                   
                        fi
        fi
    done
    echo 
done

方法二:
#!/bin/bash
for xline in $(seq 1 8);do   #横向
  for yline in $(seq 1 8);do   #纵向
        if  [ $[$[$xline+$yline]%2] -eq 0 ];then   #判断;横向与纵向相加,最后相除是否等于0
          echo -e "\033[47m  \033[0m\c"
        else
          echo -e "\033[41m  \033[0m\c"
        fi
  done
  echo 
done

方法三:
#!/bin/bash
for i in {1..8};do
        for x in {1..4};do  				#控制单行大小。对已有输出进行放大
                for n in {1..8};do
                        a=`echo $[$[$i+$n]%2]`
                        if [ $a -eq 0 ];then
                                echo -e "\e[43m" "" "" "" "" "" "" "" "\e[0m\c"
                        else
                                echo -e "\e[42m" "" "" "" "" "" "" "" "\e[0m\c"
                        fi
                done
                echo
        done
done

while循环

在这里插入图片描述
格式

while CONDITION; do 
         循环体
done

执行机制

CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行 一次循环;直到条件测试状态为“false”终止循环 

因此:CONDTION一般应该有循环控制变量;而此变量的值 会在循环体不断地被修正 
    进入条件:CONDITION为true 
    退出条件:CONDITION为false

案例1

要求:判断/var/目录下所有文件的类型

[root@centos6mini app]# cat  linshi 
#!/bin/bash
dc=0
lc=0
cc=0
bc=0
oc=0
zc=0

ls -l /var |grep -v total >/tmp/var_ftype.txt
while read lines
do
   ftype=`echo $lines |awk '{print $1}' |cut -c 1`
   case $ftype in
        d) dname=`echo $lines |awk '{print $9}'`; echo "$dname is a Directory" ; let dc+=1;;
        l) lname=`echo $lines |awk '{print $9}'`; echo "$lname is a Links of Soft " ;let lc+=1 ;;
        c) cname=`echo $lines |awk '{print $9}'`; echo "$cname is a Character of file" ;let cc+=1;;
        b) bname=`echo $lines |awk '{print $9}'`; echo "$bname is a Block file" ; let bc+=1;;
        -) zname=`echo $lines |awk '{print $9}'`; echo "$zname is a common file" ; let zc+=1;;
        *) echo "Others files"; let oc+=1

   esac

done </tmp/var_ftype.txt
echo '-----------------------------' 
echo -e "var目录下普通文件数量: $zc\nvar目录下子目录数量:$dc\nvar目录下链接文件数量:$lc\nvar目录下字符类型文件数量: $cc\nvar
目录下块设备文件数量:$bc\n其他类型文件数量:$oc"
rm -f /tmp/var_ftype.txt

案例2

要求:求100以内所有正奇数之和

方法一:
echo {1..100..2}
 echo {1..100..2}|tr " " + |bc

方法二:
#!/bin/bash
u=0 
for i in  {1..100..2}; do
    let u+=i
done
echo $u

方法三:
#!/bin/bash
u=0 
i=1
while [ $i -le 100 ] ;do

    let u+=i
    let i+=2
done
echo $u

案例3

要求:提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少

方法一:
#!/bin/bash
w=0
a=0
y=0
for (( d=0;d<256;d++ ));do
    for (( f=1;f<255;f++  ));do
        {
        ping -c1 -w1 172.18."$d"."$f" &> /dev/null
        a=`echo $?`

        if [ $a -eq 0 ] ; then 
            echo "172.18."$d"."$f"  up" >> /app/e.txt
            echo "172.18."$d"."$f"  up "    
        fi
        if [ $a -ne 0 ] ; then 
                        echo "172.18."$d"."$f"  down " >> /app/r.txt
            echo "172.18."$d"."$f"  down "                  
        fi
    }&
    done
done 
w=`cat /app/e.txt |wc -l`
echo "通的 :  $w"
y=`cat /app/r.txt |wc -l`
echo "不通的 :  $y"
rm -rf /app/e.txt
rm -rf /app/w.txt

方法二:
#!/bin/bash
i=1
q=1
w=0
a=0
y=0
while [ $i -lt  255  ];do
    while [ $q  -lt  255 ];do
        {
        ping -c1 -w1 172.18."$i"."$q" &> /dev/null
        a=`echo $?`
        if [ $a -eq 0 ] ; then 
            echo "172.18."$i"."$q"   up" >> /app/e.txt
            echo "172.18."$i"."$q"   :up"
        fi
        if [ $a -ne 0 ] ; then 
                       echo "172.18."$i"."$q"  down "   >> /app/w.txt        
               echo "172.18."$i"."$q"  down "
        fi
        }&
        let q=q+1        
    done    
    let   i=i+1
    q=1      ####将q的变量值从新赋值为1
done 
w=`cat /app/e.txt |wc -l`
echo "通的主机数为 :  $w"
y=`cat /app/w.txt |wc -l`
echo "不通的主机数为 :  $y"
rm -rf /app/w.txt /app/e.txt

案例4

要求:九九乘法表

#!/bin/bash
q=1
w=1
while [ $q -le 9 ];do
    while [ $w -le 9 ];do
        e=0
        let e=q*w   
        if [ $w -le $q ];then
        echo  -n "  $w*$q=$e  "
        fi
    let w+=1
    done
    let q+=1
    w=1
    echo
done

案例5

要求:利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值

#!/bin/bash
q=1
while [ $q -le 10 ] ;do
     echo $[RANDOM] &>> /app/o.txt
     #echo $[RAND0M] #每次随机都是新的值
    let q+=1    
done
cat /app/o.txt
w=`cat  /app/o.txt |sort -rn |tail -n1`
e=`cat /app/o.txt |sort -rn | head  -n 1`
echo "最大值: $e"
echo "最小值: $w"
rm -rf /app/o.txt

案例6

要求:国际象棋棋盘

[root@centos6mini 3.19]# cat 5,sh
#!/bin/bash
q=1
w=1
while [ $q -le 8 ]  ;do
    while [ $w -le 8 ] ;do
        if [ $[$[$q+$w]%2] -eq 0 ] ;then   ##判断句中的计算需要$[]括起来:
            echo -e "\033[47m  \033[0m\c"
        else
            echo -e "\033[41m  \033[0m\c"
        fi
    
    let w+=1
    done
    let q+=1
    w=1
    echo
done

案例7

要求:后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令:echo $RANDOM|md5sum|cut –c1-10 、后的结果,请破解这些字符串对应的RANDOM值

方法一:
#!/bin/bash
>6
while true ;do
        while true ;do
                w=`echo $RANDOM `  #定义变量--随机数随时在变化,给他赋值一个变量,后边取值就不在变化了
                q=`echo $w|md5sum|cut -c1-10`
                if [ $q == efbaf275cd  ] ;then
                        echo "efbaf275cd=$w" #>>6
                elif [ $q == 4be9c40b8b  ] ;then
                        echo "4be9c40b8b=$w" #>>6
                elif [ $q  == 44b2395c46  ] ;then
                        echo "44b2395c46=$w" #>>6
                elif [ $q == f8c8873ce0  ] ;then
                        echo "f8c8873ce0=$w" #>>6
                elif [ $q == b902c16c8b  ] ;then
                         echo "b902c16c8b=$w" #>>6
                elif [ $q == ad865d2f63 ] ;then
                         echo "ad865d2f63=$w" #>>6
                fi
        done
done
[root@centos6mini ~]# cat 6 |sort|uniq
44b2395c46=9000
4be9c40b8b=12000
ad865d2f63=1000
b902c16c8b=3000
efbaf275cd=15000
f8c8873ce0=6000

方法二:
#!/bin/bash
sum=0
for i in {1..32767};do
        num=`echo $i |md5sum | cut -c1-10`
        case $num in
                efbaf275cd|4be9c40b8b|44b2395c46|f8c8873ce0|b902c16c8b|ad865d2f63)
                        echo $i
                        let sum++
                ;;
        esac
        if [ $sum -lt 6 ];then
                continue
        else
                break
        fi
done

案例8

$#和$*区别

#!/bin/bash
while [ $# -gt 0 ];do    
    echo $*
    shift
done

#!/bin/bash
while [ $# -gt 0 ];do    
    echo $#
    shift
done

案例9

要求:依次创建指定的用户。如执行createuser.sh tom bob alice harry 

方法一:
#!/bin/bash
#!/bin/bash
while [ $# -gt 0 ]
do 
        id $1 &>/dev/null
        if [ $? -eq 0 ];then
                echo $1 is already exsit.
                shift
                continue
        fi
        useradd $1
        echo "$1 用户创建成功"
        shift
done

删除用户
#!/bin/bash
while [ $# -gt 0 ];do 
           userdel -r  $1
           echo "$1 用户删除成功"
           shift
done

方法二:
#!/bin/bash
while [ $# -gt 0 ];do
        id $1 &> /dev/null && { echo $1 is alread exist && shift && continue; }
        useradd $1 && echo  $1 is created
        shift
done

案例10

要求:每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本

#!/bin/bash
while true;do
if $(ps -au |grep "^hacker.*" &> /dev/null);then   #监测前台终端上有没有用户登陆信息
        echo $(ps -au |grep "^hacker.*" |tr -s " " |cut -d" " -f1,7,9) >> /var/log/login.log
            #将用户登陆信息保存到日志文件中/var/log/login.log
        break   #推出监测
else
        sleep 3s   #三秒已监测,防止程序太多占用cpu
fi
done

案例11

要求:随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出

#!/bin/bash
qe=$( echo $[$RANDOM%10] )  
while true ;do
read -p "请输入数值 :  " qw
        if  [ $qw -gt $qe   ] ;then
                echo "错误,大了"

        elif [ $qw -lt $qe   ] ;then
                echo "错了 ,小了"
        elif [ $qe -eq $qw  ];then
                echo "猜对了"
                break
        fi
done

案例12

要求:用文件名做为参数,统计所有参数文件的总行数

#!/bin/bash
sumhang=0
while [ $# -gt 0  ];do
        hang=$( cat $1 | wc -l  )
        let sumhang+=hang
        shift
done
echo $sumhang

案例13

要求:用二个以上的数字为参数,显示其中的最大值和最小值

方法一:
#!/bin/bash
min=$1  #最小值等于第一个数值
max=$1  #最大数等于第一个数值

while [ $# -gt 0 ];do   	 #进行数值数量进行判断,做循环
        value=$1     		#定义变量
        if [ $value  -gt $max ];then   		#当第二个数大于第一个数时
                max=$value  						#最大值等于后一个数值,对max从新赋与新的值
        elif [ $value -lt $min ];then    		#当第二个数大于第一个数时
                min=$value   					#最小值等于后一个数值 对min从新赋与新的值
        fi
        shift 			#不管前面判断是否成立,都进行数列左移,
done
echo "min $min"
echo "max $max"

方法二:
#!/bin/bash
if [ $# -lt 2 ];then  		#对输入数字数量进行检测
        echo "type more than two numbers"
        exit 1
fi
small=$(echo $* |xargs -n1 |sort -n |head -n 1)  			 #进行数值排序
big=$(echo $* |xargs -n1 |sort -n |tail -n 1)
echo "Maximum number is $big"
echo "Minimum number is $small"

案例14(read示例)

示例1:
while read -p "type your name: " name ;do  echo your is $n$name; done

示例2:
while read name ; do echo $name ;done  		# 没有指定输入

示例3:
while read name ; do echo $name ;done <6   		#name为变量,输入来自文件文件内容读取完了,循环停止

示例4:
要求:显示UID小于1000的为sys user,大于等于1000的为comm user。

#!/bin/bash
while read usline ;do  			#通过read ,定义变量值usline
        usuid=$(  echo $usline |cut -d: -f3 ) 			#引用变量usline ,并定义变量usuid
        usname=$( echo $usline |cut -d: -f1 )  		#引用变量usline ,并定义变量usname
        #if [ $usuid -lt 1000 ];then   		#进行判断
        if (( $usuid < 1000 )) ;then   	#进行判断(两种方式均可以)
                echo "$usname is a sys user"
        else 
                echo "$usname is a comm user"
        fi
done < /etc/passwd  				#每次循环引用文件内容一行,进行操作,引用完了,循环停止

案例15

要求:找出分区利用率大于10%的分区,并发出警告/dev/sdaX will be full: 15%要求使用while read来实现

方式一:
#!/bin/bash
df |grep /dev/sd > /app/fenqu
while read line;do
        used=$(echo $line |tr -s " " % |cut -d% -f5)
        name=$(echo $line |cut -d" " -f1)
        if (( $used > 10 ));then
                echo "$name will be full:$used%"
        fi
done < /app/fenqu

或者

while read line ;do
> used=$(echo $line |tr -s " " % |cut -d% -f5)
>  name=$(echo $line |cut -d" " -f1)
> if (( $used > 10 ));then
>  echo "$name will be full:$used%"
> fi
> done </app/zuoye/3.19/6
/dev/sda1 will be full:18%

方式二:
#!/bin/bash
> df_h
df -h | grep ^/dev/[sh]d* >> df_h
while read disk;do
    a=`echo $disk |grep -o "\<[0-9]\{0,3\}%" | cut -d% -f1`
    b=`echo $disk |grep -o "^[^[:space:]]\+\>"`
    if [ $a -gt 10 ];then
        echo "$b will be full: $a%"
    fi  
done < df_h

方式三:(sed实现)
#!/bin/bash
df |grep /dev/sd |while read disk;do
        diskused=$(echo $disk |sed -r 's/.* ([0-9]+)%.*/\1/')
        diskname=$(echo $disk |sed -r 's@(/dev/sd[[:lower:]][[:digit:]]).*@\1@')
        if (( $diskused > 10 ));then
                echo "$diskname will be full:$diskused%"
        fi
done

until循环

在这里插入图片描述
语法格式

until CONDITION; do 
              循环体    
done

执行机制

进入条件: CONDITION 为false 
退出条件: CONDITION 为true


循环控制语句continue
用于循环体中 
continue [N]:提前结束第N层的本轮循环,而直接进入下一 轮判断;最内层为第1层 
while CONDTIITON1; do 
      CMD1
       ... 
       if CONDITION2; then 
        continue 
         fi 
       CMDn

循环控制语句break
用于循环体中 
break [N]:提前结束第N层循环,最内层为第1层 
while CONDTIITON1; do 
    CMD1 
    ... 
    if CONDITION2; then 
            break 
    fi 
     CMDn
     ... 
done

循环控制shift命令
shift [n]
用于将参量列表 list 左移指定次数,缺省为左移一次。 
参量列表 list 一旦被移动,最左端的那个参数就从列表中删 除。while 循环遍历位置参量列表时,常用到 shift
./doit.sh a b c d e f g h 
./shfit.sh a b c d e f g h

特殊用法
**1、while循环的特殊用法(遍历文件的每一行): **

while read line; do 
        循环体
done < /PATH/FROM/SOMEFILE					

#依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将 行赋值给变量line

**2、双小括号方法,即((…))格式,也可以用于算术运算 双小括号方法也可以使bash Shell实现C语言风格的变量操作 **

for循环的特殊格式: for ((控制变量初始化;条件判断表达式;控制变量的修正表达 式)) 
do 
        循环体
done

#控制变量初始化:仅在运行到循环代码段时执行一次
#控制变量的修正表达式:每轮循环结束会先进行控制变量修 正运算,而后再做条件判

select循环与菜单

select variable in list
    do 
        循环体命令 
    done

#select 循环主要用于创建菜单,按数字顺序排列的 菜单项将显示在标准错误上,并显示 PS3 提示符, 等待用户输入 
#用户输入菜单列表中的某个数字,执行相应的命令 
#用户输入被保存在内置变量 REPLY 中
select与case 

select 是个无限循环,因此要记住用 break 命令退 出循环,或用 exit 命令终止脚本。也可以按 ctrl+c 退出循环 
select 经常和 case 联合使用 
与 for 循环类似,可以省略 in list,此时使用位置 参量
信号捕捉trap 
trap '触发指令' 信号 
            自定义进程收到系统发出的指定信号后,将执行触发指令 ,而不会执行原操作 
trap '' 信号 
            忽略信号的操作 
trap '-' 信号 
            恢复原信号的操作 
trap -p 
            列出自定义信号操作

文件测试

    -z string 测试指定字符是否为空,空着真,非空为假
    -n string 测试指定字符串是否为不空,空为假 非空为真    
    -e FILE 测试文件是否存在    
    -f file 测试文件是否为普通文件    
    -d file 测试指定路径是否为目录
    -r file 测试文件对当前用户是否可读
    -w file 测试文件对当前用户是否可写
    -x file 测试文件对当前用户是都可执行
    -z  是否为空  为空则为真    -a  是否不空
    -u  file :是否存在且拥有suid权限 
    -g  file :是否存在且拥有sgid权限 
    -k  file :是否存在且拥有sticky权限

[root@centos6mini 3.19]# [ -n ""  ]&& echo true   #空为假
[root@centos6mini 3.19]# [ -n "1"  ]&& echo true   #非空为真
true
[root@centos6mini 3.19]# [ -n "  "  ]&& echo true   #非空为真
true
[root@centos6mini 3.19]# [ -n   ]&& echo true    #非空为真
true
[root@centos6mini 3.19]# [ -z   ]&& echo true   #空为真
true
[root@centos6mini 3.19]# [ -z "" ]&&echo true  #空为真
true
[root@centos6mini 3.19]# [ -z "1" ] && echo true      "#非空为假
[root@centos6mini 3.19]# [ -z "  " ] && echo true      #非空为假

**3、扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填充用户名和单位电话为62985600,并提示该用户的GECOS信息修改成功。 **

#!/bin/bash
cat /etc/passwd |while read userline;do  #用管道实现给循环while赋值
        if [ -n "$(echo $userline |cut -d: -f5)" ];then    #-n "1" 非空为真
                continue     #为真时啥都不做
        else
                username=$(echo $userline|cut -d: -f1)
                usermod -c $username-62985600 $username
                echo $username\'s gecos already changed!
        fi
done

case语句

case 值 in
模式1)
    command1
    command2
    ;;
模式2)
    command1
    command2
    ;;
*)
	commandN
    ;;
esac

扩展print

printf("\033[47;31mhello world\033[5m");

47是字背景颜色, 31是字体的颜色, hello world是字符串. 后面的\033[5m是控制码.
颜色代码:
QUOTE:
字背景颜色范围: 40--49 字颜色: 30--39
40: 黑 30: 黑
41: 红 31: 红
42: 绿 32: 绿
43: 黄 33: 黄
44: 蓝 34: 蓝
45: 紫 35: 紫
46: 深绿 36: 深绿
47: 白色 37: 白色
ANSI控制码:
QUOTE:
\033[0m 关闭所有属性 
\033[1m 设置高亮度 
\03[4m 下划线 
\033[5m 闪烁 
\033[7m 反显 
\033[8m 消隐 
\033[30m -- \033[37m 设置前景色 
\033[40m -- \033[47m 设置背景色 
\033[nA 光标上移n行 
\03[nB 光标下移n行 
\033[nC 光标右移n行 
\033[nD 光标左移n行 
\033[y;xH设置光标位置 
\033[2J 清屏 
\033[K 清除从光标到行尾的内容 
\033[s 保存光标位置 
\033[u 恢复光标位置 
\033[?25l 隐藏光标 
printf的格式控制的完整格式:
% - 0 m.n l或h 格式字符
下面对组成格式说明的各项加以说明:
①%:表示格式说明的起始符号,不可缺少。
②-:有-表示左对齐输出,如省略表示右对齐输出。
③0:有0表示指定空位填0,如省略表示指定空位不填。
④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。
⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。v
格式字符
格式字符用以指定输出项的数据类型和输出格式。
①d格式:用来输出十进制整数。有以下几种用法:
			%d:按整型数据的实际长度输出。
			%md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
			%ld:输出长整型数据。
②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。
例:

main()

{int a = -1;

printf("%d,%o", a, a);

}
				运行结果:-1,177777
				程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。
③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。
④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。
⑤c格式:输出一个字符。
⑥s格式:用来输出一个串。有几中用法
				%s:例如:printf("%s","CHINA")输出"CHINA"字符串(不包括双引号)。
				%ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。
				%-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
				%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
				%-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。
⑦f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:
				%f:不指定宽度,整数部分全部输出并输出6位小数。
				%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。
				%-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。
⑧e格式:以指数形式输出实数。可用以下形式:
				%e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。
				%m.ne和%-m.ne:m、n和”-”字符含义与前相同。此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。
⑨g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零。

http://blog.51cto.com/12105235/2090749

猜你喜欢

转载自blog.csdn.net/qq_42345960/article/details/86562841