在bash变量/数组中使用特殊字符

时间:2011-03-18 02:21:59

标签: bash osx-snow-leopard

我遇到了在bash脚本中声明数组中所有可打印字符的问题。我想通过循环显示所有可打印的字符4次。

实施例

array=( a b c d … z A B C … Z 1 2 3 … 0 ! @ # $ % ^ & * ( ) _ +)

For chr1 in ${array[@]} 
Do
For chr2 in ${array[@]}
Do 
Echo $chr1$chr2
Done
Done

我已经能够使用$ {array [space of space]}来打印空格字符,但我仍然无法打印*字符。由于某种原因,它倾向于打印文件列表。

知道如何才能让它发挥作用吗?

4 个答案:

答案 0 :(得分:4)

行情!更多报价!<​​/ p>

array=( a b c d z A B C Z 1 2 3 0 '!' '@' '#' '$' '%' '^' '&' '*' '(' ')' '_' '+')

for chr1 in "${array[@]}"
do
  for chr2 in "${array[@]}"
  do 
    echo "$chr1$chr2"
  done
done

在数组声明中的特殊字符周围引用,并在循环中的变量访问周围使用双引号。

答案 1 :(得分:3)

在shell脚本中,引用是你的朋友。总是

array=(a b c d e f g h i j k l m z A B C Z 1 2 3 0 \! \@ \# \$ \% \^ \& \* \( \) _ +)
for chr1 in "${array[@]}"; do
  for chr2 in "${array[@]}"; do
    echo "$chr1$chr2"
  done
done

在这里工作正常。

答案 2 :(得分:1)

chr () { printf "\\$(($1/64*100+$1%64/8*10+$1%8))"; }
ord () { printf '%s' "$(( ( 256 + $(printf '%d' "'$1"))%256 ))"; }

for i in {32..126}
do
    for j in {32..126}
    do
        chr $i; chr $j
        echo
    done
done

答案 3 :(得分:0)

*是bash的特殊字符。

  

外卡[星号]。 *字符用作globbing中文件名扩展的“通配符”。它本身就匹配给定目录中的每个文件名。

从绝对的bash脚本指南[1]中,你会像第一个答案那样逃避它。

[1] http://tldp.org/LDP/abs/html/special-chars.html