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"