シェルスクリプトの引数としてパイプ出力を使用できますか?


22

Myscript.sh入力として1つの引数が必要なbashシェルスクリプトがあると仮定します。

しかし、呼び出されるテキストファイルの内容をtext.txtその引数にしたいのです。

私はこれを試しましたが、うまくいきません:

cat text.txt | ./Myscript.sh

これを行う方法はありますか?

回答:



19

パイプ出力をシェルスクリプトの引数として使用できます。

この方法を試してください:

cat text.txt | xargs -I {} ./Myscript.sh {}


0

試して、

 $ cat comli.txt
 date
 who
 screen
 wget

 $ cat comli.sh
 #!/bin/bash
 which $1

 $ for i in `cat comli.txt` ; do ./comli.sh $i ; done

そのため、値を1つずつcomli.shfromに入力できますcomli.txt



0

mapfileでstdinを読み取ることにより、位置パラメータを再設定できます。

#!/bin/bash

[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; }

for i in $@; do
    echo "$((++n)) $i"
done

(「$ @」を引用すると、for代わりにループ行が作成されます)。

$ cat test.txt | ./script.sh
1 one
2 two
3 tree

0

私見が質問に正しく答える唯一のものである@ bac0nを完了するために、スクリプト引数リストにパイプ引数を追加するショートライナーがあります:

#!/bin/bash
args=$@
[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; set -- $@ $args; }

echo $@

使用例:

$ ./script.sh arg1 arg2 arg3
> arg1 arg2 arg3

$ echo "piped1 piped2 piped3" | ./script.sh
> piped1 piped2 piped3

$ echo "piped1 piped2 piped3" | ./script.sh arg1 arg2 arg3
> piped1 piped2 piped3 arg1 arg2 arg3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.