関数定義で位置パラメータを使用する

関数定義で位置パラメータを使用する

関数宣言内で位置パラメータ(コマンドラインから提供)をどのように使用しますか?

関数定義内では、$ 1と$ 2はグローバル位置パラメータではなく、関数自体の唯一の位置パラメータです!

答え1

呼び出し側範囲位置パラメーターは、関数では使用できません。何らかの方法で関数に渡すには呼び出し側が必要です。

ではbash、配列を使用してこれを実行できます(ただし、以外の配列は1以外のインデックス0から"$@"始まりますbash(inと同じですが、ksh他のすべてのシェルとは反対です)。

f() {
  printf 'Caller $1: %s\n' "${caller_argv[0]}"
  printf '    My $1: %s\n' "$1"
}
caller_argv=("$@")
f blah

または追加で渡します。

f() {
  printf 'Caller $1: %s\n' "$2"
  shift "$(($1 + 1))"
  printf 'My $1: %s\n' "$1"
}

f "$#" "$@" blah

これには、$1呼び出し元の位置引数の数が含まれているため、f独自の引数が始まる場所を知ることができます。

答え2

Bashでは、シェル変数BASH_ARGVを使用できます。

shopt -s extdebug
# create the array BASH_ARGV with the parameter of the script
shopt -u extdebug
# No more need of extdebug but BASH_ARGV is created

f() {
  printf 'Caller $1: %s\n' ${BASH_ARGV[$((${#BASH_ARGV[*]}-1))]}
  printf '    My $1: %s\n' "$1"
}
f blah

答え3

何を質問したのかよくわかりませんが、次の例を見ると明確になります。

$ cat script
#!/usr/bin/env bash

echo "Global 1st: ${1}"
echo "Global 2nd: ${2}"

f(){
    echo "In f() 1st: ${1}"
    echo "In f() 2nd: ${2}"
}

f "${1}" "${2}"

$ ./script foo bar
Global 1st: foo
Global 2nd: bar
In f() 1st: foo
In f() 2nd: bar

関連情報