如何提供一个数组作为脚本的文件参数,以便每个元素都像文件中的一行?

如何提供一个数组作为脚本的文件参数,以便每个元素都像文件中的一行?

假设 bash 脚本期望参数是一个文件。但是我们有一个 bash 数组,并且希望以某种方式提供该数组作为脚本的参数,就好像有一个文件,其行是数组的元素。我想知道该怎么做?

myscrpt举一个简单的例子,我有一个包含单个命令的脚本,该命令需要一个文件参数

cat $1

我有一个数组

arr=( 1 3 5 )

我怎样才能提供arr作为脚本的参数,就好像参数实际上是一个文件,其内容是

1
3
5

有效吗 myscript <(echo "${arr[@]}")

谢谢。

答案1

如果您正在使用bashShell 或其他支持数组的 shell,则可以使用"${var[@]}"类型构造。

a=(one two 'three four' five)
printf "%s\n" "${a[@]}"

printf例如,通过管道将每行一个元素输入到任何需要的元素中

printf "%s\n" "${a[@]}" | myscript

用双引号引用数组扩展确实很重要;否则,@字符被视为*并且数组扩展被(错误地)视为空格上的单词分割。

答案2

所以,你有了你的脚本(只做了一点修改,在 as#!的扩展周围添加 -line 和引号,$1以支持从具有不寻常文件名的文件中读取),

#!/bin/sh
cat "$1"

现在你想用数组调用这个脚本

arr=( 1 2 3 4 5 )

这样它就不会读取文件(您的脚本正在执行此操作),而是从数组中读取换行符分隔的值,从而生成

1
2
3
4
5

作为输出?

可以这样做:

printf '%s\n' "${arr[@]}" | ./script -

或者

printf '%s\n' "${arr[@]}" | ./script /dev/stdin

这会将-/dev/stdin作为要读取的文件传递给您的脚本。将cat解释-为标准输入,如果给出,/dev/stdin同样会从标准输入中读取。

数据在标准输入上提供,标准输入将printf其作为数组中的换行符分隔元素提供。

会产生相同的效果

( IFS=$'\n'; sh ./script.sh - <<<"${arr[*]}" )

其中数据是通过此处字符串提供的。通过使用"${arr[*]}",我们将数组的元素连接到一个字符串中,该字符串由第一个字符$IFS(我们将其设置为换行符)分隔。我在这里使用子 shell 以避免IFS在周围环境中进行修改。

相关内容