먼저, 아래에 제가 작성한 코드를 남겨두겠습니다만, 이전에 겪었던 문제에 대해 말씀드리고 싶습니다.
문제 1: 문자를 입력하고 공백을 남겨둔 후 다시 문자를 입력하면 "매개변수가 너무 많습니다."라는 오류가 발생합니다. 이 문제를 어떻게 해결할 수 있나요? " 예를 들어;"무엇이든 쓰세요: "ab cd 이 장소에 문제가 있습니다.
질문 2: "내가 쓴 텍스트에 해당하는 문자를 나란히 인쇄하려면 어떻게 해야 합니까?"
나를 도와줄 수 있는 사람에게 미리 감사드립니다.
write_exs_from_user() {
read -p "Write Anything: " str
for (( i = 0; i < ${#str}; ++i ));
do
if [ ${str:$i:1} = "a" -o ${str:$i:1} = "A" ]
then
echo "
*
* *
* * *
* *
* *
"
elif [ ${str:$i:1} = "b" -o ${str:$i:1} = "B" ]
then
echo "
* * * *
* *
* * * *
* *
* * * *
"
elif [ ${str:$i:1} = "c" -o ${str:$i:1} = "C" ]
then
echo "
* * * * *
*
*
*
* * * * *
"
elif [ ${str:$i:1} = "d" -o ${str:$i:1} = "D" ]
then
echo "
* * * *
* *
* *
* *
* * * *
"
elif [ ${str:$i:1} = "e" -o ${str:$i:1} = "E" ]
then
echo "
* * * * *
*
* * * * *
*
* * * * *
"
elif [ ${str:$i:1} = "f" -o ${str:$i:1} = "F" ]
then
echo "
* * * * *
*
* * * * *
*
*
"
elif [ ${str:$i:1} = "g" -o ${str:$i:1} = "G" ]
then
echo "
* * * *
* *
*
* * * *
* *
* * * * *
"
elif [ ${str:$i:1} = "h" -o ${str:$i:1} = "H" ]
then
echo "
* *
* *
* * * *
* *
* *
"
elif [ ${str:$i:1} = "i" -o ${str:$i:1} = "I" ]
then
echo "
*
* *
*
* *
* *
* *
* *
"
elif [ ${str:$i:1} = "j" -o ${str:$i:1} = "J" ]
then
echo "
*
*
*
*
* *
* * *
"
elif [ ${str:$i:1} = "k" -o ${str:$i:1} = "K" ]
then
echo "
* *
* *
* *
* *
* *
"
elif [ ${str:$i:1} = "l" -o ${str:$i:1} = "L" ]
then
echo "
*
*
*
*
*
* * * * *
"
elif [ ${str:$i:1} = "m" -o ${str:$i:1} = "M" ]
then
echo "
* *
* * * *
* * * *
* * *
* *
"
elif [ ${str:$i:1} = "n" -o ${str:$i:1} = "N" ]
then
echo "
* *
* * *
* * *
* * *
* *
"
elif [ ${str:$i:1} = "o" -o ${str:$i:1} = "O" ]
then
echo "
* * *
* *
* *
* *
* *
* *
* *
* * *
"
elif [ ${str:$i:1} = "p" -o ${str:$i:1} = "P" ]
then
echo "
* * * * *
* *
* * * * *
*
*
"
elif [ ${str:$i:1} = "q" -o ${str:$i:1} = "Q" ]
then
echo "
* * *
* *
* *
* *
* *
* * *
* *
* * * **
"
elif [ ${str:$i:1} = "r" -o ${str:$i:1} = "R" ]
then
echo "
* * * *
* *
* *
* ** *
* *
* *
* *
"
elif [ ${str:$i:1} = "s" -o ${str:$i:1} = "S" ]
then
echo "
* * * *
* *
*
* * * *
*
* *
* * *
"
elif [ ${str:$i:1} = "t" -o ${str:$i:1} = "T" ]
then
echo "
* * * * *
*
*
*
*
"
elif [ ${str:$i:1} = "u" -o ${str:$i:1} = "U" ]
then
echo "
* *
* *
* *
* *
* * * * *
"
elif [ ${str:$i:1} = "V" -o ${str:$i:1} = "v" ]
then
echo "
* *
* *
* *
* *
*
"
elif [ ${str:$i:1} = "w" -o ${str:$i:1} = "W" ]
then
echo "
* *
* *
* * *
* * * *
* *
"
elif [ ${str:$i:1} = "x" -o ${str:$i:1} = "X" ]
then
echo "
* *
* *
*
* *
* *
"
elif [ ${str:$i:1} = "y" -o ${str:$i:1} = "Y" ]
then
echo "
* *
* *
* * * *
*
* * * *
"
elif [ ${str:$i:1} = "z" -o ${str:$i:1} = "Z" ]
then
echo "
* * * * *
*
*
*
*
* * * * *
"
else
echo "Please Write String !"
fi
done
}
write_exs_from_user
답변1
Unix 및 Linux 스택 교환에 오신 것을 환영합니다!
첫 번째 질문
첫 번째 질문의 경우 문제는 bash가 [
와 사이에 공백이 있는지 확인할 수 없다는 것입니다 =
. Bash는 모든 명령 호출(이것은 단지 [
또 다른 명령임에 유의)을 공백으로 둘러싸인 인수 집합(예: [ a = A ]
인수 목록 [
, a
, =
및 )으로 평가합니다. bash는 문자열을 평가하고 가져온 후 문자열이 명령에 기록된 것처럼 명령을 평가합니다. 예를 들어 where is a (space) as 를 읽습니다. 다른 공간과 구별되는 공간이 없기 때문에 무시된다. 직관과는 반대로, 인수가 공백 집합인 경우에도 bash에 해당 내용을 인수로 처리하도록 큰따옴표( )로 묶을 수 있습니다. 따라서 해결책은 이를 큰따옴표로 묶는 것입니다. 이는 bash가 이를 인수 목록, , 및 으로 읽는다는 것을 의미합니다. 이는 명령이 왼쪽 피연산자가 공백임을 올바르게 인식한다는 것을 의미합니다.A
]
${str:$i:1}
[ $x = "a" ]
x
[ = "a" ]
$x
$x
"$x"
${str:$1:1}
[
=
"a"
]
[
흥미롭게도 [
여기에서는 잘못된 오류가 발생할 수 있으므로 이를 내보내야 합니다 unary operator expected
.
큰따옴표 작동 방식에 대한 자세한 내용은 다음을 확인하세요.이 문제.
두 번째 질문
두 번째 질문에 대해서는 아마도 이러한 유형의 문제를 처리하는 가장 좋은 방법은 for 루프 전에 예상 출력의 각 행에 대한 변수를 만드는 것입니다. 그런 다음 echo
ASCII 문자의 각 줄에 대해 문자의 ASCII 아트(예: )를 사용하는 대신 해당 줄 변수에 연결할 수 있습니다 line1="$line1 * * * * *"
. 그런 다음 루프 후에 각 줄에서 printf를 사용할 수 있습니다 printf '%s' "$line1"
.
앞으로는 하나의 게시물에 두 개의 질문을 하는 대신 각 질문에 대해 두 개의 다른 게시물을 작성해야 한다는 점을 참고하세요.