为什么使用#不是评论而是拒绝。以下代码中的元素?

时间:2014-11-12 12:02:03

标签: bash shell scripting

#!/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[@]})获取元素号。这是怎么回事?请解释。

3 个答案:

答案 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段:

  

$ {#}参数

     

参数展开值的字符长度为   取代。如果参数是''或'@',则替换的值为   位置参数的数量。如果参数是数组名称   由' '或'@'订阅,替换值是数字   数组中的元素