シェルスクリプトにおけるこの${@:2}の意味は何ですか?

シェルスクリプトにおけるこの${@:2}の意味は何ですか?

これはシェル スクリプトで確認できます。

variable=${@:2}

それは何をしているのですか?

答え1

これは、Bash の特殊変数 の内容を示しています$@。この変数にはすべてのコマンドライン引数が含まれており、このコマンドは 2 番目以降のすべての引数を取得して変数 に格納しますvariable

ここにサンプルスクリプトがあります。

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

実行例:

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5

参考文献

答え2

これは、 および最近のバージョンkshにも搭載されている機能です。bashzsh

kshおよびではbash、 構文を使用して配列の複数の要素にアクセスできます。この構文は${array[@]:first:length}、最大でlength(または が省略されている場合はすべて) の配列要素(インデックスに基づいて数値的にソートされた配列の要素のリスト) に展開され、インデックスが 以上の最初の要素から始まります。スカラー コンテキストの場合 (ここではスカラー変数への割り当て)、要素のリストは および でスペース文字で結合され、 で の最初の文字( が空の場合は何もなく、設定されていない場合はスペース) と結合されます。lengtharrayfirstbashksh93$IFS$IFSzsh

例えば:

$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>

$@は特殊なケースです。は位置パラメータ ( 、...)$@の配列です。 ただし、 と一緒に使用すると、も含まれます。 したがって、は と同じですが、他の配列とは異なります。$1$2:$0${@:1}$@${@:0}

ではzsh、若干異なります。 は互換性のために最近になって構文zshを追加しましたが、要素の範囲を選択するための独自の構文があります。ksh

kshおよびとは異なりbashzsh配列はスカラー変数とは異なる変数型であり、スパースではなく( にはzsh別の変数型として連想配列があります)、インデックスは 0 ではなく 1 から始まります。

の場合zsh、配列要素の範囲には$a[first,last]last末尾から逆方向に数えるために を負の値にすることもできます)を使用してアクセスします。

zsh

a[23]=a a[5]=b a[235]=c a[45]=d

は、ほとんどが空の 235 個の要素を持つ配列を作成します。 は、$a[12,50]要素 12 から 50 に展開され、 は(空の) 要素と要素${a[@]:12:2}にのみ展開されます。 特殊なケースとして、また およびとの移植性のために、は の最初の要素も受け入れ、それを として扱います。$a[12]$a[13]ksh93bashzsh0$@$0

${a[@]:x:n}したがって、と を3 つのシェルすべてで移植可能に使用できます${@:x:n}が、非スパース配列に対してのみであり、 IFS の値に注意してください。

関連情報