シェルスクリプト引数をスキップする最も移植可能な方法は何ですか?

シェルスクリプト引数をスキップする最も移植可能な方法は何ですか?

UNIXシステムで実行するように設計されたポータブルラッパースクリプトの場合(必ずしもLinuxである必要はありません)、このコマンドは配列構文よりも優先すshiftべきですか?

#!/bin/sh
exec command ${1+"$@"}

比較:

#!/bin/sh
shift
exec command "$@"

答え1

exec command ${1+"$@"}と同じではありませんshift; exec command "$@"。後者は最初のパラメータを削除しますが、最初のパラメータは削除しません。

それがすることは、${1+"$@"}ifセットの拡張だけを適用することです。 POSIX互換シェルには違いはありません。位置引数が設定されていない場合は、何も拡張しないでください。しかし、私が理解しているように、より古いシェルのいくつかはガードを必要とするかもしれません。"$@"$1"$@"$1

一方、ksh/zsh/Bash では"${@:2}"位置引数が最初から提供されるため、$2実際にはリストを変更せずに最初の引数を最初に移動するのと似ています。

関連情報