web-dev-qa-db-ja.com

関数内の呼び出し元のコマンドライン引数にアクセスする方法は?

スクリプトコマンドライン引数にアクセスする関数をbashで記述しようとしていますが、関数の位置引数に置き換えられます。コマンドライン引数が明示的に渡されない場合、関数がコマンドライン引数にアクセスする方法はありますか?

# Demo function
function stuff {
  echo $0 $*
}

# Echo's the name of the script, but no command line arguments
stuff

# Echo's everything I want, but trying to avoid
stuff $*
88
DonGar

私のbash refマニュアルを読むと、このようなものはBASH_ARGVに取り込まれていると書かれていますが、「スタック」については多く語っています。

#!/bin/bash

function argv {
    for a in ${BASH_ARGV[*]} ; do
      echo -n "$a "
    done
    echo
}

function f {
    echo f $1 $2 $3
    echo -n f ; argv
}

function g {
    echo g $1 $2 $3
    echo -n g; argv
    f
}

f boo bar baz
g goo gar gaz

F.shに保存

$ ./f.sh arg0 arg1 arg2
f boo bar baz
farg2 arg1 arg0 
g goo gar gaz
garg2 arg1 arg0 
f
farg2 arg1 arg0 
43
mcarifio

引数をCスタイル(引数の配列+引数の数)にしたい場合は、$@$#を使用できます。

$#は引数の数を示します。
$@はすべての引数を提供します。 args=("$@")でこれを配列に変えることができます。

たとえば、次のとおりです。

args=("$@")
echo $# arguments passed
echo ${args[0]} ${args[1]} ${args[2]}

ここで${args[0]}は実際には最初の引数であり、スクリプトの名前ではないことに注意してください。

88
stigi

Raviのコメントは本質的に答えです。関数は独自の引数を取ります。それらをコマンドライン引数と同じにしたい場合は、それらを渡す必要があります。そうでなければ、引数なしで関数を明確に呼び出しています。

そうは言っても、コマンドライン引数を他の関数内で使用するグローバル配列に保存したい場合は、次のようにできます。

my_function() {
    echo "stored arguments:"
    for arg in "${commandline_args[@]}"; do
        echo "    $arg"
    done
}

commandline_args=("$@")

my_function

commandline_args$@$1などではなく、$2変数を介してコマンドライン引数にアクセスする必要がありますが、それらは使用可能です。引数配列に直接代入する方法を知りませんが、誰かがそれを知っているなら、教えてください!

また、$@を使用して引用した方法にも注意してください。これは、特殊文字(空白)がつぶれないようにする方法です。

15
Cascabel
#!/usr/bin/env bash

echo name of script is $0
echo first argument is $1
echo second argument is $2
echo seventeenth argument is $17
echo number of arguments is $#

編集:質問に対する私のコメントをご覧ください

12
Ravi Vyas
# Save the script arguments
SCRIPT_NAME=$0
ARG_1=$1
ARGS_ALL=$*

function stuff {
  # use script args via the variables you saved
  # or the function args via $
  echo $0 $*
} 


# Call the function with arguments
stuff 1 2 3 4
6
Peter Coulton

このようにすることもできます

#!/bin/bash
# script_name function_test.sh
function argument(){
for i in $@;do
    echo $i
done;
}
argument $@

次のようにスクリプトを呼び出します

./function_test.sh argument1 argument2
2
Vikash Singh

Shiftキーワード(演算子?)を使用して、それらを反復処理できます。例:

#!/bin/bash
function print()
{
    while [ $# -gt 0 ]
    do
        echo $1;
        shift 1;
    done
}
print $*;
1
Marin Alcaraz