Bash

如何將數組作為文件參數提供給腳本,以便每個元素就像文件中的一行?

  • November 25, 2018

假設一個 bash 腳本需要一個參數是一個文件。但是我們有一個 bash 數組,並且希望以某種方式提供該數組作為腳本的參數,就好像有一個文件的行是數組的元素一樣。我想知道怎麼做?

舉一個簡單的例子,我有一個myscrpt包含單個命令的腳本,它需要一個文件參數

cat $1

我有一個數組

arr=( 1 3 5 )

以及如何將arr其作為參數提供給腳本,就好像該參數實際上是一個內容為

1
3
5

有用 myscript <(echo "${arr[@]}")嗎?

謝謝。

如果您正在使用bash或其他一些支持數組的外殼,您可以使用"${var[@]}"類型構造。

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

printf例如,將每行一個元素通過管道傳輸到任何期望的元素中

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

雙引號數組擴展非常重要;否則,該@字元被視為*並且數組擴展(錯誤地)被視為在空格上進行分詞。

所以,你有了你的腳本(只做了一點修改,#!在 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/stdincat解釋-為標準輸入,如果給定/dev/stdin,同樣會從標準輸入中讀取。

數據在標準輸入上提供,標準輸入printf將其作為數組中的換行符分隔元素提供。

會產生同樣的效果

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

其中數據是通過此處的字元串提供的。通過使用"${arr[*]}",我們將數組的元素連接成一個由第一個字元分隔的字元串$IFS(我們將其設置為換行符)。我在這裡使用了一個子shell,以避免IFS在周圍環境中進行修改。

引用自:https://unix.stackexchange.com/questions/479943