Bash将星形字符视为关联数组中的单词

时间:2013-10-25 15:56:45

标签: bash shell unix escaping associative-array

我正在尝试在文件中进行单词计数,并使用文件中的每个单词作为关联数组中的键。值应该是单词的出现。

while read line; do
  ((occs["$line"]=${occs[$line]}+1))
done < $predfile

现在的问题是文件中可能有*(星号),我想将这个星形视为一个单词。但是当我想用

输出单词的出现时
for i in "${!occs[@]}"
do
  echo "$i : ${occs[$i]}" >> $resultfile
done

然后bash trys在到达星星时输出$ {occs [*]}并得到“occs [*]:bad array subscript”。我可以使用if语句来处理这个,但我想知道我是否可以用转义键填充数组键。

1 个答案:

答案 0 :(得分:1)

当您尝试分配数组元素时,而不是在使用数组元素时,会发生错误。 *@作为数组下标具有特殊含义,显然bash不允许您将这些值用作常规数组下标。您必须专门处理*@

数组下标必须是整数。如果要将任意单词存储为数组键,则需要将变量声明为关联数组。

declare -A occs
while read line; do 
    [[ $line = "*" ]] && line=star
    [[ $line = "@" ]] && line=asterisk
    ((occs["$line"]++))
done < <(printf "%s\n" a b c \* \* c b a \* 1 2 3 \@)

for key in "${!occs[@]}"; do 
    printf "%s\t%d\n" "$key" "${occs[$key]}"
done | column -t
star      3
a         2
b         2
c         2
asterisk  1
1         1
2         1
3         1