サーチ…


構文

  • ["$ 1" = "$ 2"] #A "["ブラケットは実際にはコマンドです。このためには、それの後にスペースが必要です。
  • test "$ 1" = "$ 2" #Testは "["コマンドの同義語です

パラメーター

パラメータを[またはテストする] 詳細
ファイル演算子 詳細
-e "$file" ファイルが存在する場合はtrueを返します。
-d "$file" ファイルが存在し、ディレクトリである場合にtrueを返します。
-f "$file" ファイルが存在し、通常のファイルである場合はtrueを返します。
-h "$file" ファイルが存在し、シンボリックリンクである場合はtrueを返します。
文字列比較器 詳細
-z "$str" 文字列の長さがゼロの場合はtrue
-n "$str 文字列の長さがゼロでない場合はtrue
"$str" = "$str2" 文字列$ strが文字列$ str2と等しい場合は真です。整数には最適ではありません。それはうまくいくかもしれませんが、
"$str" != "$str2" 文字列が等しくない場合はTrue
整数コンパレータ 詳細
"$int1" -eq "$int2" 整数が等しい場合はTrue
"$int1" -ne "$int2" 整数が等しくない場合はtrue
"$int1" -gt "$int2" int1がint 2より大きい場合はtrue
"$int1" -ge "$int2" int1がint2以上の場合はtrue
"$int1" -lt "$int2" int1がint 2より小さい場合はtrue
"$int1" -le "$int2" int1がint2以下の場合はtrue

備考

bashには多くのコンパレータパラメータが用意されています。すべてがここにリストされているわけではありません。

if文

if [[ $1 -eq 1 ]]; then
    echo "1 was passed in the first parameter"
elif [[ $1 -gt 2 ]]; then
    echo "2 was not passed in the first parameter"
else
    echo "The first parameter was not 1 and is not more than 2."
fi

クロージングfi必要であるが、 elifおよび/またはelse句は省略することができます。

前セミコロンthen 、単一の行に2つのコマンドを組み合わせるための標準構文です。彼らは唯一の場合は省略することができthen 、次の行に移動します。

