我有一个文件,其中包含随时间更新的数据(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
内置的。这会读取第一行并忽略其余行(您可以通过替换为上面的内容来执行此操作cat
)head -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