web-dev-qa-db-ja.com

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

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

しかし、私はtext.txtというテキストファイルの内容をその引数にしたいと考えています。

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

cat text.txt | ./Myscript.sh

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

27
Narin

コマンド置換

./Myscript.sh "$(cat text.txt)"

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

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

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

ファイルに複数のコマンドがある場合は、 xargs または parallel の使用を検討してください。

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt
2
reinierpost

Mapdinで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

プロセスの代替

./Myscript.sh <(cat text.txt)

たとえば、 https://www.gnu.org/software/bash/manual/bash.html#Process-Substitution

0
al-ash

IMHOだけが質問に正しく回答する@ 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

0
aznoqmous

試して、

 $ 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

したがって、comli.shからcomli.txtまでの値を1つずつ入力できます。

0
Ranjithkumar T