Bash関数内でスクリプトの位置引数を取得する方法はありますか?

Bash関数内でスクリプトの位置引数を取得する方法はありますか?

位置パラメータを取得するには、次の変数が使用されます。

$1, $2, $3, etc.
$@
$#

ただし、スクリプトの位置引数と関数の位置引数の両方として使用できます。

関数内でこれらの変数を使用すると、関数の位置引数が与えられます。

関数内でスクリプトの位置パラメータを取得する方法はありますか?

答え1

いいえ、直接ではありません。これは関数パラメータがそれを隠すためです。ただし、Bashまたはkshでは、スクリプトの引数を次に割り当てることができます。別の配列、そしてそれを使用してください。

#!/bin/bash
ARGV=("$@")
foo() {
     echo "number of args: ${#ARGV[@]}"
     echo "second arg: ${ARGV[1]}"
}
foo x y z 

配列番号付けは0から始まるので、次に$1進みます。${ARGV[0]}

答え2

Bashを使用してスクリプト引数を取得する別の方法は、シェル変数BASH_ARGCとBASH_ARGVを使用することです。

#!/bin/bash
shopt -s extdebug
test(){
  echo 'number of element in the current bash execution call stack = '"${#BASH_ARGC[*]}"
  echo 'the script come with '"${BASH_ARGC[$((${#BASH_ARGC[*]}-1))]}"' parameter(s)'
  echo 'the first is '"${BASH_ARGV[$((${#BASH_ARGV[*]}-1))]}"
  echo 'there is 2 way to get the parameters of this function'
  echo 'the first is to get $1,...,$n'
  echo '$1 = '"$1"
  echo '$2 = '"$2"
  echo 'the second with the use of BASH_ARGC and BASH_ARGV'
  echo 'this function '"${FUNCNAME[0]}"' come with '"${BASH_ARGC[0]}"' parameter(s)'
  echo 'the second is '"${BASH_ARGV[0]}"
  echo 'the first is '"${BASH_ARGV[1]}"
}
essai(){
  test paramtest1 "$3"
}
essai paramessai1 paramessai2 paramessai3

答え3

"$@"POSIX 移植可能なソリューションとして、時には元の引数を関数引数に追加し、関数内で引数を移動することが可能な場合があります。

#!/bin/sh
foo () {
  printf '%s-' "$@"
  printf '\n'
  # Save function parameters to custom variables
  x="$1"
  y="$2"
  z="$3"
  shift 3
  # At this point, "$@" regained its original value
  printf '%s-' "$x" "$y" "$z" "$@"
  printf '\n'
}
foo 1 2 3 "$@"

通貨例:

$ sh example.sh 4 5 6
1-2-3-4-5-6-
1-2-3-4-5-6-

答え4

シェルでコマンドを使用すると、shift以下のようにすべての位置パラメータにアクセスできます。パラメータが左に移動して最初の位置を占めます。

while (( "$#" ))
do
  echo $1
  shift
done

関連情報