0

次のシェル スクリプトでは、ファイルの種類に応じて 2 つの異なるタスクを実行したいのですが、エラーが発生しています。"[==c]: command not found"

echo "enter file name"
read num
var_check= echo $str |awk -F . '{if (NF>1) {print $NF}}'

if ["$var_check"=="c"];then
    echo "Some task for c"
elif ["$var_check"=="cpp"];then
    echo "Some task for cpp"
else
    echo "Wrong file extension"
fi
4

1 に答える 1

1

あなたが書いた:

if ["$var_check"=="c"];then

[コマンドはコマンドです。その名前はスペースで囲む必要があります (簡単に言えば)。

if [ "$var_check" == "c" ]; then

最後の引数 の]前にもスペースが必要です。内のオペランドもスペースで区切る必要があります。それらは別々の引数である必要があります。演算子のルールは[[ ... ]]少し異なりますが、スペースを使用するとコードが読みやすくなります。あなたが書いたものは、期待に少し似ています:

ls"-l"/dev/tty

働く; それはしません。

testまたは[オペレーターがサポートしているかどうかを再確認する必要もあります==。通常の形式は=です。


この線:

var_check= echo $str |awk -F . '{if (NF>1) {print $NF}}'

これは、環境変数として設定されたechoコマンドを実行しvar_checkますが、これはあなたが望むものではありません。あなたはほぼ確実に次のように書くつもりでした:

var_check=$(echo $str |awk -F . '{if (NF>1) {print $NF}}')

これにより、 コマンドechoとコマンドがawk実行され、出力が に取り込まれvar_checkます。$(...)古いが使用するのがより複雑な表記法よりも、この表記法を優先して使用してください`...`。単純なケースでは、それらは同じように見えます。それらをネストすると、$(...)表記がはるかに理解しやすく、使いやすくなります。

また、より大きなスケールで見る (1 行ではなく 3 行):

echo "enter file name"
read num
var_check=$(echo $str |awk -F . '{if (NF>1) {print $NF}}')

ファイル名を variable に読み込みますnum$strの代わりにエコーします$num$strスクリプトのどこかで (表示されていないコードで)既に設定されている場合は、それで問題ない可能性があります。スタンドアロンのフラグメントと見なすと、正しくありません。

awk少し単純化することもできます:

var_check=$(echo $str |awk -F . 'NF > 1 {print $NF}')

これはあなたが書いたものと同じように機能しますが、使用する括弧と中括弧が少なくなります。

于 2013-04-02T18:56:41.617 に答える