2011-03-18 7 views
1

bash 스크립트의 배열에있는 모든 인쇄 가능한 문자를 선언하는 데 문제가 있습니다. 모든 인쇄 가능한 문자를 루프를 통해 4 번 표시하고 싶습니다.bash 변수/배열에 특수 문자 사용

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

따옴표! 더 많은 인용문! 변수가 루프에 액세스 주변

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 

슬랩 배열 선언에서 특수 문자를 따옴표와 큰 따옴표를 때리고.

+0

작은 따옴표는 작동하지 않았고 복식은 도움이되지 않았다. 어느 쪽이든 같은 결과. – Grant

3

쉘 스크립트에서 인용은 친구입니다. 항상.

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 

잘 작동합니다.

+0

어떤 이유로 * \ "\ *"를 사용하여 이스케이프 처리하더라도 여전히 파일을 인쇄합니다. 내 Mac OS 사용시 문제가 될 수 있습니까? – Grant

0

*은 bash에 대한 특수 문자입니다.

와일드 카드 [별표]. * 문자는 globbing에서 파일 이름 확장을위한 "와일드 카드"역할을합니다. 그 자체로, 그것은 주어진 디렉토리의 모든 파일 이름과 일치합니다.

절대 bash 스크립팅 가이드 [1]에서 첫 번째 대답처럼 이스케이프하고 싶을 것입니다.

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

+0

*를 \와 함께 이스케이프해도 여전히 내 디렉토리에있는 파일 목록이 인쇄됩니다. – Grant

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