角括弧[[構文の一部ではありませんが、コマンドとして扱われます。テスト中のこのコマンドの終了コードです。したがって、ブラケットの周囲には常にスペースを入れる必要があります。

これはまた、どのコマンドの結果もテストできることを意味します。コマンドの終了コードがゼロの場合、ステートメントはtrueと見なされます。

if grep "foo" bar.txt; then
    echo "foo was found"
else
    echo "foo was not found"
fi

数式は、二重括弧の中に置かれている場合でも、同じ方法で0または1を返し、テストすることもできます。

if (( $1 + 5 > 91 )); then
    echo "$1 is greater than 86"
fi

1つの括弧で囲まれたif文を見付けることもできます。これらはPOSIX標準で定義されており、Bashを含むすべてのPOSIX準拠のシェルで動作することが保証されています。構文は、Bashの構文と非常によく似ています。

if [ "$1" -eq 1 ]; then
    echo "1 was passed in the first parameter"
elif [ "$1" -gt 2 ]; then
    echo "2 was not passed in the first parameter"
else
    echo "The first parameter was not 1 and is not more than 2."
fi

Whileループ

#! /bin/bash

i=0

while [ $i -lt 5 ] #While i is less than 5
do
    echo "i is currently $i"
    i=$[$i+1] #Not the lack of spaces around the brackets. This makes it a not a test expression
done #ends the loop

テスト中(whileステートメントの後)に角かっこの周囲にスペースがあることに注意してください。これらのスペースは必要です。

このループは次を出力します。

i is currently 0
i is currently 1
i is currently 2
i is currently 3
i is currently 4

For Loop

#! /bin/bash

for i in 1 "test" 3; do #Each space separated statement is assigned to i
    echo $i
done

他のコマンドはループする文を生成できます。 「Forループを使用して数値を反復する」の例を参照してください。

これは、

1
test
3

Forループを使用したリストの反復処理

#! /bin/bash

for i in {1..10}; do # {1..10} expands to "1 2 3 4 5 6 7 8 9 10"
    echo $i
done

これにより、以下が出力されます。

1
2
3
4
5
6
7
8
8
10

Cスタイルの構文によるループの場合

Cスタイルforループの基本的なフォーマットは次のとおりです。

for (( variable assignment; condition; iteration process ))

ノート:

  • Cスタイルのforループ内での変数の代入には、通常の代入とは異なり空白を含めることができます
  • Cスタイルのforループ内の変数の前に$はありません。

例:

for (( i = 0; i < 10; i++ ))
do
    echo "The iteration number is $i"
done

また、Cスタイルforループ内で複数の変数を処理することもできます。

for (( i = 0, j = 0; i < 10; i++, j = i * i ))
do
    echo "The square of $i is equal to $j"
done

ループまで

conditionがtrueになるまでループが実行されるまで

i=5
until [[ i -eq 10 ]]; do #Checks if i=10
    echo "i=$i" #Print the value of i
    i=$((i+1)) #Increment i by 1
done

出力:

i=5
i=6
i=7
i=8
i=9

iが10に達すると、untilループの条件が真になり、ループが終了します。

続けると壊れる

続行の例

for i in [series]
do
    command 1
    command 2
    if (condition) # Condition to jump over command 3
            continue # skip to the next value in "series"
    fi
    command 3
done

ブレークの例

for i in [series]
do
    command 4
    if (condition) # Condition to break the loop
    then
            command 5 # Command if the loop needs to be broken
            break
    fi
    command 6 # Command to run if the "condition" is never true 
done

配列のループ

forループ:

arr=(a b c d e f)
for i in "${arr[@]}";do
    echo "$i"
done

または

for ((i=0;i<${#arr[@]};i++));do
    echo "${arr[$i]}" 
done

whileループ:

i=0
while [ $i -lt ${#arr[@]} ];do
    echo "${arr[$i]}"
    i=$(expr $i + 1)
done

または

i=0
while (( $i < ${#arr[@]} ));do
    echo "${arr[$i]}"
    ((i++))
done

ループブレイク

複数のループを中断する:

arr=(a b c d e f)
for i in "${arr[@]}";do
    echo "$i"
    for j in "${arr[@]}";do
        echo "$j"
        break 2
    done
done

出力:

a
a

ブレークシングルループ:

arr=(a b c d e f)
for i in "${arr[@]}";do
    echo "$i"
    for j in "${arr[@]}";do
        echo "$j"
        break
    done
done

出力:

a
a
b
a
c
a
d
a
e
a
f
a

大文字と小文字を切り替える

case文では、値を1つの変数と照合できます。

case渡された引数が展開され、それぞれのパターンと照合しようとします。

一致が見つかった場合は、コマンドupto ;;実行される。

case "$BASH_VERSION" in
 [34]*)
    echo {1..4}
    ;;  
  *)
    seq -s" " 1 4
esac

パターンは正規表現ではなく、シェルパターンマッチング(別名グロブ)です。

list-of-wordsパラメータを持たないForループ

for arg; do
    echo arg=$arg
done

単語のリストを持たないforループのパラメータは、代わりに位置のパラメータを繰り返し処理します。言い換えれば、上の例はこのコードと同じです:

for arg in "$@"; do
    echo arg=$arg
done

言い換えれば、あなたfor i in "$@"; do ...; done書くことをキャッチするならばfor i in "$@"; do ...; done 、ちょうどドロップin一部、および単に書きfor i; do ...; done

コマンドリストの条件付き実行

コマンドリストの条件付き実行の使用方法

組み込みコマンド、式、関数、および外部コマンドまたはスクリプトは、条件付きで&& (および)および||を使用して実行できます。 (または)演算子。

たとえば、 cdコマンドが成功した場合にのみ、現在のディレクトリを表示します。

cd my_directory && pwd

同様に、 cdコマンドが失敗して大惨事が発生した場合、これは終了します。

cd my_directory || exit
rm -rf *

このように複数のステートメントを組み合わせる場合、(多くのCスタイルの言語とは異なり) これらの演算子は優先順位がなく、左結合であることを覚えておくことが重要です。

したがって、このステートメントは期待どおりに動作します...

cd my_directory && pwd || echo "No such directory"
  • cdが成功すると、 && pwd実行され、現在の作業ディレクトリ名が表示されます。 pwdが失敗する(希少性がない)限り、 || echo ...は実行されません。
  • cdが失敗すると、 && pwdはスキップされ、 || echo ...が実行されます。

しかし、これは(あなたが考えている場合ではないだろうif...then...else )...

cd my_directory && ls || echo "No such directory"
  • cdが失敗すると、 && lsはスキップされ、 || echo ...が実行されます。
  • cdが成功すると、 && lsが実行されます。
    • lsが成功すれば、 || echo ...は無視されます。 (ここまでは順調ですね)
    • しかし、もしlsが失敗すれば、 || echo ...も実行されます。

      前のコマンドで あるlsではなくcdです。

コマンドリストの条件付き実行を使用する理由

条件付き実行は、 if...thenより速いif...thenが、主な利点は、関数とスクリプトが早期に終了することです。

structや変数などのためにメモリが明示的に割り当てられるCような多くの言語とは異なり、 bashはこれをカバーの下で扱います。ほとんどの場合、関数を終了する前に何かをクリーンアップする必要はありません。 returnステートメントは、スタックの戻りアドレスで関数とピックアップの実行にローカルなすべての割り当てを解除します。

できるだけ早く関数またはスクリプトを終了することで、コードの不要な実行を回避してパフォーマンスを大幅に改善し、システム負荷を軽減できます。例えば...

my_function () {

    ### ALWAYS CHECK THE RETURN CODE

    # one argument required. "" evaluates to false(1)
    [[ "$1" ]]             || return 1

    # work with the argument. exit on failure
    do_something_with "$1" || return 1
    do_something_else      || return 1

    # Success! no failures detected, or we wouldn't be here
    return 0
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow