入力として1つの引数が必要なMyscript.sh
というbashシェルスクリプトがあるとします。
しかし、私はtext.txt
というテキストファイルの内容をその引数にしたいと考えています。
私はこれを試しましたが、うまくいきません:
cat text.txt | ./Myscript.sh
これを行う方法はありますか?
コマンド置換 。
./Myscript.sh "$(cat text.txt)"
パイプ出力をシェルスクリプトの引数として使用できます。
この方法を試してください:
cat text.txt | xargs -I {} ./Myscript.sh {}
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
プロセスの代替
./Myscript.sh <(cat text.txt)
たとえば、 https://www.gnu.org/software/bash/manual/bash.html#Process-Substitution
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
試して、
$ 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つずつ入力できます。