如何在函数内访问调用者的命令行参数?

时间:2010-04-29 21:31:04

标签: bash command-line-arguments argv

我正在尝试在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 $*

9 个答案:

答案 0 :(得分:86)

如果你想要你的参数C样式(参数数组+参数数量),你可以使用$@$#

$#为您提供参数数量 $@为您提供所有论据。您可以按args=("$@")将其转换为数组。

例如:

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

请注意,此处${args[0]}实际上是第一个参数,而不是脚本的名称。

答案 1 :(得分:42)

我阅读bash参考手册说这些东西是在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 

答案 2 :(得分:15)

Ravi的评论基本上就是答案。函数采用自己的论点。如果您希望它们与命令行参数相同,则必须将它们传入。否则,您显然正在调用不带参数的函数。

那就是说,如果你喜欢将命令行参数存储在全局数组中以便在其他函数中使用,那么你可以这样做:

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

commandline_args=("$@")

my_function

您必须通过commandline_args变量访问命令行参数,而不是$@$1$2等,但它们可用。我没有意识到任何直接分配给参数数组的方法,但如果有人知道,请赐教!

另外,请注意我使用和引用$@的方式 - 这就是确保特殊字符(空白)不被混淆的方式。

答案 3 :(得分:11)

#!/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 $#

编辑:请参阅我对问题的评论

答案 4 :(得分: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

答案 5 :(得分:2)

也可以这样做

movieFinishedCallback:

现在调用你的脚本

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

答案 6 :(得分:1)

您可以使用shift关键字(运算符?)来迭代它们。 例如:

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

答案 7 :(得分:1)

我的解决方案:

创建一个比所有其他函数更早调用的函数脚本,而不向其传递任何参数,例如:

! / bin / bash

function init(){ ORIGOPT =“--$ @-” }

之后,您可以调用init并使用ORIGOPT var作为 另外,我总是要分配一个新的var并复制 我的新功能中ORIGOPT的内容,这样您就可以 让自己放心,没有人会去触摸或更改它。

我添加了空格和破折号以使其更易于解析 'sed -E'也bash不会将其作为参考并通过 随着带有更多参数的函数调用,ORIGOPT也随之增长。

答案 8 :(得分: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 语句的函数)或脚本中的任何函数,这都非常有用。