shellの中の各括弧の役割について詳しく説明します(),(),[],[],{}(推奨)

7258 ワード

一、括弧、丸括弧()
1、小かっこ()
①コマンド群。括弧内のコマンドは、サブshellを新たに開いて順次実行しますので、括弧内の変数は、スクリプトの残りの部分では使用できません。括弧の中の複数のコマンドは、セミコロンで区切られています。最後のコマンドはセミコロンがなくてもいいです。各コマンドと括弧の間にはスペースがない必要があります。
②コマンド置換。`cmd`に相当して、shellは一回のコマンドラインをスキャンして、ドル(cmd)の構造を発見して、ドル(cmd)の中のcmdを一回実行して、その標準出力を得て、更にもとのコマンドに出力します。一部のshellはtcshのようにサポートされていません。
③配列を初期化するために使用します。例えば:array=(a b c d)
2、小かっこ(()
①整数拡張。この拡張計算は整数型の計算で、浮動小数点型はサポートされていません。exp)構造を拡張し、演算式の値を計算します。表式の結果が0であれば、戻りの終了状態コードは1であり、または「偽」であり、一方、ゼロでない表現で返される終了状態コードは0であり、または「true」であります。論理判定では、式expが真なら1、偽は0となります。
②括弧内の演算子、表現がC言語演算規則に適合している限り、$(exp)にも3つの演算子にも使用できます。異なるキャリー(バイナリ、8進数、16進数など)を行うと、出力結果が自動的に10進数に変換されます。例:echoドル((16〓5 f)の結果は95(16進から10進へ)です。
③単に())を使っても変数値を再定義できます。例えば、a=5;((a++))は$aを6に再定義できます。
④算術演算比較でよく使われますが、二重括弧の変数は$記号のプレフィックスを使用しなくてもいいです。括弧内で複数の表現をサポートします。カンマで区切ります。括弧内の表式がC言語の演算規則に適合している限り、for((i=0)を直接使用できます。i<5;i+))は、二重括弧を使用しない場合、for i in`seq 0 4`またはfor i in{0.4}となります。また、if($i<5)を直接使用することができますが、二重括弧を使用しない場合はif[$i-lt 5]となります。
二、中かっこ、中かっこ[]
1、中かっこ[]
①bashの内部コマンドは、[testと同じです。私たちが絶対パスの指定をしなくても、普通はバックの命令を使います。if/test構造の左中かっこは、testを呼び出すコマンド識別子であり、右中かっこは閉じる条件判定である。このコマンドは、そのパラメータを比較式としたり、ファイルとしてテストしたりして、比較の結果から終了状態コードを返します。if/test構造では右中かっこが必要ではないが、新版のBashでは必須である。
②Testと[]で使用できる比較演算子は==と!=、両方は文字列の比較に使用され、整数の比較には使用できません。整数の比較は-eq、-gtという形式しか使用できません。文字列の比較であれ、整数の比較であれ、大きな番号より小さい番号はサポートされていません。もし本当に使いたいなら、文字列比較に対して意味変換形式が使えます。「ab」と「bc」を比較すれば、結果は本当です。つまり、戻り状態は0です。の論理和論理または-aおよび-o表現を使用します。
③文字の範囲。正規表現の一部として、マッチする文字範囲を記述します。test用途である中括弧内では正則は使用できません。
④array構造のコンテキストでは、中かっこは、配列内の各要素の番号を参照するために使用されます。
2、中かっこ[]
①[[ bashプログラム言語のキーワードです。コマンドではなく、[]より構造が一般的です。[和]の間のすべての文字はファイル名の拡張や単語の分割は発生しませんが、パラメータの拡張やコマンドの置き換えが発生します。
②文字列のパターンマッチングをサポートします。=~操作子を使用する場合は、shellの正規表現もサポートします。文字列を比較するときは、右の文字列だけでなく、右の文字列をモードとして使用できます。結果は本当です。[]で文字列またはワイルドカードにマッチします。引用符は必要ありません。
③[...]条件を使って構造を判断し、[...]ではなく、スクリプトの多くの論理エラーを防ぐことができます。たとえば、& 𞓜𞓜、<と>オペレータは正常に条件判定構造に存在することができますが、[]構造に現れたらエラーが発生します。例えばif[$a!=1&&&a!=2)]二重括弧が適用されていない場合は、if[$a-ne 1]&&[$a!=2)またはif[$a-ne 1-a$a!=2)です。
④bashは、2つの中かっこの表現を単独の要素と見なし、終了状態コードを返します。
例:

if ($i<5) 
if [ $i -lt 5 ] 
if [ $a -ne 1 -a $a != 2 ] 
if [ $a -ne 1] && [ $a != 2 ] 
if [[ $a != 1 && $a != 2 ]] 
for i in $(seq 0 4);do echo $i;done 
for i in `seq 0 4`;do echo $i;done 
for ((i=0;i<5;i++));do echo $i;done 
for i in {0..4};do echo $i;done
三、大かっこ、大かっこ、{}
1、一般的な使い方
①大かっこ展開。(汎用(globbling)は、大括弧内のファイル名を拡張します。大括弧では、この空白が参照または転送されない限り、空白は許されません。一つ目は、大かっこ中のカンマで区切られたファイルリストを拡張します。touch{a,b}.txtの結果はa.txt b.txtです。第二種類:大きい括弧の中で点(.)で分割する順序のファイルのリストに対して展開の作用を発揮して、例えば:touch{a.d}.txtの結果はa.txt b.txt c.txt d.txt

# ls {ex1,ex2}.sh 
ex1.sh ex2.sh 
# ls {ex{1..3},ex4}.sh 
ex1.sh ex2.sh ex3.sh ex4.sh 
# ls {ex[1-3],ex4}.sh 
ex1.sh ex2.sh ex3.sh ex4.sh
②コードブロックは、内部グループとも呼ばれ、この構造は事実上匿名関数を作成した。括弧内のコマンドと違って、大括弧内のコマンドは、新しいサブshellで動作しません。すなわち、スクリプトの残りの部分は、括弧内の変数を使用してもいいです。括弧内の命令間はセミコロンで区切られています。最後の一つにもセミコロンが必要です。{}の最初のコマンドと左括弧の間にはスペースが必要です。
2、いくつかの特殊な代替構造

${var:-string},${var:+string},${var:=string},${var:?string}
${var:-string} ${var:=string}:変数varが空であれば、${var:-string}をコマンドラインにstringで置換します。さもなければ変数varが空でない場合、${var:-string}を変数varの値で置換します。${var:=string}の代替規則は${var:-string}と同じで、${var:=string}がもしvarが空の場合は、${var:=string}をstringで置換しながら、変数varにstringを付与する場合には、変数var:${var:=string}がよく使う使い方として、ある変数が割り当てられているかどうかを判断し、ない場合はデフォルト値を付与する。
${var:+string}の代替規則は、上のものとは反対に、つまり、varが空でないときにのみstringに置換され、varが空である場合には、変数varの値、すなわち空の値に置換されない(変数varは空ですので、この2つの言い方は等価です。
${var:?string} は、変数varが空でない場合は、${var:?string}を変数varの値で置換する規則である。変数varが空の場合は、stringを標準エラーに出力し、スクリプトから終了します。この特性を利用して変数の値が設定されているかどうかを確認します。
補足拡張:上の5つの代替構造においては、必ずしもstringは定数ではなく、他の変数の値またはコマンドの出力が可能です。
3、4種類のモードマッチング置換構造
パターンマッチングの記憶方法:
シシシは左を取る(キーボードの上で菗はドルの左側)です。
%は右に削除されます。キーボードの%は$の右にあります。
铉と%の単一シンボルは最小整合であり、二つの同じ符号は最大整合である。

${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
第一のパターン:${variable%pattern}、このようなモードの時、shellはvariableの中で探して、それがあげるモードのpatternが終わるかどうかを見て、もしそうならば、コマンドラインからvariableの中の内容を右の一番短いマッチングモードを削除します。
第二のモード: ${variable%%pattern},このようなモードの時、shellはvariableの中で探して、それがあげるモードのpatternが終わるかどうかを見て、もしそうならば、コマンドラインからvariableの中の内容を右の一番長いマッチングモードを削除します。
第3のモード:${variable#pattern}このようなモードの時、shellはvariableの中で探して、それがあげるモードpatternが始まるかどうかを見て、もしそうならば、命令行からvariableの中の内容を左の一番短い整合モードを削除します。
第4のモード:${variable##pattern} このようなモードの時、shellはvariableの中で探して、それがあげるモードのpatternが終わるかどうかを見て、もしそうならば、コマンドラインからvariableの中の内容を右の一番長いマッチングモードを削除します。
この四つのモードの中でバリアフリーの値は変わりません。中には、patternに*一致符号を使った時にのみ%と%%があります。構造の中のpatternはワイルドカードをサポートします。*はゼロまたは複数の任意の文字を表します。は、1つの任意の文字にのみマッチすることを表します。[...]は、中かっこの中の文字にマッチすることを表します。[!...]中かっこにマッチしない文字を表します。

# var=testcase 
# echo $var 
testcase 
# echo ${var%s*e} 
testca 
# echo $var 
testcase 
# echo ${var%%s*e} 
te 
# echo ${var#?e} 
stcase 
# echo ${var##?e} 
stcase 
# echo ${var##*e}
# echo ${var##*s} 
e 
# echo ${var##test} 
case
4、文字列抽出と置換

${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}
第1のモード:${var:num}、このようなモードの時、shellはvarの中で第numの文字から最後の文字まで抽出します。もしnumが正数なら、左の0箇所から始まります。numが負の場合は、右から文字列を抽出しますが、記号の後にスペースまたは数字またはnum全体に括弧を入れて使用しなければなりません。
第二のモード:${var:num1:num2}, num 1は位置であり、num 2は長さである。は、$var文字列の$num 1番目の位置から$num 2の長さのサブストリングを抽出することを意味します。マイナスにできません。
第3のモード:${var/pattern/pattern}は、var文字列の最初の一致のpatternを別のpatternに置き換えることを表す。
第4のモード:${var//pattern/pattern}は、var文字列のすべてのマッチ可能なpatternを別のpatternに置き換えることを意味する。

[root@centos ~]# var=/home/centos 
[root@centos ~]# echo $var 
/home/centos 
[root@centos ~]# echo ${var:5} 
/centos 
[root@centos ~]# echo ${var: -6} 
centos 
[root@centos ~]# echo ${var:(-6)} 
centos 
[root@centos ~]# echo ${var:1:4} 
home 
[root@centos ~]# echo ${var/o/h} 
/hhme/centos 
[root@centos ~]# echo ${var//o/h} 
/hhme/cenths
四、記号の後の括弧
(1){a}変数aの値は、曖昧性を起こさない場合は、大括弧を省略することができます。
(2)$(cmd)コマンドの置き換えは、`cmd`と同じ効果で、shellコマンドcmdの出力の結果、いくつかのShellバージョンがサポートされていません。
(3)$(expression)と`exprexpression`の効果は同じで、数学式expの数値を計算します。expはC言語の演算規則に符合すればよく、さらには3つの演算子と論理式まで計算できます。
五、使う
1、複数のコマンドの実行
(1)小かっこ、(cmd 1;cmd 2;cmd 3)サブshellを新たに開いてコマンドcmd 1,cmd 2,cmd 3を順次実行します。各コマンドはセミコロンで区切られています。最後のコマンドの後にセミコロンがなくてもいいです。
(2)大かっこ、{cmd 1;cmd 2;cmd 3;現在のshellの順にコマンドcmd 1,cmd 2,cmd 3を実行します。各コマンドの間はセミコロンで区切られています。最後のコマンドの後はセミコロンが必要です。最初のコマンドと左括弧の間はスペースで区切られていなければなりません。
{}および()に対しては、括弧内のリダイレクト記号は、このコマンドにのみ影響を及ぼし、括弧外のリダイレクト記号は、括弧内のすべてのコマンドに影響を及ぼします。
締め括りをつける
以上は小编が绍介したshellの中の各括弧の役割()、()、[]、[]、{}、皆さんに助けてほしいです。もし何かご质问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。