目录
if...then...elif...then...else...fi 语句
作用:为循环执行动作
for语句结构
for //定义变量
do //使用变量,执行动作
done //结束标志
for语句的基本格式
格式1:
- for WESTOS in `seq 2 2 10`
- do
- echo $WESTOS
- done

格式2:
- for WESTOS in 1 2 3
- do
- echo $WESTOS
- done

格式3:
- for WESTOS in {10..1}
- do
- echo $WESTOS
- done

格式4:
- for ((WESTOS=0;WESTOS<10;WESTOS++))
- do
- echo $WESTOS
- done

练习
- for name in 10 20 30
- do
- ping -c1 -w1 192.168.81.$name &> /dev/null && echo 192.168.81.$name is up ||echo 192.168.81.$name is down
- done

- while ture //条件为真
- do //条件成立所做循环动作
-
- done //会一直判断循环
- until false //条件为假
- do //条件不成立所做循环动作
-
- done
作用:多次判定条件执行动作
- if //首次判断定
- then //条件成立执行动作
- elif //当首次判定不成立时再次判定
- then //条件成立执行动作
- ... //elif可以书写多次
- else //所有条件不成立执行动作
- fi // 结束
脚本练习:
- while true
- read -p "please input filename: " FILENAME
- do
- if [ "$FILENAME" = "exit" ]
- then
- echo exit
- exit
- elif [ ! -e "$FILENAME" ]
- then
- echo $FILENAME is not exist
- elif [ -f "$FILENAME" ]
- then
- echo $FILENAME is file
- elif [ -d "$FILENAME" ]
- then
- echo $FILENAME is directory
- fi
- done

执行效率更高
- case $1 in
- word1|WORD1)
- action1
- ;;
- word2|WORD2)
- action2
- ;;
- *)
- echo error
- esac

需安装expect
问题脚本
- 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

应答脚本
- #!/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 sh /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

将expect该为shell
- #!/bin/bash
- expect(){
- /usr/bin/expect <<EOF
- spawn $5
- expect {
- "name" { send "$1\r";exp_continue }
- "old" { send "$2\r";exp_continue }
- "objective" { send "$3\r";exp_continue }
- "ok" { send "$4\r" }
- }
- expect eof
- EOF
- }
- expect su 12 shell ok "sh /mnt/ask.sh"

脚本练习
- AUTO_SSH(){
- /usr/bin/expect <<EOF
- spawn ssh -l root 192.168.81.$1 $2
- expect {
- yes/no {send "yes\r";exp_continue}
- password {send "shg12345\r"}
- }
- expect eof
- EOF
- }
-
- if [ -e "/mnt/hosts" ]
- then
- mv /mnt/hosts /mnt/hosts-`date +%T`
- fi
-
- for ID in 10 11 12
- do
- ping -c1 -w1 192.168.81.$ID &> /dev/null && {
- echo -e "192.168.81.$ID\t`AUTO_SSH $ID hostname | tail -n 1 `" >> /mnt/hosts
- }
- done
-
- for ID in 10 11 12
- do
- ping -c1 -w1 192.168.81.$ID &> /dev/null && {
- AUTO_SSH $ID "scp /mnt/hosts root@192.168.81.$ID:/mnt"
- }
- done
- if [ -z "$1" ]
- then
- echo please input userlist following $0
- elif [ ! -e "$1" ]
- then
- echo $1 is not exist
- else
- for name in `cat $1`
- do
- useradd $name && echo $name is createed
- done
- fi
- cobreak:用于提前退出循环。当在循环中遇到break语句时,循环会立即终止,程序会在循环之后继续执行。
-
- continue:用于跳过当前循环的迭代并进入下一次迭代。当在循环中遇到continue语句时,代码将跳过对当前迭代的剩余语句,进入下一次迭代。
-
- exit:用于提前终止程序。当遇到exit语句时,程序会立即停止执行并退出。
-
- return:用于提前退出函数并将值返回给调用者。当在函数中遇到return语句时,函数将立即终止并返回指定的值给调用者。

