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