2014-09-06 5 views
4

의 알파 범위에서 변수를 넣으려면 ALPHABETICAL 범위의 사이클에 변수를 넣을 수있는 방법이 있습니까? 이 작동하지 않습니다.셸 - 사이클

read -p "Where I should start?" start #there will be entered one small letter 
for aaa in {$start..z}; do #how put variable $start in range? 
... 
done 

답장을 보내 주셔서 감사합니다.

답변

2

불행히도 변수를 {start..end} 범위 안에 넣을 수는 없습니다.

이 당신이 원하는 것을 : 그것은 다음 단계로 각 문자를 번역하는 tr를 사용

until [[ $s == "_" ]]; do echo $s && s=$(tr "a-z" "b-z_" <<<$s); done 

. "_"는 "z"뒤의 문자입니다. 예를 들어

:

$ s=t 
$ until [[ $s == "_" ]]; do echo $s && s=$(tr "a-z" "b-z_" <<<$s); done 
t 
u 
v 
w 
x 
y 
z 

펄을 사용하여 괜찮다면, 당신이 사용할 수 있습니다 명령 줄에서 첫 번째 인수 사이에 목록을 만들 수

perl -le 'print for shift .. "z"' $s 

그것은 ..를 사용을 및 "z".

떠들썩한 파티에서 할 수있는 약간 더 난해한 방법은 다음과 같습니다

for 루프 형식 ASCII 문자 (122) 인 변수 $s에 "Z"의 ASCII 문자 번호에서 진행
for ((i=$(LC_CTYPE=C printf '%d' "'$s"); i<=122; ++i)); do 
    printf "\\$(printf '%03o' $i)\n" 
done 

내부 지정자 인 printf은 문자 수를 8 진수로 변환하며 최대 3 자까지 0으로 채 웁니다. printf 바깥 쪽은 이것을 이스케이프 시퀀스로 해석하여 문자를 인쇄합니다. ASCII 문자를 해당 값으로 변환하는 데 사용되는 코드는 Greg's wiki입니다.

물론 변수를 확장하는 데 eval을 사용할 수 있습니다. 이점은 필요한 코드가 훨씬 짧아집니다. 그러나 스크립트에서 읽은 임의의 문자열을 실행하는 것은 틀림없이 약간의 보안 허점입니다.

$ s=t 
$ eval echo {$s..z} 
t u v w x y z 

귀하의 예는 다음이된다 :

 
t 
u 
v 
w 
x 
y 
z 
1
x=t 
for I in $(sed -nr "s/.*($x.*)/\1/;s/ /\n/g;p" <(echo {a..z})) 
do 
    # do something with $I 
done 

read -p "Where I should start?" start #there will be entered one small letter 
for aaa in $(eval echo {$start..z}); do 
echo $aaa 
done 

을 당신은에 대한 사용자 입력을 가지고 있기 때문에 (3210)는, 먼저 하나의 소문자 것으로 시작의 값을 확인 할 수 있습니다 :

read -p "Where I should start?" start #there will be entered one small letter 
if [[ $start =~ ^[a-y]$ ]]; then 
    for aaa in $(eval echo {$start..z}); do 
    echo $aaa 
    done 
else 
    echo "Need to use a letter 'a-y'" 
fi 

당신은 내가 eval의 사용을 피할 것 here

3

사용 eval 변수 확장 : 출력이

+0

왜 단순한 작업을 수행합니까? ;) –

0

배쉬 중괄호 확장에 대한 자세한 내용을보실 수 있습니다.

for aaa in {a..z}; do 
    [[ $aaa < $start ]] && continue 
    ... 
done 

$start-$aaa 특히 범위를 계산하기 위해 별도의 프로세스를 시작하는 비용을 비교하고, 비교해야 무시할 수의 오버 헤드.