/ /関数内のBashスクリプトへのアクセス引数[複製]-bash

関数内のBashスクリプトへの引数へのアクセス[複製] - bash

関数内で、 $1 ... $n その関数に渡されるパラメーターです。 機能外 $1 ... $n スクリプトに渡されるパラメーターです。

関数内のスクリプトに渡されたパラメーターに何らかの方法でアクセスできますか?

回答:

回答№1の21

通常、それらは呼び出し時に関数にパラメーターとして渡すだけです。

(ugい)代替案は、それらをグローバル変数に入れることです。


回答№2の17

(これは古い投稿であることは知っていますが、実際に質問に答えた回答はありませんでした。)

BASH_ARGV配列を使用します。 これには、呼び出しスクリプトに渡された引数が逆の順序で含まれています(つまり、先頭がインデックス0のスタックです)。 #!/bin/bash -O extdebug)または shopt (例えば。、 shopt -s extdebug)、しかし、bash 4.2_p37では、それがオンになっていなくても動作します。

から man bash

すべてを含む配列変数現在のbash実行呼び出しスタックのパラメーター。最後のサブルーチン呼び出しの最後のパラメーターは、スタックの一番上にあります。最初の呼び出しの最初のパラメーターは下部にあります。サブルーチンが実行されると、提供されたパラメーターがBASH_ARGVにプッシュされます。シェルは、拡張デバッグモードの場合にのみBASH_ARGVを設定します…。

これは、すべての引数を順番に1行に出力するために使用する関数です。

# Print the arguments of the calling script, in order.
function get_script_args
{
# Get the number of arguments passed to this script.
# (The BASH_ARGV array does not include $0.)
local n=${#BASH_ARGV[@]}

if (( $n > 0 ))
then
# Get the last index of the args in BASH_ARGV.
local n_index=$(( $n - 1 ))

# Loop through the indexes from largest to smallest.
for i in $(seq ${n_index} -1 0)
do
# Print a space if necessary.
if (( $i < $n_index ))
then
echo -n " "
fi

# Print the actual argument.
echo -n "${BASH_ARGV[$i]}"
done

# Print a newline.
echo
fi
}

回答№3の11

ブノワが述べたように、最も簡単な解決策は、コマンドライン引数を関数の引数として関数に渡すことです $@、その後、あなたはまったく同じでそれらを参照することができます関数の外のように。実際に、コマンドライン引数と同じ値を持つ関数に渡される値を参照することになりますので、注意してください。

これにより、次のことができなくなります。コマンドラインで渡される引数の数が正確にわかっていない限り、他の引数を関数に渡します(これはユーザー次第であり、制約に拘束されないため)

すなわち、

    function fname {
# do something with $1 $2 $3...$n #
}

# $@ represents all the arguments passed at the command line #
fname $@

より良い方法は、使用することがわかっている引数のみを渡すことです。その方法で関数でそれらを使用し、必要に応じてコード内から他のパラメータも渡すことができます

すなわち、

    function fname {
# do something with $1 $count $2 and $3 #
}

count=1
fname $1 $count $2 $3

回答№4の6

すべてのスクリプト引数をグローバル配列に保存できます。

args=("$@")

そして、関数でそれらにアクセスします。

f(){
echo ${args[0]} ${args[1]}
}

答え№5の場合は3

おそらく、 "$@" 関数の引数リストの最後にそれを渡します。関数内で、 shift 引数を解析して使用した後 $1$n 通常どおり。


答え№6の場合は0

ヒントをありがとう-彼らは私にコールスタック関数を書くよう促しました。美学のために「列」コマンドを使用しました。

callstack() {
local j=0 k prog=$(basename $0)
for ((i=1; ((i<${#BASH_ARGC[*]})); i++))
do
echo -n "${FUNCNAME[$i]/main/$prog} " # function name
args=""
for ((k=0; ((k<${BASH_ARGC[$i]})); k++))
do
args="${BASH_ARGV[$j]} $args" # arguments
let j++
done
echo -e "$argst|${BASH_LINENO[$i]}" $(sed -n ${BASH_LINENO[$i]}p "$0" 2>/dev/null) # line calling the function
done | column -t -s $"t" -o " " | sed 1d # delete callstack entry
}
compareTemplates brother_001270_1。jpg | 163 compareTemplates "$ f"#残りを処理します processPdf brother_001270.pdf | 233ファイルタイプ "$ {f%[*}" pdf && processPdf "$ f" process brother_001270.pdf | 371 --process)shift;プロセス「$ @」;出口 ;; #jpgまたはpdfを処理 sm --quiet --process brother_001270.pdf | 0