我正在尝试第一次编写Bash完成,我对解除引用Bash数组(${array[@]}和${array[*]})的两种方法感到困惑.
这是相关的代码块(顺便说一句,它可以工作,但我想更好地理解它):
_switch()
{
local cur perls
local ROOT=${PERLBREW_ROOT:-$HOME/perl5/perlbrew}
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
perls=($ROOT/perls/perl-*)
# remove all but the final part of the name
perls=(${perls[*]##*/})
COMPREPLY=( $( compgen -W "${perls[*]} /usr/bin/perl" -- ${cur} ) )
}
Run Code Online (Sandbox Code Playgroud)
Bash的文档说:
可以使用$ {name [subscript]}引用数组的任何元素.需要大括号以避免与shell的文件名扩展运算符冲突.如果下标是'@'或'*',则该单词将扩展为数组名称的所有成员.这些下标仅在单词出现在双引号内时有所不同.如果单词是双引号,则$ {name [*]}扩展为单个单词,每个数组成员的值由IFS变量的第一个字符分隔,$ {name [@]}扩展名称的每个元素一个单独的词.
现在我想我明白,compgen -W期望一个字符串包含可能的替代词列表,但在这种情况下,我不明白"$ {name [@]}将名称的每个元素扩展为单独的词"是指.
长话短说:${array[*]}作品; ${array[@]}没有.我想知道为什么,我想更好地理解究竟是什么${array[@]}扩展到了什么.
我是shell脚本的新手,我正在尝试一个简单的任务,即获取使用生成的数字序列的长度seq.
在这里的相关帖子的帮助下:如何在unix shell中找到数组长度?我能做到这一点 -
a=(1 2 3 4 5)
echo ${#a[@]} #length of a
5 #length of a = 5 (This is fine !!)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用类似的东西seq..
b=$(seq 1 1 10)
echo $b
1 2 3 4 5 6 7 8 9 10
echo ${#b[@]}
1 #the length of b is 1, while I expect it to be 10
Run Code Online (Sandbox Code Playgroud)
为什么会这样?变量类型a和b是否不同?是b不是数组?
我相信我在这里缺少一些非常微不足道的东西,非常感谢帮助.
谢谢
阿什温
这种方法有什么问题我无法获得正确的数组长度值
#!/bin/bash
foo(){
val=$@
len=${#val[@]}
echo "Array contains: " $val
echo "Array length is: " $len
}
var=(1 2 3)
foo ${var[@]}
Run Code Online (Sandbox Code Playgroud)
输出:
Array contains: 1 2 3
Array length is: 1
Run Code Online (Sandbox Code Playgroud)