web-dev-qa-db-ja.com

シェルスクリプトでのこの$ {@:2}の意味

これはシェルスクリプトで見ます。

variable=${@:2}

何してるの?

30

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

参考文献

39
slm

これはksh機能であり、bashと最近のバージョンのzshにも含まれています。

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

例えば:

$ 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およびbashとは対照的に、zsh配列はスカラー変数とは異なる変数型であり、スパースではありません(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]要素にのみ展開されます。特殊なケースとして、またksh93およびbashとの移植性のために、zsh0$@最初の要素も受け入れ、それを$0として扱います。

したがって、3つのシェルすべてで移植性のある${a[@]:x:n}および${@:x:n}を使用できますが、これはスパースでない配列に対してのみであり、IFSの値に注意してください。

15