スクリプトコマンドライン引数にアクセスする関数を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 $*
私の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
引数をCスタイル(引数の配列+引数の数)にしたい場合は、$@
と$#
を使用できます。
$#
は引数の数を示します。$@
はすべての引数を提供します。 args=("$@")
でこれを配列に変えることができます。
たとえば、次のとおりです。
args=("$@")
echo $# arguments passed
echo ${args[0]} ${args[1]} ${args[2]}
ここで${args[0]}
は実際には最初の引数であり、スクリプトの名前ではないことに注意してください。
Raviのコメントは本質的に答えです。関数は独自の引数を取ります。それらをコマンドライン引数と同じにしたい場合は、それらを渡す必要があります。そうでなければ、引数なしで関数を明確に呼び出しています。
そうは言っても、コマンドライン引数を他の関数内で使用するグローバル配列に保存したい場合は、次のようにできます。
my_function() {
echo "stored arguments:"
for arg in "${commandline_args[@]}"; do
echo " $arg"
done
}
commandline_args=("$@")
my_function
commandline_args
、$@
、$1
などではなく、$2
変数を介してコマンドライン引数にアクセスする必要がありますが、それらは使用可能です。引数配列に直接代入する方法を知りませんが、誰かがそれを知っているなら、教えてください!
また、$@
を使用して引用した方法にも注意してください。これは、特殊文字(空白)がつぶれないようにする方法です。
#!/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 $#
編集:質問に対する私のコメントをご覧ください
# 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
このようにすることもできます
#!/bin/bash
# script_name function_test.sh
function argument(){
for i in $@;do
echo $i
done;
}
argument $@
次のようにスクリプトを呼び出します
./function_test.sh argument1 argument2
Shiftキーワード(演算子?)を使用して、それらを反復処理できます。例:
#!/bin/bash
function print()
{
while [ $# -gt 0 ]
do
echo $1;
shift 1;
done
}
print $*;