1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルにおける括弧、中括弧、中括弧の違いについて

2022-01-05 11:39:06

I. 括弧、括弧()

1. 片仮名括弧()

  コマンド群です。括弧内のコマンドは新しいサブシェルシーケンスで実行されるため、括弧内の変数はスクリプトの他の部分で使用できません。括弧内の複数のコマンドは、セミコロンで区切られます。最後のコマンドはセミコロンなしで実行でき、各コマンドと括弧の間にスペースがある必要はありません。

  コマンドの代用。cmd` と同じように、シェルはコマンドラインをスキャンして $(cmd) 構造体を見つけ、 $(cmd) の cmd を一度実行してその標準出力を取得し、その出力を元のコマンドに入れる。tcshのように、これをサポートしないシェルもあります。

  は配列を初期化するために使用します。例: array=(a b c d)

2. 二重かっこ(( ))。

  整数展開。この拡張機能は整数型を計算し、浮動小数点型はサポートしない。((exp)) 構造体は、算術式の値を展開し、計算する。式の結果が 0 の場合、返される終了ステータスコードは 1、つまり "false" であり、0 以外の値の式が返す終了ステータスコードは 0、つまり "true" になる。論理判定の場合、式 exp は真の場合は 1、偽の場合は 0 となる。

  2.括弧内の演算子や式は、C言語の規則に従う限り、$((exp))でも、三項演算子でも使用可能です。異なる丸め(2進数、8進数、16進数など)演算を行う場合、出力は自動的に10進数に変換されます。例:echo $((16#5f)) 結果は95(16進数→10進数)です。

  (3) ( ) を使うだけで変数の値を再定義することもできます。例えば、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 ] を使うことができます。

II. 大括弧、角括弧 [].

1.シングルブラケット [].

  bashの内部コマンドである[ とtestは等価です。絶対パスを使わない場合は、通常bashに付属しているコマンドを使います。if/test構造の左括弧はtestを呼び出すためのコマンド識別子で、右括弧は条件判断を閉じるためのものです。コマンドは引数を比較式またはファイルテストとして受け取り、比較の結果に基づいて終了ステータスコードを返す。右括弧はif/test構造では必要ないが、Bashの新しいバージョンでは必要である。

  Test と [] で使用できる比較演算子は == と ! = だけです。どちらも文字列比較に使用され、 -eq, -gt でしかできない整数比較には使用できません。 文字列比較と整数比較のどちらも大なり小なりの記号をサポートしていません。どうしても使いたい場合は、"ab" と "bc" を比較する場合、文字列比較のエスケープ形式を使うことができます。[ab \ < bc ]であれば、結果は真、つまり戻り値は0です。

  文字範囲。正規表現の一部として使用し、マッチする文字の範囲を記述します。テスト用として、括弧内に正規表現を使用することはできません。

  ④配列構造の場合,配列の各要素の番号を参照するために括弧を使用する。

2、二重カギ括弧 [[ ] ]。

  は、プログラミング言語 bash のキーワードです。コマンドではなく、[[ ]]構造は[ ]構造よりも一般的です。と]]の間の文字はすべて、ファイル名の展開や単語の分割は行われませんが、引数の展開やコマンドの置換は行われます。

  文字列のパターンマッチをサポートし、=~演算子を使えばシェルの正規表現も可能です。文字列の比較は、右辺を単なる文字列ではなくパターンとして行うことができます。例えば、[[ hello == hell?] [[ ]]内の文字列やワイルドカードにマッチする場合、引用符は必要ありません。

  条件判断の構造を[[ ... ]]とすることで、スクリプトの論理的な誤りを防ぐことができます。例えば、&&、||、<、>演算子は[[ ]]条件判定構造では正常に存在できますが、[ ]構造で現れるとエラーになります。例えば、if [[ $a ! = 1 && $a ! = 2]] を直接使用し、二重括弧が適用されない場合は、if [ $a -ne 1] && [ $a ! = 2] または if [ $a -ne 1 -a $a ! = 2 ] を使用することが可能です。

  の中の式は、④bash で処理されます。

1. 一般的な使用方法

  中括弧の展開です。(ワイルドカード (グロビング)) を使用すると、中括弧内のファイル名が展開されます。中括弧の中では、空白が引用されるかエスケープされない限り、空白は許されません。最初の: は、中括弧内のカンマで区切られたファイルのリストを展開します。例えば、touch {a,b}.txt は a.txt b.txt となる。2つ目のタイプ:中括弧内のドット(...)で分割された連続したファイルのリストを展開します。例えば、touch {a..d}.txt は a.txt b.txt c.txt d.txt と表示されます。

{{コード

  コードブロックは内部グループとも呼ばれ、この構造では実際には無名関数が作成されます。括弧内のコマンドとは異なり、中括弧内のコマンドは新しいサブシェルを開いて実行されるわけではありません。括弧内のコマンドはセミコロンで区切られ、最後のコマンドもセミコロンでなければなりません。最初の{}の中のコマンドと左の括弧の間にはスペースを入れなければなりません。

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

  ① # 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 :変数varが空の場合、コマンドラインでstringに置き換えます。 ${var:-string},${var:+string},${var:=string},${var:?string} それ以外の場合、変数varが空でなければ、変数varの値で置き換える ${var:-string} and ${var:=string} について ${var:-string} の置換規則と同じです。 ${var:-string} ただし {コード var が空の場合、文字列に置き換えます。 ${var:=string} という変数に文字列を代入しながら ${var:-string} よくある使い方は、変数に値が割り当てられているかどうかを判断し、割り当てられていない場合はデフォルト値を割り当てることです。

  ② ${var:=string} は上記と逆の置換ルール、つまりvarが空でない場合のみ文字列に置換され、varが空の場合は置換されず、変数varの値、つまりnull値に置換されるのである。(この時点で変数varは空なので、2つの文は等価である)。

  ③ ${var:=string} 置換ルールは、変数varが空でない場合、変数varの値を ${var:=string} 変数varが空の場合は、標準エラーに文字列を出力し、スクリプトを終了する。この機能を利用して、変数に値が設定されているかどうかを確認することができる。

  追加拡張:上記5つの置換構造において、stringは定数値である必要はなく、他の変数の値やコマンドの出力であってもよい。

シェルにおけるカッコ、ブラケット、中括弧の違いについては、この記事が全てです。シェルにおけるカッコ、ブラケット、中括弧の違いについては、BinaryDevelopの過去の記事を検索するか、以下の関連記事を引き続きご覧ください。