[解決済み】Bashの簡単な論理演算子
2022-03-30 17:28:49
質問
私はいくつかの変数を持っており、次の条件をチェックしたい(言葉で書き出すと、私のbashスクリプトの試みは失敗しました)。
if varA EQUALS 1 AND ( varB EQUALS "t1" OR varB EQUALS "t2" ) then
do something
done.
そして、失敗作の中で、私はこう考えました。
if (($varA == 1)) && ( (($varB == "t1")) || (($varC == "t2")) );
then
scale=0.05
fi
解決方法は?
あなたが書いたものは、実際にはほとんど動作しますが(変数がすべて数字であれば動作します)、慣用的な方法とはまったく言えません。
-
(…)
括弧内は サブシェル . その中にあるのは、他の多くの言語のような式ではありません。これはコマンドのリストである(括弧の外側と同じ)。これらのコマンドは別のサブプロセスで実行されるので、括弧の中で行われたリダイレクトや代入などは括弧の外には影響しない。 -
{ … }
中括弧は、コマンドをグループ化するという点では括弧と同じですが、グループ化ではなく、解析にのみ影響します。プログラムx=2; { x=4; }; echo $x
は4を表示するのに対しx=2; (x=4); echo $x
また、中括弧はスペースを入れ、閉じる前にセミコロンが必要ですが、括弧は必要ありません。これは単なる構文の癖です)。-
先頭がドル記号の場合。
${VAR}
は パラメータ展開 変数の値に展開され、さらに変換が可能です。
-
先頭がドル記号の場合。
-
((…))
を二重括弧で囲みます。 算術演算命令 他のプログラミング言語に似た構文で、整数の計算を行います。この構文は主に代入や条件文に使われる。-
算術式でも同じ構文が使われます
$((…))
は、式の整数値に展開される。
-
算術式でも同じ構文が使われます
-
[[ … ]]
二重括弧で囲む 条件式 . 条件式は、主に 演算子 のような-n $variable
で変数が空かどうかをテストし-e $file
は、ファイルが存在するかどうかをテストするために使用します。また、文字列の等値演算子もあります。"$string1" == "$string2"
(右辺がパターンであることに注意してください、例えば[[ $foo == a* ]]
は、次のようにテストします。$foo
で始まるa
一方[[ $foo == "a*" ]]
テスト if$foo
はまさにa*
) と、おなじみの!
,&&
と||
演算子で否定、接続、論理和を、括弧でグループ化を行います。各演算子の周りには空白が必要なことに注意してください(例.[[ "$x" == "$y" ]]
ではなく[[ "$x"=="$y" ]]
のような文字)、そしてスペースまたは;
は,括弧の内側と外側の両方にある(例.[[ -n $foo ]]
ではなく[[-n $foo]]
). -
[ … ]
は条件式の代替形式であり、より癖があります(しかし、より古く、より移植性があります)。今は何も書かず、それを含むスクリプトを見つけたときに気にするようにしましょう。
これは、bashでテストを書くときの慣用的な方法です。
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
他のシェルへの移植性が必要な場合は、このようにします (個々のテストを囲む追加の引用符と個別の括弧のセット、そして伝統的な
=
演算子ではなく、ksh/bash/zshの
==
のバリアント)。
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bash prints リテラルの改行をエコーする \n
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] Bashでコマンドライン引数を解析するには?
-
[解決済み】Bashでファイル名と拡張子を抽出する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】予期しないトークン 'fi' 付近の構文エラー
-
[解決済み】firebase-tools "-bash: firebase: command not found".
-
[解決済み】ログアウトと再ログインをせずに.bashrcの設定を再読み込みする方法?
-
[解決済み] '\r': command not found - .bashrc / .bash_profile [duplicate].
-
[解決済み] /bin/sh: apt-get: 見つかりません。
-
[解決済み] (standard_in) 1: bash スクリプトのシンタックスエラー
-
[解決済み] bash スクリプトの "${BASH_SOURCE[0]}" と $( cd $( dirname "xxx" && pwd )) の意味について
-
[解決済み] cygwin の ssh が終了時に "Killed by signal 1" と表示される
-
[解決済み] パイプと二重パイプのどちらの OR 演算子を使うか?
-
[解決済み] grepの出力に含まれる重複を削除する