执行流就是在脚本记录中记录的命令执行的顺序 当前脚本的执行是从上到下依次执行
1.for语句
作用:为循环执行动作
for语句结构
? for?? ??? ??? ?定义变量 ? do?? ??? ??? ?使用变量,执行动作 ? done?? ??? ?结束标志
for语句的基本格式
格式1:直接赋值 ? for WESTOS in westos linux lee ? do ????????? echo $WESTOS ? done
?
? 格式2:列表赋值 ? for WESTOS in {10..1} ? do ????? echo $WESTOS ? done
?
格式3:命令赋值
? for WESTOS in `(seq 1 2 10)` ? ? do ?????? echo $WESTOS ? done
?
脚本练习 host_list.sh
检测172.25.254.34-172.25.254.44网络是否开启 如果网络正常请生成解析列表hosts_list
for NUM in {34..44} do ? ping -c1 -w1 172.25.254.$NUM &> /dev/null &&{ ?echo 172.25.254.$NUM is up ? }||{ ? echo 172.25.254.$NUM is down ? } done
?
?
?
user.sh 如果后面没有文件报错,如果文件存在,检测文件中的用户列表是否存在,如果存在则提示用户存在,如果不存在,建立用户。 ?[ -z "$1" ] && { ?? echo Error "Please input userlist" ?? exit ?} ? [ ! -e "$1" ] && { ?? echo Errow " list is not exist " ?? exit ?} ? for USER in `cat $1` ?do ?? id $USER &> /dev/null &&{ ???? echo $USER is exist ?? }||{ ?? useradd $USER ?? echo $USER is created ?? } ? done
?
脚本练习:
sh num.sh????? n?????
n代表数字,当数字为5时输出luck number,当数字为4时输出bad number,当为其他数字时输出common number'
?
?
2.条件语句
?while...do语句
?作用:条件为真执行动作
语句结构
? while true?? ?<!--条件为真--> ? do?? ??? ?<!--条件成立所作循环动作-->
? done?? ??? ?<!--结束-->
until...do 语句
作用:条件为假执行动作
语句结构
? until false?? ? <!--条件为假--> ? do?? ??? ? <!--条件不成立所作循环动作-->
? done?? ? ?? ? <!--结束-->
if...then...elif...then...else...fi 语句
作用:多次判定条件执行动作
?代码结构
? if?? ??? ??? ??? ??? ?<!--首次判断定--> ? then?? ??? ??? ??? ??? ?<!--条件成立执行动作--> ? elif?? ??? ??? ??? ??? ?<!--当首次判定不成立时再次判定--> ? then?? ??? ??? ??? ??? ?<!--条件成立执行动作--> ? ...?? ??? ??? ??? ??? ?<!--elif可以书写多次--> ? else?? ??? ??? ??? ??? ?<!--所有条件不成立执行动作--> ? fi?? ??? ??? ??? ??? ?<!--结束-->
脚本练习:
??? ?check_file.sh ??? ?please input filename: file ??? ?file is not exist ??? ?file is file ??? ?file is direcory ??? ?此脚本会一直询问直到用户输入exit为止
while true do ? read -p "Please input filename:" FILENAME ? if [ "$FILENAME" = "exit" -o "$FILENAME" = "exit" ] ? then ?? echo bye ?? exit ?elif [ ! -e "$FILENAME" ] ? then ? echo $1 is not exist ?elif [ -L "$FILENAME" ] ? then ? echo $1 is link file ?elif [? -f "$FILENAME" ] ? then ? echo $1 is common file ?elif [? -d "$FILENAME" ] ?then ?echo $1 is directory fi done
?
if 对于信息选择过程中,用判定选择信息效率很低 case 选择语句在对于选择信息判定时具有评定执行过程,对于选择条件的执行只需要判定一次即可 ?11 #!/bin/bash ?if [ "$1" = "linux" ] ?then ?? echo westos ?elif [ "$1" = "westos" ] ?then ?? echo redhat ?elif [ "$1" = "redhat" ] ?then ?? echo linux ?else ?? echo error ?fi
?case $1 in ?? linux) ?? echo westos ?? ;; ?? westos) ?? echo redhat ?? ;; ?? redhat) ?? echo linux ?? ;; ?? *) ?? echo error ?esac
?
3.case
case $1 in ?? ?word1|WORD1) ?? ?action1 ?? ?;; ?? ?word2|WORD2) ?? ?action2 ?? ?;; ?? ?*) ?? ?action3 esac
脚本练习 判断输入的用户是否存在,如果输入exit则退出,如果用户存在,输入add提示用户存在,返回到用户的添加,输入del删除用户,返回到action。如果用户不存在,add添加用户,提示用户输入密码,把密码赋值给创建的用户,输入del则提示用户不存在,返回到用户的删除,命令结束返回到action????????????? ? ?#!/bin/bash ?USER_CTRL() ? { ?? read -p "Please input username: " USER ???? if [ "$USER" = "exit" ] ???? then ?????? break ????? else ???? id $USER &> /dev/null && { ?????? case $1 in ???????? add) ???????? echo "$USER id exist" ???????? USER_CTRL add ???????? ;; ???????? del) ???????? userdel -r $USER ?????? esac ???? }||{ ?????? case $1 in ?????? add) ????? read -p "Please input password:" PASS ?????? useradd $USER ?????? echo $PASS | passwd --stdin $USER ?????? ;; ?????? del) ?????? echo "$USER is not exist" ?????? USER_CTRL del ???? esac ???? } ???? fi ?} ?while true ?do ?read -p "Please input action: " ACTION ???? case $ACTION in ???? exit) ???? exit ???? ;; ???? add) ???? USER_CTRL add ???? ;; ???? del) ???? USER_CTRL del ???? ;; ???? *) ???? echo wrong action ???? esac ?done
?
?
?
4.expect
dnf install expect -y?? ??? ?#必须先下载expect expect eof? ??? ??? ??? ?#问题回答完毕后退出expect interact?? ??? ?c?? ?#问题回答完毕后保留expect环境 expect eof和interact两个结尾参数只能二选一 因为应答脚本需要调用问题脚本所以需要给问题脚本执行权利
问题脚本 #!/bin/bash read -p "what's your name:" NAME read -p "How old are you: " AGE read -p "Which objective: " OBJ read -p "Are you ok? " OK
echo $NAME is $AGE\'s old study $OBJ feel $OK
exp_continue ?? ?#表示继续应答问题,最后一个问题必须存在,最后一个问题不需要exp_continue
?
应答脚本 应答脚本后通常需要恢复多个问题,输入多串字符 lindex $argv 0?? ?#脚本后跟的第一串字符 lindex $argv 1?? ?#脚本后跟的第二串字符 lindex $argv 2?? ?#脚本后跟的第三串字符 lindex $argv 3?? ?#脚本后跟的第四串字符 \r?? ??? ?#表示回车
#!/usr/bin/expect set timeout 1 set NAME [ lindex $argv 0 ] set AGE? [ lindex $argv 1 ] set OBJ?? ? [ lindex $argv 2 ] set FEEL [ lindex $argv 3 ] spawn /mnt/ask.sh?? ?#匹配问题文件 expect { ?? ?"name"?? ??? ?{ send "$NAME\r";exp_continue } ?? ?"old"?? ??? ?{ send "$AGE\r";exp_continue } ?? ?"objective"?? ?{ send "$OBJ\r";exp_continue } ?? ?"ok"?? ??? ?{ send "$FEEL\r" } } expect eof
?
脚本练习check_host.sh ip 检测输入的IP是否开启,如果网络正常请输出主机名称
?Auto_Ssh() ?{ ?/usr/bin/expect <<EOF ?spawn ssh -l root $1 hostname ?expect { ?"yes/no" { send "yes\r";exp_continue } ?"password:" {send "westos\r"} ?} ?expect eof ?EOF ?} ?[ -z "$1" ] && { ?? echo "Please input check ipaddress" ?? exit ?} ?ping -c1 -w1 $1 &> /dev/null && { ??? Auto_Ssh $1 | tail -n 1 ?}||{ ?? echo $1 is down ?} ?????? ?
?
5.break,continue,exit
continue?? ?#终止当此次前循环提前进入下个循环 break?? ??? ?#终止当前所在语句所有动作进行语句外的其他动作 exit?? ??? ???? #脚本退出
?
?
?
?
?
6.显示退出值
$??? ??? ?#表示退出值,退出值为0表示命令无任何报错,退出值非0表示有相应报错,退出值可以设定,exit 66 ,退出值的范围为0~255
?
?
?
练习:书写脚本计算当前cpu总占用率是多少 echo "`ps ax -o %cpu | awk 'BEGIN{N=0}!/0.0|%cpu/{N+=$1}END{print N}'`%"
|