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

Bash将星形字符视为关联数组中的单词,bash,shell,unix,escaping,associative-array,Bash,Shell,Unix,Escaping,Associative Array,我正在尝试对文件进行字数计算,并将文件中的每个字用作关联数组中的键。该值应为单词的出现次数 while read line; do ((occs["$line"]=${occs[$line]}+1)) done < $predfile 然后bash尝试在到达星型时输出${occs[*]},我得到“occs[*]:坏数组下标”。我可以使用if语句来处理这个问题,但我想知道是否可以用转义键填充数组键 您的错误发生在尝试分配数组元素时,而不是在使用数组元素时*和@作为数组下标具有特殊意义,

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

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

然后bash尝试在到达星型时输出${occs[*]},我得到“occs[*]:坏数组下标”。我可以使用if语句来处理这个问题,但我想知道是否可以用转义键填充数组键

您的错误发生在尝试分配数组元素时,而不是在使用数组元素时
*
@
作为数组下标具有特殊意义,显然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

您的错误发生在尝试分配数组元素时,而不是在使用它时
*
@
作为数组下标具有特殊意义,显然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

您是否介意添加一个显示上述问题的小样本输入?注意:
declare-A occs;i=“*”;occs[$i]=100;echo“$i:${occs[$i]}”
按预期工作。所以问题一定在别的地方。你声明了关联数组吗?是的,我用declare-A声明了它。你可以使用我上面的代码创建一个文件,作为我上面的$predfile,包含以下内容:something anotherthing*(每个单词包括*以换行符分隔)问题似乎源于试图在
(…)
表达式内的索引中使用
*
。也许有办法解决这个问题,但我认为这是一个信号,
bash
对于您正在尝试的任何操作都是错误的语言。
bash
本身可能不是这个特定目的的最佳盟友,但您肯定可以使用POSIX的神奇功能,并用一行代码解决您的问题:
tr''\n'<$predfile | sort | uniq-c>$resultfile
。感谢您提供了更简单的解决方法。您是否介意添加一个显示上述问题的小样本输入?注意:
declare-A occs;i=“*”;occs[$i]=100;echo“$i:${occs[$i]}”
按预期工作。所以问题一定在别的地方。你声明了关联数组吗?是的,我用declare-A声明了它。你可以使用我上面的代码创建一个文件,作为我上面的$predfile,包含以下内容:something anotherthing*(每个单词包括*以换行符分隔)问题似乎源于试图在
(…)
表达式内的索引中使用
*
。也许有办法解决这个问题,但我认为这是一个信号,
bash
对于您正在尝试的任何操作都是错误的语言。
bash
本身可能不是这个特定目的的最佳盟友,但您肯定可以使用POSIX的神奇功能,然后用一行代码来解决你的问题:
tr''\n'<$predfile | sort | uniq-c>$resultfile
。感谢我能做的更简单的解决方法,我只是觉得有一种方法可以让bash知道我不是指*的特殊含义,但显然这是不可能的。我只是觉得有一种方法可以让bash知道我知道我不是指…的特殊含义,但显然这是不可能的
star      3
a         2
b         2
c         2
asterisk  1
1         1
2         1
3         1