(注:この質問の動機は、単に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<
$@ 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<