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

Bash脚本读取文件内容循环为参数赋值执行脚本问题

解决Bash循环读取文件内容并赋值给变量执行脚本的问题

首先,你原来的代码里有几个关键错误:

  • read $1 $2 $3 是错误用法:read 命令后面应该跟自定义变量名,而非位置参数$1/$2/$3——位置参数是脚本启动时传入的固定值,不能直接通过read赋值。更糟的是,如果启动脚本时没传参数,$1/$2/$3都是空值,相当于read未指定变量,会把读取内容放到默认变量REPLY里,导致后续用${1}时拿到空值,这就是你看到./.sh: No such file or directory错误的原因。
  • 你在read里写的&是后台运行符号,会被当成命令分隔符,完全不符合语法。

下面根据你两种不同的文件格式,给出对应的正确实现:

情况1:文件每行一个值,每3行一组

你的原始file.txt是每行一个参数,3行对应一组arg1/arg2/arg3,可以用嵌套read的方式每次读取3行:

#!/bin/bash
# 循环读取3行作为一组,直到文件结束
while true; do
    # 读取三个参数,只要其中一个失败就退出循环(比如文件读完)
    read -r arg1 || break
    read -r arg2 || break
    read -r arg3 || break

    # 输出参数验证
    echo "当前组参数:$arg1, $arg2, $arg3"
    # 执行对应的脚本,用后台运行的话加&
    ./"$arg1".sh &
    ./"$arg2".sh &
    ./"$arg3".sh &
    # 可选:等待当前组的脚本全部执行完成再进入下一组
    wait
done < file.txt

情况2:文件每行三个值(你修改后的格式)

如果file.txt是每行直接包含三个参数,实现会更简单,直接用while read一次性读取三个变量:

#!/bin/bash
# 每行读取三个参数,自动忽略空行
while read -r arg1 arg2 arg3; do
    # 跳过空行(如果文件中有空行的话)
    [[ -z $arg1 ]] && continue

    echo "当前组参数:$arg1, $arg2, $arg3"
    ./"$arg1".sh &
    ./"$arg2".sh &
    ./"$arg3".sh &
    # 可选:等待当前组的脚本全部执行完成
    wait
done < file.txt

关键细节说明:

  • 使用read -r可以避免反斜杠被转义,是更安全的读取方式。
  • 变量引用时用双引号"$arg1",防止参数里有空格或特殊字符导致执行错误。
  • 如果不需要后台并行执行脚本,去掉&即可;如果需要等一组的三个脚本都跑完再处理下一组,保留wait。

关于你的小问题:执行脚本是否需要传参数?

完全不需要传入任何参数!你要的参数是从file.txt里动态读取的,直接运行:

./script.sh

就可以了。之前你尝试的./script.sh mystery mystery mystery完全没必要,反而会让位置参数$1/$2/$3被固定为mystery,和你动态读取文件的需求冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:40:32