将参数传递给Shell脚本

4
非常简单的问题,但我无法让它正常工作....本质上,我有一个XML文件,它内部允许我传递一些参数到外部程序,在我的情况下,由于不可避免的原因,我选择了shell脚本。现在它大部分都在工作,但我遇到了问题,本质上我从XML传递了12个参数到shell脚本--把参数在shell中传递和消耗工作得很好,直到第9个参数,当我到达第10个、第11个和第12个参数时,它们将ARG1与0(第10个参数),ARG1与1(第11个参数)和Arg1与2(第12个参数)连接起来。
ARG1=$1    # Name    
ARG2=$2    # Text     
ARG3=$3    # Model    
ARG4=$4    # Network Address    
ARG5=$5    # Type    
ARG6=$6    # Landscape    
ARG7=$7    # Cause    
ARG8=$8    # Troubleshooter    
ARG9=$9    # Originiating Event    
ARGX=$10   # Status    
ARGY="$11" # Customer    
ARGZ="$12" # Category

因此,ARG10的值本质上是ARG1和0。例如,假设您从XML文件传递ARG1为“text”和ARG10为“New”到shell脚本中,但当在shell脚本中回显ARG10时,它会回显“text0”而不是“New”。
我非常确定这是我所做的愚蠢之事,需要一些帮助理解我在编写代码时出了什么问题。

2个回答

9

当你有多于一个数字时,需要使用花括号。

ARGX=${10}

注意,对于赋值语句右侧是参数扩展的情况不需要在参数外加引号。如果没有花括号,$10会被解释为$1后跟一个字面量0

你也可以为单个数字参数(以及任何其他shell参数名称)使用花括号,以保持一致性。但是对于双位数参数,花括号是必需的。

但是,一旦你达到有这么多参数的程度,也许值得考虑一些显式命名方案。也许你可以使用选项语法,例如func -name "$name" -text "$text"等。然后你可以像这样做(假设bash> = 4):

declare -A args=()
while (( $# )); do
  case "$1" in  -*) key="${1#-}";;
                 *) args[$key]="$1";;
  esac
  shift
done

# now the name is ${args[name]}, text is ${args[text]}, etc.

好的,谢谢。我会尝试这个方法,听起来很有道理。在提问之前,我确实尝试过(),但我认为需要使用花括号。 - Nik
1
括号和花括号是不同的。$(1) 查找名为"1"的命令,运行它,并用其输出替换它。如果我的答案解决了您的问题,请接受它。 - Mark Reed

3

一旦你记录了一个参数,你可以使用shift将其从参数列表中移除:

ARG1=$1; shift #Name
ARG2=$1; shift # Text
ARG3=$1; shift # Model
...

好主意。我没有想过这个。我也可以试试。 - Nik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接