ワイルドカードが検出された場合、コマンドが正しく機能しないのはなぜですか?

ワイルドカードが検出された場合、コマンドが正しく機能しないのはなぜですか?

シェルスクリプトのコードスニペット

 fname=$(sed 's/(.*//' <<< $p | awk '{ print $NF }')  
 if [[ $fname == *['!'@#\$%^\&*()_+]* ]]
 then
   flag1=0
 fi

ここで、 $p はテキストファイルの 1 行です。

p値は次のとおりです。 >= (short)BigBlock * DISK_SIZE + Size)

上記のシェルスクリプトがp値に対して実行されると、端末と同じゴミ結果が表示されます。

>= (short)BigBlock  file1 file2 file3 DISK_SIZE + Size)

ここで、file1 file2 file3 はフォルダ内のファイルです。

私の考えでは、*がlsコマンドとして扱われているようです。

考えられる解決策は何ですか

ベストアンサー1

要約:echo $pコードにこのような部分がある可能性があります。二重引用符が必要です$p


いいえ、コマンド*とは見なされません。lsただし、(質問に示されているコードではなく)どこかに引用符なしで使用されるため、ファイル名はグローブパターンとして扱われます。

p値を割り当てて使用するときは、文字列を保護するために適切な引用符を使用するときは注意が必要です。

ファイル名globbingパターンはこの文字列では拡張されません。

$ cat <<< *
*

$pしたがって、呼び出し時に引用符なしで使用しても問題はありませんsed。しかし、明示的な参照変数の拡張はほとんど常に良いです。$fnameテストで参照されていない使用も参照してください。必ず二重引用符で囲む必要があります。

スクリプトがテキストを出力すると言われました。

>= (short)BigBlock  file1 file2 file3 DISK_SIZE + Size)

質問に表示されるスクリプトでは、対応する文字列は出力されません。これはあなたがやっていることによるものかもしれません

echo $p

スクリプトの他の場所で。

今回も二重引用符を使用してください$p

echo "$p"

これにより、シェルが*その値に対してファイル名のグロービング(拡張)を実行するのを防ぎます。

通常、静的文字列、変更可能なデータechoにのみ適用されます。printf

printf '$p is "%s"\n' "$p"

最後のポイントと関連:なぜprintfがechoより優れているのですか?

おすすめ記事