将参数传递给Shell脚本

Nik*_*Nik 4 bash shell scripting-language

非常简单的问题可能是但不能让这个工作....基本上我有一个XML文件,在内部允许我将少量参数传递给外部程序,在我的情况下我选择了shell脚本由于不可避免的原因.

现在它在大多数情况下工作但我遇到了问题,基本上我传递了从XML到shell脚本的12个参数 - 在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
Run Code Online (Sandbox Code Playgroud)

所以ARG10的值基本上是ARG1和0,因为ex让你说ARG1作为"文本"而ARG10作为"新"从XML文件传递到shell脚本但是当ARG10在shell脚本中回显时它回应 - "text0"而不是new .
我非常确定这是一个愚蠢的事情,我需要一些帮助,了解我编码错误的地方.

Mar*_*eed 9

当您有多个数字时,需要使用花括号.

ARGX=${10}
Run Code Online (Sandbox Code Playgroud)

等等(请注意,在赋值语句的整个右侧的参数扩展周围不需要引号.)如果没有大括号,则将$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.
Run Code Online (Sandbox Code Playgroud)