4

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

现在它大部分都在工作,但我遇到了问题,基本上我将 12 个参数从 XML 传递到 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 可以说你将 ARG1 作为“文本”和 ARG10 作为“新”从 XML 文件传递​​到 shell 脚本但是当 ARG10 在 shell 脚本中回显时它会回显 - “text0”而不是新的.
我很确定这是我正在做的一件愚蠢的事情,需要一些帮助来理解我在编码时哪里错了。

4

2 回答 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.
于 2013-10-26T04:12:20.673 回答
3

一旦你记录了一个参数,你可以shift把它从参数列表中删除:

ARG1=$1; shift #Name
ARG2=$1; shift # Text
ARG3=$1; shift # Model
...
于 2013-10-26T04:15:14.643 回答