記事ディレクトリ
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
- ユーザーを自動的に作成する
- スクリプトの後にユーザー名ファイルとパスワードファイルを追加します
- ユーザーファイル内のユーザーが存在するかどうかを自動的に検出し、存在しない場合は自動的に作成します。パスワードは、対応するパスワードファイルの内容です。
#!/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コマンドを実行します。
case 值 in
模式1)
语句
;;
模式2)
语句
;;
*)
语句
;;
esac
( " *) "は他の状況を示します)
運動:
ディスクまたはメモリを追加するか、system_watch.shの後にアップロードし、次のように実行します。
- ディスクモニターディスク使用量
- メモリモニターメモリ使用量
- モニターのアップロード開始ロード
- 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.ループから抜け出します(中断して続行して終了します)
ブレーク:すべてのループからジャンプできるようにする(実行後にすべてのループを終了する)
継続する:すべてのループから飛び出すのではなく、現在のループから飛び出すだけです
出口:脱落