我想要实现的是从文件中读取命令行参数并使用它们调用命令。所以本质上我需要通过 bash 变量传递参数。问题是有些参数中有空格。我怎样才能做到这一点?
不工作的代码,来说明问题:
file.txt 内容(引号只是为了显示两个不同的参数):
"aaa bbb" "xxx yyy"
Run Code Online (Sandbox Code Playgroud)
外壳脚本:
ARGS=$(cat file.txt)
/some/command $ARGS
Run Code Online (Sandbox Code Playgroud)
/some/command应该接收两个参数:aaa bbb和xxx yyy。我确实可以控制生成的 file.txt 和 shell 脚本本身。
如果您想对 中找到的每一行执行一次命令file.txt,因此每一行都是一个单独的参数集,您可以这样做:
xargs /some/command <file.txt
Run Code Online (Sandbox Code Playgroud)
该xargs实用程序获取在标准输入上接收到的每一行,并将其内容用作要提供给调用的命令的参数。如果文件仅包含一行,它将起作用并仅执行该命令一次。
以下解决方案具有相同的作用,但也适用于函数:
while IFS= read -r line
do
eval args=\("$line"\)
command_or_function "${args[@]}"
done<file.txt
Run Code Online (Sandbox Code Playgroud)
请注意,这使用eval,这意味着如果file.txt包含恶意内容,可能会导致任意代码执行。您必须 100% 确定文件中包含的数据是安全的。
这种技术的想法是,将每一行分解为一个数组(一个数组元素是一个参数),然后使用数组扩展 ( "${args[@]}") 扩展为其所有元素的列表,并正确引用(扩展周围的引号是这里很重要)。
顺便说一句,该eval行可以替换为:
declare -a args=\($line\)
Run Code Online (Sandbox Code Playgroud)
但$line仍然会扩展,所以这并不比eval.