シェルスクリプトのループステートメントとエスケープ文字を密かに学ぶ

繰り返しのタスクのリストに直面すると、ifステートメントはニーズを満たすのが難しく、順番に書くのに非常に時間がかかります。現時点では、この問題を解決するためにループステートメントを使用する必要があります。

1つ、forループステートメント

  • forステートメントは、変数と値のリストを定義し、異なる値に従って同じコマンドを実行し、変数の値が使い果たされていることを認識する必要があります。
  • 値リストには、IPアドレス、アドレス帳など、同じ属性を持つ複数のオブジェクトが含まれています。
#for语句结构
for 变量名 in 取值列表
do
  命令序列
done

ここに画像の説明を挿入

示例1:for循环的入门,一般都是从求和开始,下面就先就1~100的和。
#!/bin/bash
#
sum=0
for i in {
    
    1..100}
do
    sum=$[$i+$sum]
done
  echo "0-100的和为:" $sum

#如果算的是1~100之间每个两位数的和,即{1、3、5、7、...、99},for循环如下: 
for i in {
    
    1..100..2}
#其他都是一样的。

ここに画像の説明を挿入
ここに画像の説明を挿入

语句示例补充:下面是求1~100的和的不同表达。(都测试过,这里就不再贴图了,想试的可以复制试试)
格式一:
#!/bin/bash
#
sum=0
for i in $(seq 1 100)      #{1、3、5、...、99}相加为$(seq 1 2 100) 
do
    sum=$[$i+$sum]
done
  echo "0-100的和为:" $sum
格式二:  
#!/bin/bash
#
sum=0
for ((i=1;i<=100;i++))     #隔一个相加, for ((i=1;i<100;i+=2))
do
    sum=$[$i+$sum]
done
  echo "0-100的和为:" $sum
示例2:批量添加用户,用户名存放在users.txt文件中,每行一个;初始密码均设为123456
#!/bin/bash
#
a=`cat ~/test/users.txt`
for i in $a
do
  useradd $i
  echo "123456" | passwd --stdin $i &>/dev/null
done

ここに画像の説明を挿入

示例3:根据IP地址检查主机状态;IP地址存放在ipadds.txt文件中,每行一个;
#!/bin/bash
#
a=`cat ~/test/ipadds.txt`

for i in $a
do
  ping -c 3 -i 0.5 -W 2 $i &>/dev/null
  if [ $? -eq 0 ];then
    echo "$i 主机在线"
  else
    echo "$i 主机不在线"
  fi
done

ここに画像の説明を挿入

2、whileループステートメント

  • 一連のコマンドは、条件が満たされないまで、特定の条件に従って繰り返し実行されます。
  • これが発生しないように、書き込み時に無限ループが発生する可能性があります
  • true(true)およびfalse(false)は特別な条件テスト操作であり、ifステートメントの条件テストでも使用できます。
    • trueを条件として使用する場合、条件は常に無期限に確立および実行されることを意味します。つまり、強制終了を必要とする無限ループです。
    • falseを条件として使用した場合、条件が確立されておらず、コマンドシーケンスが実行されていないことを意味します。
#while语句结构
while 条件测试操作
do
  命令序列
done

ここに画像の説明を挿入

示例1:批量添加用户; 用户名称以stu开头,按数字顺序进行编号; 
一共添加20个用户,即stu1、stu2、......、stu20 
初始密码均设为123456
#!/bin/bash
#
i=1
while [ $i -le 20 ]
do
  useradd stu$i
  echo "123456" | passwd --stdin $i &>/dev/null
  let i++
done

ここに画像の説明を挿入

示例2:猜商品价格游戏;通过变量RANDOM获得随机数;提示用户猜测并记录次数,猜中后退出循环
#我这里还加了if语句填了一点其他元素。
#!/bin/bash
#
a=$(expr ${
     
     RANDOM} % 1000)
i=0
while true
do
  read -p "猜猜看我想的是哪个数,范围在0~999。" shu
  let i++
  if [ $shu -eq $a ];then
      if [ $i -le 10 ];then
        echo "太强了,你猜了$i 次就猜中了,可惜没得奖励。"
      else
        echo "猜了$i 次才猜中,你还差的远呢" 
      fi
    exit 0
  elif [ $shu -lt $a ];then
        if [ $(expr $a - $shu) -le 5 ] ;then
          echo "虽然数小了,但已经很近了,你在想想"
        else
          echo "不好意思,猜的太小了"
        fi
  else
       if [ $(expr $shu - $a) -le 5 ];then
         echo "虽然数大了,但已经很近了,你在考虑考虑"
       else
         echo "不好意思,猜大了,数再小点"
       fi
  fi
done

ここに画像の説明を挿入
ここに画像の説明を挿入

3、untilループステートメント

  • whileとは逆に、特定の条件を繰り返しテストし、条件が確立されない限り繰り返し実行します。
  • 一般的には上手に使えますが、めったに使われません。
    ここに画像の説明を挿入
示例:计算1~50的和值;通过循环累加的方式计算1~50的和值
  
#!/bin/bash
#
a=0
sum=0
until [ $a -gt 100 ]
do
  sum=$[$sum+$a]
  let a++
done
echo "1-100的和为:$sum"

ここに画像の説明を挿入

第四に、ループブレークを終了して続行します

  • 単一のループから抜け出す
#!/bin/bash
for ((a=1; a<=5; a++))
do
	echo "outer loop: $a"
	for ((b=1; b<=50; b++))
	do
		if [ $b -eq 5 ]
		then
			break
		fi
		echo "inter loop: $b"
	done
done

ここに画像の説明を挿入

  • ループ内でコマンドを中止し続けますが、コマンド全体を完全に中止するわけではありません
#!/bin/bash
for ((a=1; a<=15; a++))
do
	if [ $a -gt 5 ] && [ $a -lt 10 ]
	then
		continue
	fi
	echo "current value: $a"
done

ここに画像の説明を挿入

5. IFSフィールドセパレーター(補足)

默认包含 空格,制表符,换行符
查看命令:set | grep IFS
IFS=$' \t\n'

修改成只换行
IFS=$'\n'

IFS=:
IFS=','

IFS.OLD=$IFS
IFS=$'\n'
...
IFS=$IFS.OLD

输出环境变量PATH所包含的所有目录以及其中的所有可执行文件

ここに画像の説明を挿入

6、エスケープ文字

echo -n 表示不换行输出

echo -e 输出转义字符,将转义后的内容输出到屏幕上

常用的转义字符如下:
\b 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一个字符,"\b\b"表示删除前两个字符。

\c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。

\n 换行,被输出的字符从"\n"处开始另起一行。

\f 换行,但是换行后的新行的开头位置连接着上一行的行尾;

\v 与\f相同;

\t 转以后表示插入tab,即横向制表符;

\r 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖

\\ 表示插入"\"本身;
  • -nデモ:
    ここに画像の説明を挿入
  • echo -e "\ b"の使用法
    ここに画像の説明を挿入
    ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_51326240/article/details/111361438