如何在bash中将文件内容作为多个参数传递

mic*_*con 6 bash parameter shell-script

我有一个文件,其中包含随时间更新的数据 (mydata)。该文件如下所示:

1 2 3
Run Code Online (Sandbox Code Playgroud)

有了这个文件,我想这样做(基本上将每个数字作为单独的参数处理):

myscript.sh 1 2 3
Run Code Online (Sandbox Code Playgroud)

由于数据不是静态的而是随着时间的推移更新,我想运行这个命令:

myscript.sh "$(cat mydata)"
Run Code Online (Sandbox Code Playgroud)

但是我看到 ./myscript.sh: line 1: 1: command not found

我该怎么办?

Gil*_*il' 6

"$(cat mydata)"计算结果为包含文件内容mydata减去任何尾随换行符的字符串。您想要的是文件中以空格分隔的单词列表。因此,一次,在双引号之外使用命令替换:

myscript.sh $(cat mydata)
Run Code Online (Sandbox Code Playgroud)

为了获得额外的稳健性,请关闭通配符,以便如果 inmydata中的列包含其中一个字符\[*?,则不会将其解释为文件名模式。您可能还想设置IFS为包含单词分隔符,但默认值(ASCII 空格)应该正是您所需要的。

(set -f; myscript.sh $(cat mydata))
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用read内置函数。这会读取第一行并忽略其余部分(您可以在上面通过替换cathead -n 1)。

read -r one two three rest <mydata
myscript.sh "$one" "$two" "$three"
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句 - 有 *robust* 并且有 *bugged* - 没有 *extrarobust.* 你的建议在任何情况下都是 *bugged*,因为它不考虑 `$IFS` 的当前值无论是哪种情况,都依赖于 shell 默认值 - *(或者,如果它不自相矛盾的话,它会这样做)* 这是一个你无法知道的默认值仍然有效。 (2认同)

Sté*_*las 6

这通常xargs是为了:

xargs myscript.sh < mydata
Run Code Online (Sandbox Code Playgroud)

xargs将输入视为空白或换行符分隔的单词,其中使用单引号、双引号或反斜杠来转义分隔符。xargs将根据需要多次运行该命令,以避免传递给命令的参数(和环境)的大小受到限制。