Bashスクリプトで次のことをしたいと思います。
script.sh < some_file
ファイルsome_file
には1行があり、これをbashにパラメータとして渡したいと思いますscript.sh
。どうすればいいですか?
答え1
3つのバリエーション:
- コマンドラインからファイルの内容を渡し、スクリプトで使用します。
- コマンドラインにファイル名を渡し、スクリプトのファイルから読み込みます。
- ファイルの内容を標準入力に渡し、スクリプトから標準入力を読み込みます。
内容をコマンドライン引数として渡します。
$ ./script.sh "$(<some_file)"
スクリプト内部:
some_data=$1
$1
最初のコマンドライン引数の値になります。
データが多すぎると失敗します(シェルが実行する必要があるコマンドが大きすぎます)。
パスファイル名:
$ ./script.sh some_file
スクリプト内部:
some_data=$(<"$1")
または
IFS= read -r some_data <"$1"
標準入力をファイルにリンクします。
$ ./script.sh <some_file
スクリプト内部:
IFS= read -r some_data
このアプローチの欠点は、スクリプトの標準入力がに接続されることですsome_file
。しかし、スクリプトユーザーにファイルやパイプから標準入力データを渡す際には、多くの柔軟性があります。
答え2
cat some_file | ./script.sh `xargs`
答え3
Bashシェルの引用の心配を避けるには、xargsを使用して引数を介してファイル全体をそのまま渡します(複数のファイルも含まれます)。
cat input-file | xargs -0 -I XX mycommand arg1 --foo XX arg3
は私が選択したプレースホルダーですXX
。コマンドラインのどこにも表示されない限り(input-file
テキストを入力したい場所を除く)何でも構いません。
-0
行末が区切り文字として使用されないように、入力ファイルをヌル文字で区切るように xargs に指示します。これにより、ファイル全体が単一の引数として渡されます(ファイルにテキストファイルに含まれてはならないNULL文字が含まれていない場合)。
スクリプトを制御できるので、ファイル名をパラメータとして渡すのはどうですか?
答え4
read
シェル組み込み機能を使用すると、データを読み込み、stdin
読み取った入力をシェル変数に保存できます。
$ echo foo bar baz | read a b c
$ echo $a
foo
$ echo $b
bar
$ echo $c
baz
見て、read
再び分割がフィールドに入力されます。入力の分割位置は変数$IFS
(入力フィールド区切り記号)。 null に設定すると、$IFS
入力分割が無効になり、行全体を変数に保存できます。
$ echo foo bar baz | IFS= read foo
$ echo $foo
foo bar baz