以下のように状況を確認したいと思います。行は#
次の記号で始まってはいけません。
if[ ! ["$Line" == "#*"] ]; then
しかし、これはうまくいきません。
答え1
コードスニペットには多くの問題がありますが、デフォルトでは構文は[![...]]
無効です。 bash(および他の多くのシェル)では、[[
他の文字に分割できない単一のコマンドです。
代わりに、恒等演算子を否定できます。
if [[ "$LINE" != \#* ]]; then echo yes; fi
また、括弧の周りのスペースを注意深く見てください。
答え2
変数に文字列があり、文字で始まらない場合は、line
その文字列を出力したいとします。以下の例では条件が満たされない場合でも出力しています。yes
#
no
case $line in
"#"*) echo no
esac
このcase
ステートメントは変数を使用し、任意の数の(ワイルドカード)パターンを使用して変数値と一致するパターンのコードを実行します。この場合、パターン"#"*
(#
コメントを導入するように見えないように引用符で囲む必要があります)を一致させようとし、一致した場合はecho
文を実行します。
より多くのパターンがある場合は、最後のパターンを除くすべてのコードはで終わる必要があります;;
。
case $line in
"#"*) echo no ;;
*) echo yes
esac
...そしてパターンのコードは空であるかもしれません。
case $line in
"#"*) ;;
*) echo yes
esac
シェルはまた、bash
演算子を介してglobとパターンマッチングを実行します。[[ ... ]]
==
if [[ $line != "#"* ]]; then
echo yes
else
echo no
fi
では、bash
正規表現を使用して=~
次の演算子と一致させることもできます[[ ... ]]
。
if ! [[ $line =~ ^# ]]; then
echo yes
else
echo no
fi
または
if [[ $line =~ ^[^#] ]]; then
echo yes
else
echo no
fi
ファイルを 1 行ずつ解析する場合、シェルはその操作に適したツールではありません。代わりに、次のものを使用できますawk
。
awk '/^[^#]/ { print yes }' <inputfile
関連: