更多的结构化命令

2023-02-02  本文已影响0人  butters001
1. for 命令
for var in list
do
    commands
done

for var in list; do
    commands
done
2. 读取列表中的复杂值

如果列表中有单引号,解决方法:
1⃣️:将单引号转义
2⃣️:使用双引号来 定义包含单引号的值

原始列表
for item in I don't know if this'll work

处理后
for item in I don\'t know if "this'll" work

如果某个值包含空格,则必须将其放到双引号内:

for item in Nevada "New York" "New Mexico"

⚠️当你使用双引号引用某个值时,shell并不会将双引号当成值的一部分

3. 从变量中读取值列表
list="aa bb cc"
list=$list" dd"
for item in $list
do
    echo $item
done

⚠️第二行:这是向变量中已有的字符串尾部添加文本的一种常用方法

4. 从命令中读取值列表
cat test.txt
aa bb
cc
file="test.txt"
for item in $(cat $file)
do
    echo $item
done

输出:
aa
bb
cc
5. 更改字段分隔符

造成上述问题(aa bb输出不在同一行,但在txt文件里是在同一行保存的)的原因是特殊的环境变量 IFS(内部字段分隔符)
IFS 环境变量定义了 bash shell 用作字段分隔符的一系列字符。默认情况下,bash shell 会将下列字符视为字段分隔符:
1⃣️:空格
2⃣️:制表符
3⃣️:换行符
在脚本中临时更改 IFS 的方法:

IFS=$'\n'        # 只识别换行符
IFS=$':'         # 只识别冒号
IFS=$'\n:;"'     # 将换行符、冒号、分号和双引号作为字段分隔符
6. 使用通配符读取目录
for file in /home/jxc/*

也可以在 for 命令中列出多个目录通配符:

for file in /home/jxc/* /home/pmy/*
7. 仿 C语言的 for 命令
for (( i=1; i <= 10; i++ ))
do
    echo $i
done
8. 使用多个变量
for (( a=1, b=10; a <= 10;  a++, b-- ))
do
done

⚠️:只能在 for 循环中定义一种迭代条件(a<=10)

9. while 命令基本格式
while test command
do
done

while [ command ]
do
done

⚠️:test command 的退出状态码必须随着循环中执行的命令而改变,不然就会陷入死循环

10. 使用多个测试命令

⚠️:只有最后一个测试命令的退出状态码会被用于决定是否结束循环

var=10

while echo $var
      [ $var -ge 0 ]
do
    var=$[ $var - 1 ]
done
11. until 命令

until 命令与 while 命令相反,只有(最后一个命令的)退出状态码不为0,就会继续执行循环。
换种说法:(最后一个命令的)退出状态码为0时,会结束循环。

12. 循环控制-break命令

break 命令会跳出当前循环。

break 命令接受单个命令行参数:break n
默认 n=1,表明跳出的是当前循环。如果将n设为2,那么break命令就会停止下一级的外层循环。

13. 循环控制-continue命令

continue 命令会结束本次循环,进入下一次循环。

同理continue n
当 n=2 时,会直接进入外层的下一次循环。

14. 处理循环的输出

可以对循环的输出使用管道或进行重定向

for file in /home/jxc/*
do
    echo $file
done > output.txt

for file in /home/jxc/*
do
    echo $file
done | sort

input="users.csv"
while IFS=',' read -r loginname name
do
    echo $loginname
done < "$input"
上一篇下一篇

猜你喜欢

热点阅读