プログラム名とオプションのフラグという2つのパラメーターを受け入れるスクリプトを作成しようとしています。
入力ファイルでプログラムコマンドを実行し、出力ファイルに出力を保存しようとしています。
$input_file < $($program options) > output_file
上記の動作を達成するためにさまざまな構文の組み合わせを試しましたが、あいまいなリダイレクト、I / Oエラーなどのエラーが発生します。
例:
./execute cat -n
プログラム内で入力ファイルにcatを適用するコードを書きたいです。
これらは機能しません:
$(${1} ${2} names.txt) > test.out
names.txt < $($1 $2) > test.out
ベストアンサー1
構文を間違って理解しました。まず、入力リダイレクトシンボルは<
ファイルの終わりではなく前面にあります。作業順序は重要ではありません。したがって、構文は次のようになります。
< inputfile command options > outputfile
または
command options < inputfile > outputfile
(または他の順列)。
まあ、あなたは余分な$
。あなたが本当にやるべきことは
$program $options <$inputfile >$outputfile
${program}
と を と${options}
に変更できます。$1
$2
この形であなたはできます
#!/bin/bash
<names.txt $1 $2 >test.out
複数のオプションが必要な場合、./execute cat -n
または電話してください。./execute cat '-n -s'
この形式では複数のオプションを使用できますが、$2
引用符なしで引用符で囲む必要があります。空白は引数を複数の単語に戻します。
別の(より良い)方法は、以下を使用することです。
#!/bin/bash
<names.txt "$@" >test.out
これで、引数に引用された文字列を含む任意の数の引数をスクリプトに渡すことができ、引数はスクリプトに伝播された後も一緒に保持されます。今動作します。 (./execute cat -n - "bla bla.txt"
以前の形式では、ファイル名を2つの部分に分割しました。)