web-dev-qa-db-ja.com

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

次の変数を使用して、位置パラメータを取得します。

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

ただし、スクリプトの定位置パラメーターと関数の定位置パラメーターの両方に使用されます。

これらの変数を関数内で使用すると、関数の位置パラメーターが与えられます。

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

7
user271680

いいえ、直接ではありません。関数パラメーターがマスクするためです。しかし、Bashまたはkshでは、スクリプトの引数を 個別の配列 に割り当て、それを使用するだけで済みます。

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

配列の番号付けはゼロから始まるため、$1 に行く ${ARGV[0]}など.

9
ilkkachu

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
5
ctac_