如何在sh脚本的for循环中同时使用多个变量?
在Bash的for循环中同时使用多个变量
你尝试的for x y z in $(...)写法无法达到预期效果,因为Bash会把$(...)的输出按所有空白字符(空格、制表符、换行)拆分成独立元素,循环时会逐个遍历这些元素,而非把每行的三个字段分别赋值给x、y、z。
下面是几种正确实现的方式:
方法一:使用while read循环(推荐)
read命令支持一次性读取多个变量,每行的字段会按顺序赋值给对应的变量:
top -n 1 -b -c | awk -vOFS="\t" '{print $1,$2,$9}' | while read -r x y z do echo "output: $x $y $z" done
-r选项用于避免read解析转义字符,保证原始内容被正确读取。- 每行的三个制表符分隔字段会分别赋值给
x、y、z,循环处理每一行输出。
方法二:进程替换解决子进程变量问题
如果需要在循环外使用循环内的变量,上面的管道写法会导致while在子进程中执行,变量无法传递到外部。这时可以用进程替换:
while read -r x y z do echo "output: $x $y $z" done < <(top -n 1 -b -c | awk -vOFS="\t" '{print $1,$2,$9}')
<(...)会把命令的输出当作临时文件,while在当前Shell进程中执行,变量可以在循环外正常访问。
方法三:强行用for循环实现(不推荐)
如果一定要用for循环,需要先把输出按行分组,再拆分每行的字段:
# 把换行替换成分号,让for循环按行遍历 for line in $(top -n 1 -b -c | awk -vOFS="\t" '{print $1,$2,$9}' | tr '\n' ';') do # 移除末尾的分号,用制表符拆分字段到变量 IFS=$'\t' read -r x y z <<< "${line%;}" echo "output: $x $y $z" done
这种写法需要处理换行符转换,逻辑更复杂,不如while read直观,仅作参考。
内容的提问来源于stack exchange,提问作者CompEng
相关产品推荐
相关产品推荐

