Bash脚本while循环第二条语句无法正确引用变量求助
问题描述
编写的Bash脚本中,while循环内无法正确提取每行的第三个字段,具体情况如下:
脚本代码
#!/usr/bin/env bash while read -r i; do echo "Drive $2 - $3 $i" echo "$3" done < drivelist.txt
输入文件drivelist.txt内容
Port 1 /dev/sdc Port 2 /dev/sdd Port 3 /dev/sdb Port 4 /dev/sda
期望输出
Drive - Port 1 /dev/sdc /dev/sdc Drive - Port 2 /dev/sdd /dev/sdd Drive - Port 3 /dev/sdb /dev/sdb Drive - Port 4 /dev/sda /dev/sda
实际输出
Drive - Port 1 /dev/sdc Drive - Port 2 /dev/sdd Drive - Port 3 /dev/sdb Drive - Port 4 /dev/sda
尝试用${i[2]}访问第三个字段也无效,仅能打印整行内容。
解决方案
问题核心在于:read -r i是将整行内容赋值给变量i,而脚本中的$2、$3是脚本的位置参数(执行脚本时传入的命令行参数),并非当前行的字段。同时i是普通字符串,不是数组,所以${i[2]}无法生效。
正确的做法是用read直接拆分每行的字段,修改后的脚本如下:
#!/usr/bin/env bash while read -r port num dev; do echo "Drive - $port $num $dev" echo "$dev" done < drivelist.txt
说明
read -r port num dev会自动将每行内容按空白分割,分别赋值给port、num、dev三个变量,对应每行的三个字段;- 直接引用拆分后的变量,就能精准获取每行的第三个字段(
$dev),符合期望输出; - 如果行内字段数量不固定,也可以先将整行转为数组再访问:
但这种方式依赖空白分割,不如直接用多变量拆分可靠(比如字段含空格时会出错)。while read -r line; do arr=($line) echo "Drive - ${arr[0]} ${arr[1]} ${arr[2]}" echo "${arr[2]}" done < drivelist.txt
内容的提问来源于stack exchange,提问作者msknight
相关产品推荐
相关产品推荐

