쉘스크립트 while 문 관련해서

khalisto의 이미지

안녕하세요. 쉘스크립트를 이용해 아래와 같은 루프를 작성했는데

------------------------------------------------------
#!/bin/sh

echo "선택하세요"
echo "1.사과 2.바나나 3.오렌지 4.딸기"
echo -n "좋아하는 과일은? : "
read fruits

while [[ $fruits < 1 || $fruits > 4 || $fruits -ge 10 ]]

do
echo "잘못 선택했습니다. 1~4 사이의 숫자만 입력하세요"
echo -n "좋아하는 과일은? : "
read fruits
done
-------------------------------------------------------
대략 위의 형태인데, while 조건에 의해 입력된 값이 1~4 외에 음수( -1 -2 -234728 등) 와 10 이상의 모든 숫자 입력시 do~done 사이의 코드가 실행이 됩니다만

입력값이 2++ 1-- 와 같이 숫자와 특수문자 그리고 2lowie 와 같이 숫자와 문자가 붙을 경우 에러가 발생합니다.

wrjlwejk22 와 같이 문자다음에 숫자가 나오는 경우에는 문제가 발생하지 않습니다.

2lowie 을 입력했을 때 에러코드 --> [[: 2lowie: value too great for base (error token is "2lowie")
2++ 를 입력했을 때 에러코드 --> [[: 2++: syntax error: operand expected (error token is "+")
1-- 를 입력했을 때 에러코드 --> [[: 1--: syntax error: operand expected (error token is "-")

while 조건문에 무엇을 추가해야 위의 에러가 나오지 않을까요? 검색 등 온갖 방법을 참고해보았으나 해결이 안되어 도움을 청해봅니다. ^^

감사합니다.

ymir의 이미지

문자열일때에는 대소비교가 안 되죠..
그냥 case 쓰시는게..?

while true
do
        echo "1.Apple 2.Banana 3.Orange 4.Strawberry"
        read -p "Select one [1-4]: " choice
        case $choice in
                1) echo echo apple; break;;
                2) echo echo banana; break;;
                3) echo echo orange; break;;
                4) echo echo strawberry; break;;
                *) echo echo retry ;;
        esac
done

bash 에서는 select 를 쓸 수도 있습니다.

#!/bin/bash
 
cont=true
PS3="Select one [1-4]: "
while [ $cont = true ]
do
        select opt in "Apple" "Banana" "Orange" "Strawberry"
        do
                case $REPLY in
                        1|2|3|4) echo $opt is selected; cont=false; break;;
                        *) echo retry;;
                esac
        done
done
 
exit 0;

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

khalisto의 이미지

우선 ymir 님 답변에 깊은 감사드리며 제가 생각했던 코드는

------------------------------------------------------
#!/bin/sh

echo "선택하세요"
echo "1.사과 2.바나나 3.오렌지 4.딸기"
echo -n "좋아하는 과일은? : "
read fruits

while [[ $fruits < 1 || $fruits > 4 || $fruits -ge 10 ]]

do
echo "잘못 선택했습니다. 1~4 사이의 숫자만 입력하세요"
echo -n "좋아하는 과일은? : "
read fruits
done

case $fruits in

1) echo "Apple"
;;
2) echo "Banana"
;;
3) echo "Orange"
;;
4) echo "Strawberry"
;;
esac

-------------------------------------------------------

이런 식으로 구현하려고 했었는데 제가 잘못 생각했었나 봅니다. ^^

ymir 님의 방법으로 구현하니 1++ 2-- 입력시 별도의 오류 없이 잘 처리 됩니다.

덕분에 오늘도 하나 더 배우고 갑니다. 소스코드 전체적으로 수정해야겠네요 ㅎㅎ

가르침에 감사 드립니다. 날씨가 추운데 감기 조심하시기 바랍니다.

ymir의 이미지

정확한 값이 입력되었는지 확인한 후에 나중에 그 값을 사용하는것도..
로직상 그렇게 구성하는 경우도 있으니 잘못 생각했다고 보기엔 좀 이르죠.
패턴매칭으로 입력된 값이 숫자인지 아닌지 확인해서, 숫자인 경우에만 비교를 하면 되겠네요.
아래 링크 참고하세요.

http://stackoverflow.com/questions/806906/how-do-i-test-if-a-variable-is-a-number-in-bash

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

ymir의 이미지

추가로 위에 썼던 걸 다시 재활용 해서..
정규식 대신 써 먹을 수도 있습니다.

#!/bin/bash
 
function is_valid_choice
{
    case $1 in
        1|2|3|4) return 0;;
        *) return 1;;
    esac
}
 
while true
do
    echo "1.Apple 2.Banana 3.Orange 4.Strawberry"
    read -p "Select one [1-4]: " choice
    is_valid_choice $choice && break || echo "Retry .."
done
 
exit 0;

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.