$ {@:-1}は実際に最後のパラメータを返しますか?

$ {@:-1}は実際に最後のパラメータを返しますか?

2つのパラメータがある場合は、次のコードを実行しています。

if (( $# == 2 )); then
  : ${fdir:="${@:-1}"}
  pfm -w2 "" "unspecified -d option"
  echo "use last argument as substitute"
  printf '%s\n\n' "fdir: ${@:-1}"
  echo "\$1: $1  \$2: $2"

これが結果です

pregion --dyn "John" ./01cuneus
pregion --dyn John ./01cuneus

unspecified -d option
use last argument as substitute
fdir: John

./01cuneus

$1: John  $2: ./01cuneus

答え1

いいえ、"${@:-1}"ありません。しかし"${@: -1}"、それは。

ただし、少なくともBashとKshでは、位置引数が指定されていない場合はシェル名が"${@: -1}"提供されます"$0"。これは、位置引数がすべての場所に${@:0}指定されている場合と似ています。 Zshはを提供したり、整理していない$0ようです。$0${@: -1}${@[-1]}

ここでの問題は、これが${var:-value}基本拡張に拡張される標準拡張であることです。もし変わりやすい設定されていないか空です。部分文字列/配列スライス拡張${var:p:n}${@: -1}標準ではなく、シェルから${@:-1}基本拡張として解釈される特別なケースです$@。空白は明確なので、インデックスを変数に入れます。i=-1; echo "${@:i}"

set -- a b c        
echo "${@: -1}"       # prints 'c', the last element
echo "${@:-1}"        # prints 'a b c'

set -- 
echo "${@: -1}"       # prints '/bin/bash' or something like that
echo "${@:-1}"        # prints '1', the default value given
echo "${@:-no args}"  # prints 'no args'

また、コメントで述べたように、in拡張は引用されてい: ${fdir:="${@:-1}"}ないため、シェルがランダムに長いファイル名のリストを生成する可能性があります。これは: "${fdir:="${@: -1}"}"より読みやすい方法で防ぐことができます。[ -z "$fdir"] && fdir="${@: -1}"

関連情報