bash は zsh の $@[2,$#] と同じです。

bash は zsh の $@[2,$#] と同じです。

(注:この質問の動機は、単にbashプログラミング知識を向上させるためのものです。)

bash対応する表現を知りたいです。zsh$@[2,$#]まっすぐ$@シェル関数(またはスクリプト)のコマンドライン引数の配列()の範囲を指定します。

(アドレス範囲をオンラインで見つけたすべてのソリューション$@bash間接的な$@アドレス指定はすべて中間変数に最初に割り当てる必要があるためです。以下の例を参照してください。)

具体的に言えば、bash次のテスト機能zshと同等のものは何ですか?

testfn () {
  printf '>%s<\n' $@[2,$#]
}

% testfn a b c d
>b<
>c<
>d<

上記のように、私が思いついた最も近い方法は次のとおりです。$@中間変数に割り当てる必要があります。

testfn () {
  holdargs=( $@ )
  printf '>%s<\n' "${holdargs[@]:1}"
}

中間変数を必要としないすべての試行はエラーのため失敗しますbad substitution

ベストアンサー1

これは私にとって効果的です。

testfn () {
   printf '>%s<\n' "${@:2}"
}

例:

$ testfn a b c d
>b<
>c<
>d<

~からBash b 初心者ガイド

$@     Expands to the positional parameters, starting from one. When the 
       expansion occurs within double quotes, each parameter expands to a
       separate word.

位置パラメータセクションの表示バッシュハッカーウィキしかも広く使われているより多くの例と詳細については、セクションを参照してください。

これは通常二重引用符を使用する場合です$@"$@"それ以外の場合、"${@:2}"返された結果は二重引用符の結果になります。

$@配列要素には、次の表記法を使用してアクセスできます。

"${@:START:COUNT}"

「過剰使用」セクションからの抜粋

これにより、STARTから始めてCOUNT個の位置パラメータが展開されます。 COUNTは省略できます(${@:START})、この場合、STARTで始まるすべての場所引数が拡張されます。

要素が空ですか?

他の人は、上記の内容が空の要素を処理できないため、同じではないと指摘しました。私はBash 4.1.7を使っていますが、そうです。

例:

$ testfn "" a "" c d e
>a<
><
>c<
>d<
>e<

$ testfn '' a '*' c d e
>a<
>*<
>c<
>d<
>e<

$ testfn "" a " " c d e
>a<
> <
>c<
>d<
>e<

おすすめ記事