ファイルの内容をパラメータとしてbashスクリプトに渡す

ファイルの内容をパラメータとしてbashスクリプトに渡す

Bashスクリプトで次のことをしたいと思います。

script.sh < some_file

ファイルsome_fileには1行があり、これをbashにパラメータとして渡したいと思いますscript.sh。どうすればいいですか?

答え1

3つのバリエーション:

  1. コマンドラインからファイルの内容を渡し、スクリプトで使用します。
  2. コマンドラインにファイル名を渡し、スクリプトのファイルから読み込みます。
  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

関連情報