相关疑难解决方法(0)

在Bash完成的上下文中关于$ {array [*]}与$ {array [@]}的混淆

我正在尝试第一次编写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[@]}扩展到了什么.

arrays bash bash-completion

73
推荐指数
2
解决办法
3万
查看次数

在shell中使用seq的数字序列的长度

我是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不是数组?

我相信我在这里缺少一些非常微不足道的东西,非常感谢帮助.

谢谢

阿什温

bash shell seq

3
推荐指数
1
解决办法
1358
查看次数

传递给函数后在bash中获取数组长度时出错

这种方法有什么问题我无法获得正确的数组长度值

#!/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)

arrays bash shell

3
推荐指数
1
解决办法
162
查看次数

标签 统计

bash ×3

arrays ×2

shell ×2

bash-completion ×1

seq ×1