假设 bash 脚本期望参数是一个文件。但是我们有一个 bash 数组,并且希望以某种方式提供该数组作为脚本的参数,就好像有一个文件,其行是数组的元素。我想知道该怎么做?
myscrpt
举一个简单的例子,我有一个包含单个命令的脚本,该命令需要一个文件参数
cat $1
我有一个数组
arr=( 1 3 5 )
我怎样才能提供arr
作为脚本的参数,就好像参数实际上是一个文件,其内容是
1
3
5
有效吗 myscript <(echo "${arr[@]}")
?
谢谢。
答案1
如果您正在使用bash
Shell 或其他支持数组的 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
在周围环境中进行修改。