использование специальных символов в переменных / массиве bash - PullRequest
1 голос
/ 18 марта 2011

У меня проблемы с объявлением всех печатаемых символов в массиве в скрипте 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 [value of space]}, но я до сих пор не смог получить символ * для печати. Это имеет тенденцию печатать список файлов по некоторым причинам.

Есть идеи, как мне заставить это работать?

Ответы [ 4 ]

4 голосов
/ 18 марта 2011

Котировки! Больше цитат!

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

Заключайте в кавычки специальные символы в объявлении массива и вставляйте двойные кавычки вокруг доступа к переменным в циклах.

3 голосов
/ 18 марта 2011

В сценариях оболочки цитирование - ваш друг.Всегда.

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

Хорошо работает здесь.

1 голос
/ 18 марта 2011
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
0 голосов
/ 18 марта 2011

* - это специальный символ для bash.

подстановочный знак [звездочка]. Символ * служит «подстановочным знаком» для расширения имени файла в глобализации. Само по себе оно соответствует каждому имени файла в данном каталоге.

Из руководства по написанию абсолютных сценариев bash [1] вы захотите избежать его, как это делает первый ответ.

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

...