You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

说明

  1. read -r port num dev会自动将每行内容按空白分割,分别赋值给port、num、dev三个变量,对应每行的三个字段;
  2. 直接引用拆分后的变量,就能精准获取每行的第三个字段($dev),符合期望输出;
  3. 如果行内字段数量不固定,也可以先将整行转为数组再访问:
    while read -r line; do
        arr=($line)
        echo "Drive - ${arr[0]} ${arr[1]} ${arr[2]}"
        echo "${arr[2]}"
    done < drivelist.txt
    
    但这种方式依赖空白分割,不如直接用多变量拆分可靠(比如字段含空格时会出错)。

内容的提问来源于stack exchange,提问作者msknight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:17:07