2017-10-10 4 views
0

ASCII 테이블의 문자로 명명 된 파일을 만드는 프로그램을 만들고 싶습니다.ASCII 테이블의 각 문자에 대한 파일 만들기

#!/bin/bash 

temp=0; 

for ((x=0; $x <= 177; x++)) ; do 
    temp=$((temp+1)) 
    if [ "$temp" = 8 ]; then 
    temp=$((0)) 
    x=$((x+3)) 
    fi 

    echo "$x" 

    `touch $'\"$x"'` 
done 

나는 그것이 매우 이상하게 쓰여 것을 알고,하지만이 프로그램이하는 일은 다음과 같습니다 : 에서 그렇게 (OCT에서 127 0에서 계산 그래서 127

-1에서 128 개 개의 파일이 같은 짓을 0 ~ 177oct). 문제는 touch $'\"$x"'이 제대로 작동하지 않는다는 것입니다.

touch $'\101'은 "A"라는 파일을 만듭니다.

아무도 도와 줄 수 있습니까?

+0

이름에 null 바이트가 포함 된 파일을 만들 수 없습니다. 'x = 1'로 시작해야합니다. – chepner

+0

backticks에'touch' 명령을 넣는 것은 그 방법으로는 아무 것도하지 않습니다 : 명령으로 출력을 실행하려고 시도하지만 아무 것도 없습니다. –

+0

관련, [Unix 및 Windows 파일 시스템에서 공통적으로 사용되는 charecters는 무엇입니까?] (https://serverfault.com/q/242110/145545), [허용되는 문자 수] (https://stackoverflow.com/q/4814040)/608639) 등 – jww

답변

0

bash은 ASCII 코드 포인트가 주어진 문자를 생성하는 특별한 방법을 제공하지 않습니다. 진수 표현으로 진수 값을 변환 printf 지원 :

$ printf '%x\n' 65 
A 

하지만 당신은 표준 형식으로 작성하기 위해서 사용하는 16 진수 문자열로 진수 문자열을 변환하는 bash 확장이 필요합니다

# null characters not allows, start with x=1, not x=0 
for ((x=1; x <= 177; x++)); do 
    h=$(printf '%x' "$x") # e.g. 65 -> 41 
    c=$(printf "\\x$h") # e.g. 41 -> A 
    [[ $c = "/" ]] && continue #/is not a valid character for file names 
    touch "$c" 
done 

주를이 역 인용 부호는 더 큰 표현식에서 사용할 명령의 출력을 캡처하기 만하면됩니다.

1

이 작동합니다 :

널 문자와 /은 파일 이름에 사용할 수 없습니다 공지 사항 것을
for num in {0..127}; do 
    printf -v fname "\x$(printf '%x' "$num")" 
    touch "$fname" 
done 

. 여기

이것은 무엇입니다

외측

printf -v fname '\xHH'

저장 변수 fname의 16 진수 값 HH (하나 또는 두 자리 숫자)와 바이트. 이것은 값 10 (ASCII 줄 바꿈)에서 명령 대체가 줄 바꿈을 제거하고 (빈 줄만 남겨둔 채로이 답의 이전 개정 에서처럼) 문제를 해결합니다.

내부

printf '%x' "$num" 

인쇄 후 외부 printfHH 값으로 사용되는 16 진수로서 num

.

말, 예 num의 값은 내주 교체이 수행 80 진수이다

$ printf '%x' 80 
50 

그래서 내부 명령 치환의 값은 50 (80 진수)이다.이제 명령은

printf -v fname "\x50" 

가되어 있기 때문에

$ printf "\x50" 
P 

의 다음 명령은 우리가 원하는 무엇을하는

touch P 

된다.