#!/bin/bash
#Declare array with 4 elements
ARRAY=( 'Debian Linux' 'Redhat Linux' Ubuntu Linux )
# get number of elements in the array
ELEMENTS=${#ARRAY[@]}
# echo each element in array
# for loop
for (( i=0;i<$ELEMENTS;i++)); do
echo ${ARRAY[${i}]}
done
在第5行(ELEMENTS=${#ARRAY[@]}
)获取元素号。这是怎么回事?请解释。
答案 0 :(得分:2)
来自man bash
:
COMMENTS
在非交互式shell或者内置shopt的interactive_comments选项的交互式shell中(参见下面的SHELL BUILTIN命令),以#开头的单词会导致该单词和所有该行上的剩余字符将被忽略。未启用interactive_comments选项的交互式shell不允许注释。默认情况下,interactive_comments选项在交互式shell中处于启用状态。
如果单词以#开头,则表示评论的开头。如果它在单词之间,则不是。
答案 1 :(得分:2)
这是因为${...}
扩展。在其中一个中,#
字符不被视为评论的指示符。我想确切地知道,所以我搜索了bash
的源代码。首先是parse.y
中具有正常评论的部分:
if MBTEST(character == '#' && (!interactive || interactive_comments))
{
/* A comment. Discard until EOL or EOF, and then return a newline. */
discard_until ('\n');
shell_getc (0);
character = '\n'; /* this will take the next if statement and return. */
}
如果字符是#
,则忽略该行的其余部分。到目前为止一切都很好。
现在,如果我们在一个打开的${...}
扩展中,并且下一个字符是#
,则结束}
之前的其余内容将被解释为变量名称。请参阅subst.c
中的相关部分:
/* ${#var} doesn't have any of the other parameter expansions on it. */
if (string[t_index] == '#' && legal_variable_starter (string[t_index+1]))
name = string_extract (string, &t_index, "}", SX_VARNAME);
else
答案 2 :(得分:0)
如@choroba所述,请阅读bash manual pages中的Parameter Expansion
段:
$ {#}参数
参数展开值的字符长度为 取代。如果参数是''或'@',则替换的值为 位置参数的数量。如果参数是数组名称 由' '或'@'订阅,替换值是数字 数组中的元素。