什么是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格式中较短的一种输出,且不输出无意义的零。