[英]How to assign stdin arguments to variables in BASH from Pipe
我正在嘗試什么:
我正在嘗試將 args 分配給來自 Pipe 的變量
預期的:
我應該在我的腳本中做什么來將 arguments 分配給變量,使它們看起來像這樣?
if [ -p /dev/stdin ]; then
option1="one"
option2="two"
option3="three"
echo "$option1" "$option2" "$option3"
else
echo "no input"
fi
輸入: echo one two three |./myscript
Output: one two three
問題更新:我需要在 |(pipe) 之前提供的所有 arguments 作為我腳本的字符串輸入。 它不應該檢查存在或執行|(管道)之前存在的二進制文件(這里二進制文件是echo
)。
輸入: echo one two three |./myscript
Output: echo one two
echo one two three |./myscript
中的one
、 two
、 three
三個字是echo
的arguments; 但是對於./myscript
,它們只是輸入,而不是 arguments。
要將每個單詞讀入其自己的變量中,請使用
if [ -p /dev/stdin ]; then
read -r option1 option2 option3
echo "$option1" "$option2" "$option3"
else
echo "no input"
fi
如果要允許任意數量的單詞,請使用數組。
read -ra myArray
將單行中的所有單詞讀入一個數組。
mapfile -t myArray
將所有行讀入一個數組。
read -rd '' -a myArray
將所有行中的所有單詞讀入一個數組。
要訪問數組中的單詞,請使用${myArray[0]}
、 ${myArray[1]}
、 ...、 ${myArray[${#myArray[@]}-1]}
。
與其解析標准輸入,不如使用實際的 arguments。 為此,請執行您的腳本,例如./myscript one two three
。 然后使用位置參數訪問 arguments:
if [ $# = 0 ]; then
echo "no arguments"
else
echo "The arguments are $1 $2 $3 ..."
fi
對於任意數量的 arguments 檢查shift
和$@
。
您可能應該簡單地使用xargs
代替。 但是你問的問題本身並不難。
if [ -p /dev/stdin ]; then
read -r option1 option2 option3
echo "$option1" "$option2" "$option3"
else
echo "no input"
fi
使用xargs
,這看起來像
option1=$1
option2=$2
option3=$3
然后你只需運行它
echo first second third |
xargs ./yourscript
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.