English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Java, PHP와 같은 다른 언어와는 달리, sh의 흐름 제어는 비어서는 안 됩니다. (아래는 PHP 흐름 제어 예제입니다):
<?php if (isset($_GET["q"])) { search(q); } else { // 아무것도 하지 않습니다 }
sh에서는/bash에서는 이렇게 쓰지 마세요. else 브랜치에 실행할 명령이 없으면 이 else를 쓰지 마세요.
if 문법 형식:
if condition then command1 command2 ... commandN fi
한 줄로 작성하십시오 (터미널 명령 프롬프트에 적합):
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
끝의 fi는 if의 뒤집힌 글자이며, 이와 같은 것을 다시 만날 것입니다.
if else 문법 형식:
if condition then command1 command2 ... commandN else command fi
if else-if else 문법 형식:
if condition1 then command1 elif condition2 then command2 else commandN fi
아래 예제는 두 변수가 같은지 확인하는 방법을 보여줍니다:
a=10 b=20 if [$a == $b ] then echo "a는 b와 같습니다" elif [$a -gt $b ] then echo "a는 b보다 큽니다" elif [$a -lt $b ] then echo "a는 b보다 작습니다" else echo "조건이 없습니다" fi
출력 결과:
a는 b보다 작습니다
if else 문은 일반적으로 test 명령어와 함께 사용됩니다. 예를 들어:
num1=$[2*3] num2=$[1+5] if test $[num1] -eq $[num2] then echo '두 숫자가 같습니다!' else echo '두 숫자가 다릅니다!' fi
출력 결과:
두 숫자가 같습니다!
다른 프로그래밍 언어와 유사하게, 셸은 for 루프를 지원합니다.
for 루프의 일반 형식은 다음과 같습니다:
for var in item1 item2 ... itemN do command1 command2 ... commandN done
一行에 쓰면:
for var in item1 item2 ... itemN; do 명령1; 명령2... done;
변수 값이 목록에 있으면, for 루프는 모든 명령을 한 번 실행합니다. 변수 이름을 사용하여 목록의 현재 값을 가져옵니다. 명령은 어떤 유효한 셸 명령과 문장이든 될 수 있습니다. in 목록은 대체, 문자열, 파일 이름을 포함할 수 있습니다.
목록은 선택 사항입니다. 사용하지 않으면, for 루프는 명령 프롬프트의 위치 매개변수를 사용합니다.
예를 들어, 현재 목록의 숫자를 순서대로 출력합니다:
for loop in 1 2 3 4 5 do echo "The value is: $loop" done
출력 결과:
The value is: 1 The value is: 2 The value is: 3 The value is: 4 The value is: 5
문자열의 문자를 순서대로 출력합니다:
#!/bin/bash for str in This is a string do echo $str done
출력 결과:
This is a string
while 루프는 일련의 명령을 반복적으로 실행하거나 입력 파일에서 데이터를 읽기 위해 사용됩니다. 그 문법 형식은 다음과 같습니다:
while 조건 do command done
다음은 기본적인 while 루프로, 조건은 int가 5그렇다면 조건이 참이 됩니다. int는 1 시작부터, 매번 반복 처리할 때마다 int가 증가합니다 1. 위 스크립트를 실행하면 숫자를 반환합니다 1 까지 5그런 다음 종료합니다.
#!/bin/bash int=1 while(( $int<=5 )) do echo $int let "int++" done
스크립트 실행, 출력:
1 2 3 4 5
위 예제에서 Bash let 명령어가 사용되었습니다. 이 명령어는 하나나 여러 개의 표현식을 실행하며, 변수 계산에서 변수를 나타내기 위해 $를 추가할 필요가 없습니다. 자세히 알고 싶다면 참조하세요:Bash let 명령어
.
while 루프는 키보드 정보를 읽기 위해 사용될 수 있습니다. 아래 예제에서, 입력 정보는 변수 FILM으로 설정되었으며, Ctrl을 누릅니다.-D> 반복을 종료합니다.
echo 'Ctrl을 누른 상태에서'-D> 탈출' echo -n '귀하의 가장 좋아하는 웹사이트 이름을 입력하세요:' while read FILM do echo "네! $FILM은 좋은 웹사이트입니다" done
스크립트 실행, 아래와 같은 출력을 얻습니다:
Ctrl을 누른 상태에서-D> 탈출 귀하의 가장 좋아하는 웹사이트 이름을 입력하세요: 기본 튜토리얼 웹사이트 네! 기본 튜토리얼 웹사이트는 좋은 웹사이트입니다
무한루프 문법 형식:
while : do command done
또는
while true do command done
또는
for (( ; ; ))
until 루프는 조건이 true가 되기 전까지 명령을 수행합니다.
until 루프는 while 루프와 반대로 작동합니다.
일반적으로 while 루프는 until 루프보다 우선되지만, 일부 특정 상황에서는 until 루프가 더 유용할 수 있습니다.
until 문법 형식:
until condition do command done
condition은 일반적으로 조건 표현식입니다. 반환值为 false일 때까지 실행되며, 그렇지 않으면 루프를 탈출합니다.
아래 예제에서는 until 명령을 사용하여 0 ~ 9 의 숫자:
#!/bin/bash a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done
실행 결과:
출력 결과는 다음과 같습니다:
0 1 2 3 4 5 6 7 8 9
case ... esac 다중 선택 문장으로, 다른 언어의 switch ... case 문과 유사합니다. 이는 다분지점 선택 구조입니다. 각 case 분지는 우측 둥근 괄호로 시작되며 두 개의 세미콜론 ;;으로 break을 표시합니다. 즉, 실행이 끝나고 전체 case ... esac 문을 탈출합니다. esac(즉 case의 반대)은 종료 표시자입니다.
case 문은 값을 모드와 일치시키기 위해 사용됩니다. 일치하면 일치하는 명령을 실행합니다.
case ... esac 문법 형식은 다음과 같습니다:
case 값 in 모드1) command1 command2 ... commandN ;; 모드2) command1 command2 ... commandN ;; esac
case 작업 방식은 위와 같습니다. 값后面는 단어 in각 패턴은 반드시 우측 괄호로 끝나야 합니다. 값은 변수나 상수일 수 있습니다. 값이 일치하는 패턴이 발견되면 그 사이의 모든 명령이 실행되며 ;;까지 실행됩니다.
값은 매칭된 모든 패턴을 검사합니다. 패턴이 일치하면 해당 패턴의 명령을 실행한 후 다른 패턴을 더 이상 검사하지 않습니다. 일치하는 패턴이 없으면 별표(*)를 사용합니다. * 이 값을 잡아서 후속 명령을 실행합니다.
아래 스크립트는 입력을 요청합니다 1 까지 4,각 모델과 일치시킵니다:
echo '입력 1 까지 4 사이의 숫자: echo '당신이 입력한 숫자는:' read aNum case $aNum in 1) echo '당신이 선택했습니다' 1' ;; 2) echo '당신이 선택했습니다' 2' ;; 3) echo '당신이 선택했습니다' 3' ;; 4) echo '당신이 선택했습니다' 4' ;; *) echo '당신이 입력하지 않았습니다' 1 까지 4 사이의 숫자: ;; esac
다른 내용을 입력하면 다른 결과가 나타납니다. 예를 들어:
입력 1 까지 4 사이의 숫자: 당신이 입력한 숫자는: 3 당신이 선택했습니다: 3
아래 스크립트는 문자열을 일치시킵니다:
#!/bin/sh site="w3codebox" case "$site" in "w3codebox") echo "기본 가이드 웹" ;; "google") echo "Google 搜索" ;; "taobao") echo "淘宝网" ;; esac
출력 결과는 다음과 같습니다:
기본 튜토리얼 웹사이트
루프 중에 때로는 루프의 종료 조건에 도달하지 않았을 때 강제로 루프를 벗어나는 것이 필요할 수 있습니다. Shell은 이 기능을 수행하기 위해 두 명령어를 사용합니다: break와 continue.
break 명령어는 모든 루프에서 나가기 허용하며(다음의 모든 루프를 종료합니다).
아래의 예제에서, 스크립트는 사용자가 숫자를 입력하기 전까지는 무한 루프에 빠지게 됩니다.5이 루프를 벗어나 shell 표시줄로 돌아가기 위해 break 명령어를 사용해야 합니다.
#!/bin/bash while : do echo -n "입력 1 까지 5 사이의 숫자:" read aNum case $aNum in 1|2|3|4|5) echo "입력하신 숫자는 $aNum!" ;; *) echo "입력하신 숫자는 아닙니다" 1 까지 5 사이의 ! 게임 종료" break ;; esac done
위의 코드를 실행하면, 출력 결과는 다음과 같습니다:
입력 1 까지 5 사이의 숫자:3 입력하신 숫자는 3! 입력 1 까지 5 사이의 숫자:7 입력하신 숫자는 아닙니다 1 까지 5 사이의 ! 게임 종료
continue 명령어는 break 명령어와 유사하지만, 하나의 차이점이 있습니다. 그것은 모든 루프에서 나가지 않으며, 단지 현재 루프에서 나가는 것입니다.
위의 예제를 수정하여:
#!/bin/bash while : do echo -n "입력 1 까지 5 사이의 숫자: " read aNum case $aNum in 1|2|3|4|5) echo "입력하신 숫자는 $aNum!" ;; *) echo "입력하신 숫자는 아닙니다" 1 까지 5 사이의 !" continue echo "게임 종료" ;; esac done
코드를 실행하여 발견하면, 입력이大于5의 숫자를 입력할 때, 이 예제의 루프는 끝나지 않으며, 문장echo "게임 종료"절대 실행되지 않습니다.