条件判断
if 条件1;then
COMMAND
elif 条件2;then
COMMAND
else
COMMAND(:) : 表示pass 不执行任何命令
fi
读取用户输入在进行数据判断
1 echo -n "输入你的数字: " 2 read userinput 3 expr $userinput+ 0 &>/dev/null 4 if [ $? -ne 0 ]; then 5 echo "必须输入数字!" 6 continue 7 else 8 COMMAND 9 fi
case 变量引用 in
PAT1)
分支1
;;
esac
变量名和变量引用的区别: 变量引用就是需要在变量名前面添加一个$, name表示变量名 $name表示变量引用
并行执行shell命令 wait的作用是表示后台命令执行完毕后退出程序,默认后台程序结束后需要手动敲回车键才能退出程序
1 net=172.17.51 2 for i in {1..254};do 3 { if ping -c1 -w1 $net.$i &> /dev/null ;then 4 echo $net.$i is up 5 else 6 echo $net.$i is down 7 fi; } & 8 done 9 wait
循环
for循环
for(( exp1; exp2; exp3 )); do COMMANDS; done
exp1 是循环的初始化语句 实际上不参与循环
exp3 相当于循环体中的最后一条语句
exp2 为循环条件的判断语句 每次执行循环体之前都必须先判断exp2的执行结果
1 #!/bin/bash 2 declare -a array 3 for((i=1;i<=10;i++)) 4 do 5 array[$i]=$((RANDOM%100)) 6 done 7 8 MIN=${array[1]} 9 MAX=${array[1]} 10 11 for num in ${!array[@]};do 12 echo $((array[${num}])) 13 if [[ ${MIN} -ge ${array[${num}]} ]];then 14 MIN=${array[${num}]} 15 fi 16 if [[ ${MAX} -le ${array[${num}]} ]];then 17 MAX=${array[${num}]} 18 fi 19 20 done 21 echo "the min is $MIN" 22 echo "the max is $MAX"
1 #!/bin/bash 2 declare -i min max 3 declare -a nums 4 for((i=0;i<10;i++));do 5 nums[$i]=$RANDOM 6 [ $i -eq 0 ] && min=${nums[$i]} && max=${nums[$i]} && continue 7 [ ${nums[$i]} -gt $max ] && max=${nums[$i]} 8 [ ${nums[$i]} -lt $min ] && min=${nums[$i]} 9 done 10 echo "all numbers are ${nums[*]}" 11 echo Max is $max 12 echo Min is $min
1 #!/bin/bash 2 re=`wc -l $1 | cut -d " " -f1` 3 echo $re
continue和break
continue 和 break 后面可以添加一个数字N,表示提前结束第N层的本轮循环从而直接进入下一轮的判断,最内层的循环为第1层
continue 2 or break 3
循环控制shift命令
将参数列表向左移动,默认移动单位为1,移动后的参数会自动被删除.使用的场景:配合循环遍历逐个处理提供给执行脚本的位置参数
while循环的特殊用法
循环遍历文件或者命令的标准输出
1 df | while read line;do 2 echo $line 3 done; 4 5 while read line;do 6 echo $line 7 done < /root/file
select循环与菜单
select variable in list
do
循环体命令
done
select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在 标准错误上,并显示 PS3 提示符,等待用户输入
用户输入菜单列表中的某个数字,执行相应的命令
用户输入被保存在内置变量 REPLY 中
信号捕捉trap
trap '触发指令' 信号 自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作
trap '' 信号 忽略信号的操作
trap '-' 信号 恢复原信号的操作
使用 kill -l 查看所有能捕捉的信号数据
trap "echo press ctrl+c" 2
kill -9 的信号无法被捕捉到
[root@iz2ze6e5pr6sbu9qxhzulaz ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
父 shell 子 shell export 与 变量传递
一般而言,在一个脚本里执行一个外部命令(普通的可执行文件)时,shell 会 fork 出一个子进程,然后再用 exec 来执行这个程序;但是,bash shell 的内置命令(builtin)却不会这样,它们是直接执行的。所以,等价的内置命令的执行速度会比执行外部命令要来的快
子 shell 对父 shell 里 export 出来的变量进行修改并不能影响到父 shell。这说明了,子 shell 只是在“导出变量列表“里对该变量进行了一个拷贝
子shell中export 出来的变量不能导出到父进程或者是父进程的环境里。一个自己称可以继承父进程的东西,而不能反过来去影响父进程
父子shell中的变量交换本质上是利用进程之间的通信方式来实现的
1 #!/bin/bash 2 rm -f tmp.txt 3 df -h |grep '^/dev*' | while read line;do 4 name=`echo $line | cut -d" " -f1` 5 data=`echo $line | cut -d" " -f5` 6 echo $name-$data >> tmp.txt 7 done 8 9 declare -A arr 10 while read line;do 11 key=${line%-*} 12 value=${line#*-} 13 arr[$key]=$value 14 done < tmp.txt 15 16 echo ${!arr[@]} 17 echo ${arr[@]} 18 19 20 21 22 [root@centos7 ~]# bash whiledf.sh 23 /dev/sda1 /dev/sda3 /dev/sda2 24 20% 1% 9%
关于export
1.一个shell中的系统环境变量会被复制到子shell中(用export定义的变量);
2.一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。
3.不用export定义的变量只对该shell有效,对子shell也是无效的。
shell执行机制
用户登录到Linux系统后,系统将启动一个用户shell.在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序.
shell执行外部命令或运行shell脚本程序时,系统将创建一个子shell,然后在子Shell中执行此Shell脚本
一旦子Shell中的脚本执行完毕,此子Shell随即结束,返回到父Shell中,但不会影响父Shell原本的环境