この$ {@:2}はシェルスクリプトで何を意味しますか


27

これはシェルスクリプトに表示されます。

variable=${@:2}

何してるの?


それはまさにスクリプトで示した方法ですか?構文は配列のように見えますが、一部が欠けています。スクリプトからこの行の周りにいくつかの行を投稿してください。
slm

これは、2番目の文字から始まる変数です。var="my_value"; echo var="${var[@]:2}"; echo "$var"違いを見ます?
バレンティンバジラミ

回答:


34

$@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

参照資料


9
示されている手法は、指定された引数を単一の文字列にマッシュします。あなたが別の引数としてそれらを維持する必要がある場合は、配列を使用する:vars=( "${@:2}" )
グレンはジャックマン

@glennjackman-それを指摘してくれてありがとう。
slm

2
また、中括弧の使用にも注意してください。常に中括弧を使用することになっていますが、Bashではコンテキストが明確な場合は中括弧を省略できます。したがって、$@${@}は同じですが、後者は「より正確な」構文です。があいまいであり、したがって、同じものではないと解釈される${@:2}ため、括弧を使用する必要$@:2があります${@}:2
水田ランダウ

14

これkshは、bashおよびの最近のバージョンにもある機能ですzsh

kshbash、あなたが使用して配列のいくつかの要素にアクセスできる${array[@]:first:length}までに展開構文を、length(またはすべての場合はlength省略されている)の要素arrayから始めて、配列(配列の要素のリストでは、インデックスに数値ソート)インデックスが1以上の最初のものfirst。(ここではスカラー変数への代入のように)スカラーコンテキストでの要素のリストがで空白文字と結合した場合bashksh93し、最初の文字を持つ$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]要素${a[@]:12:2}12〜50に展開され、(空の)要素$a[12]$a[13]要素にのみ展開されます。特殊なケースとして、再度と移植性ksh93とはbashzshまた受け付ける0第ための要素$@とし、扱いが$0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.