如何使用Bash访问函数内的命令行参数?

DonGar 89 bash argv command-line-arguments

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

stigi.. 87

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

$#给你参数的数量.
$@给你所有的论据.您可以将其转换为数组args=("$@").

例如:

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

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

  • @Jefromi,实际上,它完美地回答了这个问题.如果你事先按照描述初始化它,你可以在函数内部使用`args`数组. (6认同)
  • 这没有解决这个问题 - 它要求将命令行参数传递给shell函数. (3认同)

小智.. 43

我阅读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 

  • 请注意,迭代数组会导致args与命令行的顺序相反. (4认同)

Cascabel.. 15

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

也就是说,如果您喜欢将命令行参数存储在全局数组中以在其他函数中使用,则可以:

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

commandline_args=("$@")

my_function

你必须通过访问命令行参数commandline_args变量,而不是$@,$1,$2等,但他们提供.我不知道有任何方法直接分配给参数数组,但如果有人知道,请赐教!

另外,请注意我使用和引用的方式$@- 这是你如何确保特殊字符(空白)不会被破坏.


Ravi Vyas.. 13

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

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


Peter Coulto.. 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