[Linuxスタディノート31]シェル実行フロー(for、while、until、if、case、expect、break、continue、exit)

1.forループ


格式:
for 变量 in item1 item2 … itemN
do
  语句1
  语句2
done


写成一行:
for 变量 in item;do 语句1;语句2 done;


forステートメントは、4つの形式の変数を定義します

for var in $(seq 起点 终点 步长)
for var in 1 2 3 ... 10
for var in{
    
    1..10}
for((var=0;var<10;var++))
#无限循环
for (( ; ; ))

演習1:

スクリプト:check_host.sh
は、10個のホストと現在のホストがホストに直接接続されているかどうかを検出します。ブロックされていない場合は、ホストIPリストが表示されます。


#!/bin/bash
for i in {
    
    1..10}
do
	ping -c1 -w1 172.25.254.$i &> /dev/null && {
    
    
		echo " 172.25.254.$i tongchang !"
	} 
done

ここに写真の説明を挿入

演習2:

スクリプトcreate.sh

  1. ユーザーを自動的に作成する
  2. スクリプトの後にユーザー名ファイルとパスワードファイルを追加します
  3. ユーザーファイル内のユーザーが存在するかどうかを自動的に検出し、存在しない場合は自動的に作成します。パスワードは、対応するパスワードファイルの内容です。

#!/bin/bash
length=`sed -n '$=' user_file`
for LINE in `seq 1 $length`
do
	uName=`sed -n ${
     
     LINE}p $1`
	uPass=`sed -n ${
     
     LINE}p $2`
	id $uName &> /dev/null && {
    
     
		echo "$uName is exist !"
	} || {
    
    
			useradd $uName
			echo $uPass | passwd --stdin $uName &> /dev/null 
			echo "$uName is created !"
		}
done

ここに写真の説明を挿入

ここに写真の説明を挿入



2. Whileループ(条件は真)


while 条件
do
  语句1
  语句2
done


無限ループフォーマット1:

while true
do
  语句
done


無限ループフォーマット2:

while :
do
  语句
done


3.ループまで(条件はfalse)


untilループは、条件が真になって停止するまで一連のコマンドを実行します。
untilループとwhileループは逆の方法で処理されます。
通常、whileループはuntilループよりも優れていますが、場合によっては、まれなケースでのみ、untilループの方が便利です。


until 条件
do
  语句1
  语句2
done


4.もし


if 条件
then
  语句
elif 条件
then
  语句
else
  语句
fi


(elseブランチに実行するステートメントがない場合は、これをelseに記述しないでください)

演習1:

check_file.sh
は、ファイルが存在するかどうかを検出し、ファイルタイプを判別します


#!/bin/bash
while true
do
	read -p "Please input filename:" fileName
	
	if [ "$fileName" == "exit" ]
	then
		exit
	fi

	if [ -e "$fileName" ]
	then
		if [ -f "$fileName" ]
		then
			echo "$fileName is 普通文件 ! "
		elif [ -d "$fileName" ]
		then
			echo "$fileName is 目录 ! "
		elif [ -S "$fileName" ]
		then
			echo "$fileName is 套接字 ! "
		elif [ -L "$fileName" ]
		then
			echo "$fileName is 软链接 ! "
		elif [ -b "$fileName" ]
		then
			echo "$fileName is 块设备 ! "
		elif [ -c "$fileName" ]
		then
			echo "$fileName is 字符设备 ! "
		fi
	else
		echo "$fileName is not exist !"
	fi

done

ここに写真の説明を挿入



5.ケース


caseステートメントは複数選択ステートメントです。caseステートメントを使用して、値とパターンを照合できます。照合が成功した場合は、matchedコマンドを実行します。


casein
模式1)
  语句
  ;;
模式2)
  语句
  ;;
*)
  语句
  ;;
esac


( " *) "は他の状況を示します)


運動:

