我有一个 BASH 脚本问题,我已经缩小了范围,但我无法理解我看到的内容。我想以简洁的方式获取数组的子字符串。这是我在 bash 中看到的内容,使用“set -x”,以便在执行命令时打印它们:
$: read -a colours
+ read -a colours
blue green red yellow pink purple
$: echo ${colours[@]}
+ echo blue green red yellow pink purple
blue green red yellow pink purple
$: expr substr "${colours[@]}" 16 6
+ expr substr blue green red yellow pink purple 16 6
expr: syntax error: unexpected argument ‘yellow’
$: expr substr \"${colours[@]}\" 16 6
+ expr substr '"blue' green red yellow pink 'purple"' 16 6
expr: syntax error: unexpected argument ‘yellow’
最后一次尝试expr substr
命令时,数组元素返回了奇怪的引号,那么这是从哪里来的呢?帮我理解一下这expr substr
是怎么回事,还是这是一个错误?
编辑:我在下面列出了一些平面引用字符串的期望行为,但为什么我不能以相同的方式引用数组?
$: all_colours=${colours[@]}
+ all_colours='blue green red yellow pink purple'
$: expr substr $all_colours 16 6
+ expr substr blue green red yellow pink purple 16 6
expr: syntax error: unexpected argument ‘yellow’
$: expr substr "$all_colours" 16 6
+ expr substr 'blue green red yellow pink purple' 16 6
yellow
Expr 是一个命令行工具,它独立于 bash。它对数组一无所知。它获取命令行参数,正是我们在脚本中引用的
$1
、$2
等。$3
重要的是:bash 知道数组,但是当你调用二进制文件时,它只能获取参数列表作为其参数。
如果您
expr
使用扩展语法的数组进行调用,那么您将得到您所说的内容。expr substr
将期望数字,您给它许多文本单词,因此它会抱怨参数太多及其类型不好。我不确定,您想用这个子字符串做什么 - 一个数组可能有一个范围,或者一个“子数组”,或者一个间隔,但我不确定,您如何定义一个数组的子字符串。