cat / awk出力に基づいてシェルスクリプトでPythonファイルを実行する

cat / awk出力に基づいてシェルスクリプトでPythonファイルを実行する

cat/の出力に基づいてPythonファイルを実行していますawk。次のファイルがあるとしましょう。

samp.txt:

test.py test.conf
dev.py dev.conf

今はファイルであり、Pythonスクリプトをトリガーするcat小さなシェルスクリプトがあります。samp.txt

samp.sh:

OLDIFS=$IFS; IFS=$'\n';for file in $(cat samp.txt) ;
do
    text="$file -c $1 -s $2 -t $3"
    out=`python $text`

done

シェルスクリプトを実行すると、次のように表示されます。

python: can't open file 'test.py test.conf' : [Errno 2] No such file or directory

問題は一重引用符によるものです。それを克服するにはアドバイスが必要です。

ベストアンサー1

問題は一重引用符ではなく(エラー出力に表示される一重引用符を参照していると仮定します。これはエラーを表示するPythonの方法にすぎません)、むしろ分割するシェルに依存するためです$text。スペースを別の単語に分割します。また、IFSループの前の変数から空白文字を削除しました。これは、シェルが分割を正しく実行できないことを意味します。

正しい解決策はいいえシェルを$textスペースに分割するようにしてください。これにより、結果の単語に対してファイル名のワイルドカードが引き続き呼び出されます。 、$textと が含まれているため、これらの値は分割時に空白などに分割されます。$1$2$3$text

変数を正しく分割するためにシェルに頼るのではなく、ループ内の1行$textに2つの単語を読みます。samp.txtwhile

while read -r script config; do
    out=$( python "$script" "$config" -c "$1" -s "$2" -t "$3" )
done <samp.txt

引数に別の変数を使用し、たとえば名前付きbash配列を持つ別のシェルを使用する場合:

args=( -c "$1" -s "$2" -t "$3" )
while read -r script config; do
    out=$( python "$script" "$config" "${args[@]}" )
done <samp.txt

テキスト文字列の代わりに配列をパラメータとして使用すると、パラメータを配列から適切に分離できます。拡張は"${args[@]}"配列の個々の要素になり、各要素は正しく参照されます。これは$1、たとえば、$2および$3スペースなどを問題なく含めることができることを意味します。

POSIX(/bin/sh)スクリプトは、位置引数を安全に捨てることができると仮定しています$4

set -- -c "$1" -s "$2" -t "$3"
while read -r script config; do
    out=$( python "$script" "$config" "$@" )
done <samp.txt

おすすめ記事