簡體   English   中英

如何將標准輸入 arguments 從 Pipe 分配給 BASH 中的變量

[英]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中的onetwothree三個字是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

與其解析標准輸入,不如使用實際的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM