114

スクリプトのコマンドライン引数にアクセスする関数を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 $*
4

10 に答える 10

101

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

$#引数の数を示します。
$@あなたにすべての引数を与えます。これを。で配列に変換できますargs=("$@")

したがって、たとえば:

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

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

于 2010-04-29T21:40:10.303 に答える
55

私がBashリファレンスマニュアルを読んだところ、「スタック」について多くのことが語られていますが、このようなものはBASH_ARGVにキャプチャされていると書かれています。

#!/bin/bash

shopt -s extdebug

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
fbaz bar boo arg2 arg1 arg0
g goo gar gaz
ggaz gar goo arg2 arg1 arg0
f
fgaz gar goo arg2 arg1 arg0
于 2010-04-29T22:08:38.143 に答える
21
#!/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 $#

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

于 2010-04-29T21:33:02.387 に答える
18

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

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

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

commandline_args=("$@")

my_function

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

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

于 2010-04-29T22:04:31.290 に答える
6
# 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
于 2010-04-29T21:40:44.473 に答える
3

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

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

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

./function_test.sh argument1 argument2
于 2016-07-14T05:06:34.520 に答える
1

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

#!/bin/bash
function print()
{
    while [ $# -gt 0 ]
    do
        echo "$1"
        shift 1
    done
}
print "$@"
于 2014-11-19T21:26:34.177 に答える
1

私はこのようにします:

#! /bin/bash

ORIGARGS="$@"

function init(){   
  ORIGOPT= "- $ORIGARGS -" # tacs are for sed -E 
  echo "$ORIGOPT"
}
于 2020-01-15T17:23:04.787 に答える
0

コマンドラインから特定の関数に渡される引数を取得するための最も簡単でおそらく最良の方法は、関数呼び出しに引数を直接含めることです。

# first you define your function 
function func_ImportantPrints() {
    printf '%s\n' "$1" 
    printf '%s\n' "$2" 
    printf '%s\n' "$3" 
} 
# then when you make your function call you do this:  
func_ImportantPrints "$@" 

これは、引数をmainに送信する場合でも、func_parseArguments(前の例で見たようにcaseステートメントを含む関数)やスクリプト内の関数に送信する場合でも役立ちます。

于 2021-05-23T21:39:25.387 に答える
0

これは@mcarifioの応答であり、いくつかのコメントが組み込まれています。

#!/bin/bash

shopt -s extdebug

function stuff() {
  local argIndex="${#BASH_ARGV[@]}"
  while [[ argIndex -gt 0 ]] ; do
    argIndex=$((argIndex - 1))
    echo -n "${BASH_ARGV[$argIndex]} "
  done
  echo
}

stuff

強調したい:

于 2021-10-29T12:34:54.320 に答える