문제는 "매개변수가 너무 많습니다"입니다.

문제는 "매개변수가 너무 많습니다"입니다.

먼저, 아래에 제가 작성한 코드를 남겨두겠습니다만, 이전에 겪었던 문제에 대해 말씀드리고 싶습니다.

문제 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 루프 전에 예상 출력의 각 행에 대한 변수를 만드는 것입니다. 그런 다음 echoASCII 문자의 각 줄에 대해 문자의 ASCII 아트(예: )를 사용하는 대신 해당 줄 변수에 연결할 수 있습니다 line1="$line1 * * * * *". 그런 다음 루프 후에 각 줄에서 printf를 사용할 수 있습니다 printf '%s' "$line1".

앞으로는 하나의 게시물에 두 개의 질문을 하는 대신 각 질문에 대해 두 개의 다른 게시물을 작성해야 한다는 점을 참고하세요.

관련 정보