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
相关产品推荐
相关产品推荐

