質問
「problem1.sh」文字列をそれ自体と比較する必要があります。それはうまくいきますsolution1.sh
(次の通り)比較には角かっこを使用します。ただし、次の場合は動作しません。solution2.sh
(次の通り)ここでは括弧を使用します。記載されたエラーが表示されます。(次の通り)。
私はすでに何を試しましたか?
Bashスクリプトで角かっこと丸括弧を使用することの違いを理解したいと思います。ここそしてここ。私が知っている限り、((expression))
文字列値ではなく算術値を比較するために使用されます。
では、問題の原因は何ですか?
文字列「problem1.sh」から部分文字列「.sh」を削除し、同じ文を使用して比較するとif (("problem1" == "problem1"))
正常に動作します。ただし、文字列に「.」だけを追加すると問題が発生します。 「.」以外のすべてを削除しても、文字列と文を使用するとif (("." == "."))
エラーが表示されます。
だから私の質問は
文がif (("problem1" == "problem1"))
正しく機能している場合(おそらく英語のアルファベットのすべての文字に対して機能します)、「。」文字列が問題を引き起こすのはなぜですか?私は、if (("." == "."))
文字を比較するために同じ式(たとえば)を使用できますが、なぜbashスクリプトのif文で括弧(たとえば)を使用して比較することはできませんかif (("findError" == "findError"))
?
ソリューション1.sh
if [ "problem1.sh" == "problem1.sh" ]
then
printf "Okay"
fi
ソリューション2.sh
if (( "problem1.sh" == "problem1.sh" ))
then
printf "Okay"
fi
Solution2.shに関するエラーメッセージ
./solution2.sh: line 1: ((: problem1.sh == problem1.sh : syntax error:
invalid arithmetic operator (error token is ".sh == problem1.sh ")
答え1
言語翻訳に問題があります。
算術式の言語ではドットは存在しません。
使用している言語が「$((…))」内では機能しません。
"$((...))" (算術式) 内には、数字 (通常は等しい整数 )、演算子 ( 、1234
および+
同等-
演算子で*
ある<<
yes==
など) および変数 (1 つ以上の文字、数字 (最初の文字ではない)、下線)。それはすべてです。そのような概念はありません。ひも。
これを算術式で作成すると、problem1
言語では変数名(または以前に定義されていない場合は値0)として理解されます。
$ echo "==$((problem1))=="
==0==
$ problem1=34
$ echo "==$((problem1))=="
==34==
テキストが引用符内にあるかどうかは問題ではありません。
$ echo "==$(("problem1"))=="
==34==
あなたが使っているのは、((…))
出力のない算術式でもあります。ただ設定してください終了ステータス(そしてCのように式が次のように評価された場合0ではない)。
$ (( 1 + 1 )) ; echo "$?"
0
$ (( 0 )) ; echo "$?"
1
$ (( 1 - 10 )) ; echo "$?"
0
ただし、算術式はポイントが何であるか、つまり演算子または変数名として理解できないため、構文エラーが発生します。
$ echo "$(( 1.3 ))"
bash: 1.3 : syntax error: invalid arithmetic operator (error token is ".3 ")
problem1
変数名()の後にドットが続き、他の変数名()が続く場合も同様ですsh
。
$ echo "$((problem1.sh))"
bash: problem1.sh: syntax error: invalid arithmetic operator (error token is ".sh")
演算子が+
ドットでない場合、式は機能します。
$ echo "$((problem1+sh))"
34
34に設定した場合problem1
(上記と同じ)
もしそうなら、比較できる唯一の方法はひも使用することです[[…]]
:
$ [[ problem1.sh == problem1.sh ]] && echo YES
YES
(この特別な場合は、変数拡張がなく、文字列にグローバル文字がないため、文字列の右側を引用しませんが、==
通常文字列の右側を引用します==
。)
またはあなたが書いたものと似ています。
if [[ "problem1.sh" == "problem1.sh" ]]
then printf "Okay"
fi
答え2
予想されるように、((==))は2つの数値を比較します。ただし、(())では便宜上変数名のみを書くこともできます。 $ VARを書く必要はなく、VARだけを書くこともできます。
また、エラーメッセージには引用符が含まれていません。私はこれに少し驚きました。実際にはそうではありません。パーサーは代替項目があるかどうかを確認し、引用符を削除した単語を渡します。
それでも私はパーサーが.;に会うまで問題1を変数名として受け入れるので、「.sh」で始まるわからないテキストを報告すると信じています。