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

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

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

1 2 3

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

myscript.sh 1 2 3

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

myscript.sh "$(cat mydata)"

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

我应该怎么办?

答案1

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

myscript.sh $(cat mydata)

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

(set -f; myscript.sh $(cat mydata))

或者,您可以使用read内置的。这会读取第一行并忽略其余行(您可以通过替换为上面的内容来执行此操作cathead -n 1

read -r one two three rest <mydata
myscript.sh "$one" "$two" "$three"

答案2

这通常是xargs为了:

xargs myscript.sh < mydata

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

答案3

我不将参数作为多个参数传递,而是将参数作为单个数组传递,然后对参数执行任何我想要的操作。

#This is the function which takes a variable length array as an input. 
function function_call() 
{
    all_array_values=$1[@]
    a=("${!all_array_values}")
    for i in "${a[@]}" ; do
        echo "$i"
    done
}


#Here I add all the file contents to the variable named input.  
input=$(cat filename)
#In this step I convert the file contents to an array by splitting on space. 
input_to_array=(${input//' '/ })
#I call the function here. 
function_call input_to_array

测试

我有如下输入文件。

cat filename
1 2 3 4
5
6
7
8

正如您所看到的,出于测试目的,我在输入中也使用了多行。

现在,当我运行上面的脚本时,我得到以下输出。

1
2
3
4
5
6
7
8

我将输入文件更改为具有较少数量的参数,当我使用较少的参数运行时,我得到以下输出。

1
2
3
4

参考

https://stackoverflow.com/questions/16461656/bash-how-to-pass-array-as-an-argument-to-a-function https://stackoverflow.com/a/5257398/1742825

相关内容