サーチ…
構文
- ["$ 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
}