GNU/Linux >> Linux の 問題 >  >> Linux

Linux シェルスクリプトでの 1 行の if/else 条件

一般的な使用のために、他の回答を要約するには:

複数行 if...then 声明

if [ foo ]; then
    a; b
elif [ bar ]; then
    c; d
else
    e; f
fi

単行版

if [ foo ]; then a && b; elif [ bar ]; c && d; else e && f; fi

OR 演算子の使用

( foo && a && b ) || ( bar && c && d ) || e && f;

メモ

AND および OR 演算子は、前の操作の結果コードが true/success (0) に等しいかどうかを評価することに注意してください。 )。そのため、カスタム関数が何か他のものを返す (または何も返さない) 場合、AND/OR 短縮形で問題が発生する可能性があります。そのような場合、 ( a && b ) のようなものに置き換えたいと思うかもしれません ( [ a == 'EXPECTEDRESULT' ] && b ) で など

( にも注意してください および [ は技術的にはコマンドであるため、前後に空白が必要です。

&& のグループの代わりに then a && b; else のようなステートメント 、 then $( a; b ); else のようなサブシェルでステートメントを実行することもできます 、ただし、これは効率が低下します。 result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ] のようなことをする場合も同じです ( foo && a && b ) || ( bar && c && d ) の代わりに .とにかく、その時点で、コンパクトではない複数行のものにもっと夢中になるでしょう.


まるで正しい軌道に乗っているかのようです。 「;」の後にelseステートメントを追加するだけです。 「then」ステートメントに続きます。また、最初の行と 2 番目の行を「&&」で結合するのではなく、セミコロンで分割します。

maxline='cat journald.conf | grep "#SystemMaxUse="'; if [ $maxline == "#SystemMaxUse=" ]; then sed 's/\#SystemMaxUse=/SystemMaxUse=50M/g' journald.conf > journald.conf2 && mv journald.conf2 journald.conf; else echo "This file has been edited. You'll need to do it manually."; fi

また、元のスクリプトでは、maxline を宣言するときに、問題を引き起こす可能性がある単一引用符 "'" の代わりにバッククォート "`" を使用しました。


質問に対する直接的な回答ではありませんが、OR 演算子を使用できます

( grep "#SystemMaxUse=" journald.conf > /dev/null && sed -i 's/\#SystemMaxUse=/SystemMaxUse=50M/g' journald.conf ) || echo "This file has been edited. You'll need to do it manually."

Linux
  1. 6 Linux の Bash シェル コマンド ライン チェーン演算子

  2. Linux で出力行ごとに 1 つのファイル名をリストするにはどうすればよいですか?

  3. linux/if.h と net/if.h の何が問題になっていますか?

  1. Linux シェル スクリプト:16 進数からバイナリ文字列へ

  2. stdin からパイプされたスクリプトを実行する (Linux/シェル スクリプト)

  3. Linux 端末からメールを 1 行で送信する

  1. Linuxシェルのコマンドラインエイリアス

  2. Linuxでシェルスクリプトを使用してJsonを解析する方法は?

  3. Makefileで1行の状態チェックイン?