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.txt
while
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