ディスクまたはメモリを追加するか、system_watch.shの後にアップロードし、次のように実行します。

  1. ディスクモニターディスク使用量
  2. メモリモニターメモリ使用量
  3. モニターのアップロード開始ロード
  4. 1秒あたりの表示

#!/bin/bash
while true
do
	[ "$1" = "exit" ] && {
    
    
		exit
		}
	case $1 in
	disk|DISK)
		watch -n 1 "df -h "
		exit
		;;
	memory|MEMORY)
		watch -n 1 "free -m"
		exit
		;;
	upload|UPLOAD)
		watch -n 1 "uptime"
		exit
		;;
	esac
done


6.自動会話を期待する


dnf install expect -y:インストール期待

質問スクリプト: ask.sh(実行許可を与える)

#!/bin/bash
read -p "What's your name: " NAME
read -p "How old are you: " AGE
read -p "which class? " CLASS
read -p "How do you feel? " FEEL
echo $NAME is $AGE\'s old study $CLASS fell $FEEL

回答スクリプト1: answer.exp

#!/usr/bin/expect
spawn /mnt/ask.sh
expect "name"
send "tom\r"
expect "old"
send "18\r"
expect "class"
send "linux\r"
expect "feel"
send "happy\r"
expect eof


回答スクリプト2: answer.exp

#!/usr/bin/expect
set timeout 2
spawn /mnt/ask.sh

expect {
    
    
"name" {
    
     send "tom\r"; exp_continue }
"old" {
    
     send "18\r"; exp_continue }
"class" {
    
     send "linux\r" ; exp_continue }
"feel" {
    
     send "happy\r" }
}
expect eof


回答スクリプト3: answer.exp

#!/usr/bin/expect
set NAME [ lindex $argv 0 ]
set AGE [ lindex $argv 1 ]
set CLASS [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]

set timeout 2
spawn /mnt/ask.sh

expect {
    
    
"name" {
    
     send "$NAME\r" ; exp_continue }
"old" {
    
     send "$AGE\r" ; exp_continue }
"class" {
    
     send "$CLASS\r" ; exp_continue }
"feel" {
    
     send "$FEEL\r" }
}
expect eof


回答スクリプト4: answer.sh

#!/bin/bash
echo hello zy !
/usr/bin/expect <<EOF
set timeout 2
spawn /mnt/ask.sh

expect {
"name" { send "$1\r" ; exp_continue }
"old" { send "$2\r" ; exp_continue }
"class" { send "$3\r" ; exp_continue }
"feel" { send "$4\r" }
}
expect eof
EOF


運動:

host_list.sh
は、172.25.254.1-172.25.254.10ネットワークが正常にオンになっているかどうかを検出します。ネットワークが正常な場合は、解決リストhost_listを生成してください。


#!/bin/bash
EXPECT()
{
    
    
/usr/bin/expect <<EOF
set timeout 2
spawn ssh root@$1 hostname
expect {
"yes/no?" { send "yes\r" ;
    expect "password:" ;
    send "$2\r";
    exp_continue; }
"password:" { send "$2\r" }
}
expect eof
EOF
}

for i in {
    
    1..10}
do
    ping -c1 -w1 172.25.254.$i &> /dev/null
    if [ "$?" = "0" ]
    then
        host_name=`EXPECT 172.25.254.$i westos | tail -n 1`
        grep $host_name /mnt/host_list &> /dev/null || {
    
    
            echo "172.25.254.$i $host_name" >> /mnt/host_list
        }
    fi  
done
sed 's/^M//g' -i /mnt/host_list
#^M为<ctrl>+<V>+<M>

ここに写真の説明を挿入



7.ループから抜け出します(中断して続行して終了します)


ブレーク:すべてのループからジャンプできるようにする(実行後にすべてのループを終了する)

継続する:すべてのループから飛び出すのではなく、現在のループから飛び出すだけです

出口:脱落

おすすめ

転載: blog.csdn.net/weixin_46069582/article/details/111416105