변수의 첫 번째 문자부터 마지막 ​​문자까지 작업(bash)

변수의 첫 번째 문자부터 마지막 ​​문자까지 작업(bash)

내 bash 스크립트가 변수의 첫 번째 문자를 처리하고 마지막 문자에 도달할 때까지 계속 작업하도록 하려고 합니다. 이것이 내가 지금까지 가지고 있는 것입니다:

#!/bin/bash

echo Word?
read -r -p '' foo
# $foo is set to 'Antarctica' by user.

wordlength=${#foo}
$wordlength says 10, so start on character 1.
'A' is first letter received in $foo, so echo '{a,A}'
'n' is second letter received in $foo, so echo '{n,N}'
't' is third letter received in $foo, so echo '{t,T}'
'a' is fourth letter received in $foo, so echo '{a,A}'
........
'i' is eighth letter received in $foo, so echo '{i,I}'
'c' is ninth letter received in $foo, so echo '{c,C}'
'a' is tenth letter received in $foo, so echo '{a,A}'

사용자 측의 모습은 다음과 같습니다.

Word?

남극 대륙

{a,A}{n,N}{t,T}{a,A}{r,R}{c,C}{t,T}{i,I}{c,C}{a,A}

이것이 바로 출력되는 내용입니다. 이 작업을 수행하는 방법을 아는 사람이 있나요?


편집: 이렇게 연결될 수 있을까요? $wordlength는 10이므로 1에서 시작하여 10까지 갑니다.

if 1st letter of $foo is A, echo '{a,A}'
if 2st letter of $foo is n, echo '{n,N}'
.....

답변1

ksh93bash또는 문자열의 각 문자를 반복하려면 다음을 수행하십시오 zsh.

string=whatever
for ((i = 0; i < ${#string}; i++)); do
   printf '%s\n' "Character $((i + 1)): ${string: i:1}"
done

zsh( 구문이 지원 yash되지 않는다는 점 을 제외하면 동일 ), 다음도 참조하세요.yashfor ((...))

for ((i = 1; i <= ${#string}; i++)); do
   printf '%s\n' "Character $i: $string[i]"
done

s또는 (분할용으로) 사용매개변수 확장 플래그빈 문자열을 구분 기호로 사용합니다.

for c (${(s"")string}) something with "$c"

case문자를 문자열에 매핑하려면 다음과 같은 구문을 사용할 수 있습니다 .

case $c in
  (A) s='{O.O}';;
  (a) s='{q-p}';;
  ...
esac

또는 연관 배열:

  • zsh:

    typeset -A map
    map=(
      A  '{O.O}'
      a  '{q-p}'
      ...
    )
    s=$map[$c]
    
  • ksh93/ bash:

    typeset -A map
    map=(
      [A]='{O.O}'
      [a]='{q-p}'
      ...
    )
    s=${map[$c]}
    

이식 가능(표준 sh구문 사용) 다음을 수행할 수도 있습니다.

map='|A={O.O}|a={q-p}|...'
s=${map#*"|$c="}
s=${s%%"|"*}

(모든 문자열에 |문자가 없다고 가정).

또는 적절한 텍스트 처리 유틸리티를 호출할 수도 있습니다(명령을 호출하려면 셸을 사용하고, 텍스트 처리 유틸리티를 사용하여 텍스트를 처리해야 합니다).

STRING=whatever awk -F= '{map[$1] = $2}
   END {
     s = ENVIRON["STRING"]
     l = length(s)
     for (i = 1; i <= l; i++) {
       c = substr(s, i, 1)
       print map[c]
     }
   }' << EOF
A={O.O}
a={q-p}
...
EOF

(그러나 awklike의 일부 구현은 mawk단일 바이트 문자만 지원합니다.)

관련 정보