Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如果有9个以上的参数,如何访问函数的参数?_Bash_Function_Shell_Arguments - Fatal编程技术网

Bash 如果有9个以上的参数,如何访问函数的参数?

Bash 如果有9个以上的参数,如何访问函数的参数?,bash,function,shell,arguments,Bash,Function,Shell,Arguments,由于前9个参数是从$1到$9引用的,所以$10被解释为$1,后面跟着一个0。如何解释这一点并访问大于10的函数的参数 谢谢。使用: #!/bin/bash echo ${10} 要使用$10测试差异,请在foo.sh中编写代码: #!/bin/bash echo $10 echo ${10} 然后: $ ./foo.sh first 2 3 4 5 6 7 8 9 10 first0 10 如果您有以下情况,则同样适用: foobar=42 foo=FOO echo $foobar # e

由于前9个参数是从$1到$9引用的,所以$10被解释为$1,后面跟着一个0。如何解释这一点并访问大于10的函数的参数

谢谢。

使用:

#!/bin/bash
echo ${10}
要使用$10测试差异,请在foo.sh中编写代码:

#!/bin/bash
echo $10
echo ${10}
然后:

$ ./foo.sh first 2 3 4 5 6 7 8 9 10
first0
10
如果您有以下情况,则同样适用:

foobar=42
foo=FOO
echo $foobar # echoes 42
echo ${foo}bar # echoes FOObar
如果要删除歧义,请使用
{}


my2c

一般来说,为了安全起见,在Bash解释代码时,整个给定字符串被用作变量名,您需要将它括在大括号中:
${10}
如果您使用Bash,那么您可以使用
${10}

${…}语法在这种特殊情况下似乎与POSIX兼容,但最好像这样使用命令
shift

while [ "$*" != "" ]; do echo "Arg: $1" shift done 如果有帮助,下面是一个getopt/shift示例:

while getopts a:bc OPT; do case "$OPT" in 'a') ADD=1 ADD_OPT="$OPTARG" ;; 'b') BULK=1 ;; 'c') CHECK=1 ;; esac done shift $( expr $OPTIND - 1 ) FILE="$1" 而getopts a:bc OPT;做 案例“$OPT”加入 "a") 相加=1 添加_OPT=“$OPTARG” ;; "b") 体积=1 ;; "c") 检查=1 ;; 以撒 完成 班次$(expr$OPTIND-1) FILE=“$1”
您可以发布一个示例脚本,但它不起作用?我相信10美元应该工作并包含在第十个参数中…@ dks:不,如果你不使用<代码> {} /代码>它认为10美元为1美元,而垃圾0i不知道你使用的是什么“代码> BASH < /代码>,但是<代码> $< /代码>是贪婪的:<代码> $FoBar 会给你42,而不是FooBar。如果希望
$foo
后跟文字
“bar”
,则需要
${foo}bar
。我不会投你反对票,因为你答案中“真实”的部分是正确的,但你可能想修正(或删除)令人不快的部分。@paxdiablo:是的,这是一个糟糕的未经测试(我的耻辱)的例子。。。谢谢,这样更好,所以+1。我自由地将
foo
设置为
foo
,因为变量名和值可能会混淆。希望你不介意。干杯。@paxdiablo:一点也不。干杯。您可能想要
$#-ne 0
而不是
“$*”!=“”
在某些情况下,当和移位时,无需使用
。您可以在“$@”
中为arg使用
,或为arg使用
。
while getopts a:bc OPT; do
 case "$OPT" in
  'a')
   ADD=1
   ADD_OPT="$OPTARG"
   ;;
  'b')
   BULK=1
   ;;
  'c')
   CHECK=1
   ;;
 esac
done
shift $( expr $OPTIND - 1 )
FILE="$1"