Bash
如何將數組作為文件參數提供給腳本,以便每個元素就像文件中的一行?
假設一個 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/stdin
將cat
解釋-
為標準輸入,如果給定/dev/stdin
,同樣會從標準輸入中讀取。數據在標準輸入上提供,標準輸入
printf
將其作為數組中的換行符分隔元素提供。會產生同樣的效果
( IFS=$'\n'; sh ./script.sh - <<<"${arr[*]}" )
其中數據是通過此處的字元串提供的。通過使用
"${arr[*]}"
,我們將數組的元素連接成一個由第一個字元分隔的字元串$IFS
(我們將其設置為換行符)。我在這裡使用了一個子shell,以避免IFS
在周圍環境中進行修改。