쉘 프로세스 제어


Java, PHP 및 기타 언어와 달리 sh의 프로세스 제어는 비워둘 수 없습니다. 예를 들어 다음은 PHP 프로세스 제어를 작성하는 방법입니다.

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // 不做任何事情
}

else 분기가 있는 경우 sh/bash에서 이와 같이 작성할 수 없습니다. 실행할 명령문이 없으면 이 내용을 쓰지 마십시오.


if else

if

if 문 구문 형식:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

한 줄로 작성됨(터미널 명령 프롬프트에 적용 가능):

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

끝에 있는 fi는 철자를 거꾸로 쓰면 나중에 비슷한 구문을 만나게 됩니다.

if else

if else 문법 형식:

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

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 문은 아래와 같이 테스트 명령과 함께 자주 사용됩니다.

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi

출력 결과:

两个数字相等!

for loop

다른 프로그래밍 언어와 유사하게 Shell은 for 루프를 지원합니다.

for 루프의 일반적인 형식은 다음과 같습니다.

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

한 줄로 작성:

for var in item1 item2 ... itemN; do command1; command2… done;

변수 값이 목록에 있으면 for 루프는 모든 명령을 한 번 실행하고 변수 이름을 사용하여 현재 값을 가져옵니다. 목록. 명령은 유효한 쉘 명령 및 명령문일 수 있습니다. in 목록에는 대체 항목, 문자열 및 파일 이름이 포함될 수 있습니다.

in list는 선택 사항입니다. 사용하지 않으면 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

문자열의 문자를 순차적으로 출력합니다:

for str in 'This is a string'
do
    echo $str
done

출력 결과:

This is a string

while 문

while 루프를 사용하여 입력 파일에서 데이터를 읽는 데에도 사용되는 일련의 명령을 지속적으로 실행합니다. 명령은 일반적으로 테스트 조건입니다. 형식은 다음과 같습니다.

while condition
do
    command
done

다음은 기본 while 루프입니다. 테스트 조건은 int가 5보다 작거나 같으면 조건이 true를 반환합니다. int는 0부터 시작하여 루프가 처리될 때마다 1씩 증가합니다. 위 스크립트를 실행하고 1부터 5까지의 숫자를 반환한 후 종료합니다.

#!/bin/sh
int=1
while(( $int<=5 ))
do
        echo $int
        let "int++"
done

스크립트 실행:

1
2
3
4
5

하나 이상의 표현식을 실행하는 데 사용되는 Bash let 명령이 사용됩니다. 변수 계산에서 변수를 나타내기 위해 $를 추가할 필요는 없습니다. 배쉬 명령

.

While 루프를 사용하여 키보드 정보를 읽을 수 있습니다. 다음 예에서는 입력 정보가 ​​FILM 변수로 설정되고 <Ctrl-D>를 누르면 루프가 종료됩니다.

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的电影名: '
while read FILM
do
    echo "是的!$FILM 是一部好电影"
done

스크립트를 실행하면 출력은 다음과 유사합니다.

按下 <CTRL-D> 退出
输入你最喜欢的电影名: w3cschoolphp中文网
是的!w3cschoolphp中文网 是一部好电影

무한 루프

무한 루프 구문 형식:

while :
do
    command
done

또는

while true
do
    command
done

또는

for (( ; ; ))



until 루프

until 실행할 루프 조건이 참일 때 중지가 될 때까지 일련의 명령입니다.

until 루프와 while 루프는 처리 방식이 정반대입니다.

일반적으로 while 루프는 Until 루프보다 낫지만 때로는 - 그리고 드문 경우지만 - 루프가 더 유용할 때도 있습니다.

구문 형식:

until condition
do
    command
done

조건은 모든 테스트 조건이 될 수 있습니다. 테스트는 루프 끝에서 발생하므로 루프는 적어도 한 번 실행됩니다. 이에 유의하세요.


case

Shell Case 문은 다중 선택 문입니다. Case 문을 사용하여 값과 패턴을 일치시킬 수 있습니다. 일치에 성공하면 일치하는 명령이 실행됩니다. 사례 설명 형식은 다음과 같습니다.

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

케이스는 위와 같이 작동합니다. 값 뒤에는 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

Break out of the loop

루프 중에 때로는 루프 종료 조건에 도달하지 않았을 때 루프를 강제로 중단하려면 쉘이 이 기능을 달성하기 위해 break와 continue라는 두 가지 명령을 사용합니다.

break 명령

break 명령을 사용하면 모든 루프를 중단할 수 있습니다(모든 후속 루프 실행 종료).

아래 예에서 스크립트는 사용자가 5보다 큰 숫자를 입력할 때까지 무한 루프에 들어갑니다. 이 루프를 중단하고 쉘 프롬프트로 돌아가려면 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

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 "Game is over!" 문이 실행되지 않는 것을 확인하세요. .


esac

case 구문은 C 계열 언어와 매우 다릅니다. 끝 표시로 esac(대소문자의 반대), 각 사례 분기에 오른쪽 괄호, 중단을 나타내는 두 개의 세미콜론이 필요합니다.