수색…


통사론

  • [ "$ 1"= "$ 2"] # ""대괄호는 실제로 명령입니다. 이 때문에 그것은 공간을 필요로합니다.
  • test "$ 1"= "$ 2"#Test는 "["명령의 동의어입니다

매개 변수

매개 변수 [또는 테스트 세부
파일 연산자 세부
-e "$file" 파일이 존재하면 true를 반환합니다.
-d "$file" 파일이 존재 해, 디렉토리 인 경우는 true를 돌려줍니다.
-f "$file" 파일이 존재하고 일반 파일 인 경우 true를 반환합니다.
-h "$file" 파일이 존재하고 심볼릭 링크 인 경우 true를 반환합니다.
문자열 비교기 세부
-z "$str" string의 길이가 제로의 경우는 true
-n "$str 문자열의 길이가 0이 아닌 경우 참
"$str" = "$str2" string $ str이 string $ str2와 같으면 true입니다. 정수에는 적합하지 않습니다. 그것은 효과가 있을지 모르지만 불일치 할 것이다.
"$str" != "$str2" 문자열이 같지 않으면 True입니다.
정수 비교기 세부
"$int1" -eq "$int2" 정수가 동일한 경우는 true
"$int1" -ne "$int2" 정수가 등가가 아닌 경우는 true
"$int1" -gt "$int2" int1이 int2보다 큰 경우 true
"$int1" -ge "$int2" int1가 int2보다 크거나 같으면 true를 반환합니다.
"$int1" -lt "$int2" int1이 int 2보다 작 으면 true입니다.
"$int1" -le "$int2" int1가 int2보다 작거나 같은 경우 true

비고

bash에는 많은 비교기 매개 변수가 있습니다. 모든 항목이 아직 여기에 나열되어 있지는 않습니다.

If 문

if [[ $1 -eq 1 ]]; then
    echo "1 was passed in the first parameter"
elif [[ $1 -gt 2 ]]; then
    echo "2 was not passed in the first parameter"
else
    echo "The first parameter was not 1 and is not more than 2."
fi

닫기 fi 가 필요하지만 elif 및 / 또는 else 절은 생략 할 수 있습니다.

전에 세미콜론 then 한 줄에 두 명령을 결합하기위한 표준 문법이다; 다음 줄로 이동 then 경우에만 생략 할 수 있습니다.

대괄호 ( [[ 는 구문의 일부는 아니지만 명령으로 처리됩니다. 테스트중인이 명령의 종료 코드입니다. 따라서 대괄호 주위에는 항상 공백을 포함해야합니다.

이것은 또한 어떤 명령의 결과도 테스트 할 수 있음을 의미합니다. 명령의 종료 코드가 0이면 명령문은 true로 간주됩니다.

if grep "foo" bar.txt; then
    echo "foo was found"
else
    echo "foo was not found"
fi

수학 표현식은 이중 괄호 안에있을 때도 같은 방식으로 0 또는 1을 반환하며 테스트 할 수도 있습니다.

if (( $1 + 5 > 91 )); then
    echo "$1 is greater than 86"
fi

하나의 대괄호로 if 문을 접할 수도 있습니다. 이들은 POSIX 표준에 정의되어 있으며 Bash를 포함한 모든 POSIX 호환 쉘에서 작동합니다. 구문은 Bash의 구문과 매우 유사합니다.

if [ "$1" -eq 1 ]; then
    echo "1 was passed in the first parameter"
elif [ "$1" -gt 2 ]; then
    echo "2 was not passed in the first parameter"
else
    echo "The first parameter was not 1 and is not more than 2."
fi

While 루프

#! /bin/bash

i=0

while [ $i -lt 5 ] #While i is less than 5
do
    echo "i is currently $i"
    i=$[$i+1] #Not the lack of spaces around the brackets. This makes it a not a test expression
done #ends the loop

테스트 중에 (while 문 다음에) 대괄호 주위에 공백이 있음을주의하십시오. 이러한 공간이 필요합니다.

이 루프는 다음을 출력합니다.

i is currently 0
i is currently 1
i is currently 2
i is currently 3
i is currently 4

For Loop

#! /bin/bash

for i in 1 "test" 3; do #Each space separated statement is assigned to i
    echo $i
done

다른 명령은 반복 할 명령문을 생성 할 수 있습니다. "For 루프를 사용하여 숫자 오버 반복"예제를 참조하십시오.

이 결과는 다음과 같습니다.

1
test
3

For Loop를 사용하여 숫자 반복 목록 표시

#! /bin/bash

for i in {1..10}; do # {1..10} expands to "1 2 3 4 5 6 7 8 9 10"
    echo $i
done

그러면 다음과 같이 출력됩니다.

1
2
3
4
5
6
7
8
8
10

C 스타일 구문의 For 루프

C 스타일 for 루프의 기본 형식은 다음과 같습니다.

for (( variable assignment; condition; iteration process ))

노트:

  • C 스타일 for 루프 내부에 변수를 할당하면 일반적인 할당과 달리 공백을 포함 할 수 있습니다
  • C 스타일 for 루프 내의 변수 앞에는 $ 붙지 않습니다.

예:

for (( i = 0; i < 10; i++ ))
do
    echo "The iteration number is $i"
done

또한 C 스타일 for 루프 내부에서 여러 변수를 처리 할 수 ​​있습니다.

for (( i = 0, j = 0; i < 10; i++, j = i * i ))
do
    echo "The square of $i is equal to $j"
done

루프까지

조건이 참이 될 때까지 루프가 실행될 때까지

i=5
until [[ i -eq 10 ]]; do #Checks if i=10
    echo "i=$i" #Print the value of i
    i=$((i+1)) #Increment i by 1
done

산출:

i=5
i=6
i=7
i=8
i=9

i 10에 도달하면 until 루프의 조건이 true가되고 루프가 끝납니다.

계속하고 쉬다.

계속을위한보기

for i in [series]
do
    command 1
    command 2
    if (condition) # Condition to jump over command 3
            continue # skip to the next value in "series"
    fi
    command 3
done

중단의 예

for i in [series]
do
    command 4
    if (condition) # Condition to break the loop
    then
            command 5 # Command if the loop needs to be broken
            break
    fi
    command 6 # Command to run if the "condition" is never true 
done

배열에 대한 루핑

for 루프 :

arr=(a b c d e f)
for i in "${arr[@]}";do
    echo "$i"
done

또는

for ((i=0;i<${#arr[@]};i++));do
    echo "${arr[$i]}" 
done

while 루프 :

i=0
while [ $i -lt ${#arr[@]} ];do
    echo "${arr[$i]}"
    i=$(expr $i + 1)
done

또는

i=0
while (( $i < ${#arr[@]} ));do
    echo "${arr[$i]}"
    ((i++))
done

반복 중단

다중 루프 중단 :

arr=(a b c d e f)
for i in "${arr[@]}";do
    echo "$i"
    for j in "${arr[@]}";do
        echo "$j"
        break 2
    done
done

산출:

a
a

단일 루프 중단 :

arr=(a b c d e f)
for i in "${arr[@]}";do
    echo "$i"
    for j in "${arr[@]}";do
        echo "$j"
        break
    done
done

산출:

a
a
b
a
c
a
d
a
e
a
f
a

대소 문자를 사용하여 문 전환

case 문을 사용하면 값을 하나의 변수와 비교할 수 있습니다.

case 전달 된 인수가 확장되어 각 패턴과 일치하는지 확인합니다.

일치하는 것이 발견되면 upto ;; 실행됩니다.

case "$BASH_VERSION" in
 [34]*)
    echo {1..4}
    ;;  
  *)
    seq -s" " 1 4
esac

패턴은 정규식이 아니라 쉘 패턴 매칭 (별칭 glob)입니다.

list-of-words 매개 변수가없는 For 루프

for arg; do
    echo arg=$arg
done

단어 목록이없는 for 루프는 위치 매개 변수를 반복합니다. 즉 위의 예는 다음 코드와 같습니다.

for arg in "$@"; do
    echo arg=$arg
done

다른 말로하면, for i in "$@"; do ...; done 자신을 포기한다면 for i in "$@"; do ...; done , 그냥 드롭 in 부분, 단순히 쓰기 for i; do ...; done .

명령리스트의 조건부 실행

조건부 명령리스트 실행 방법

모든 내장 명령, 표현식 또는 함수뿐만 아니라 외부 명령 또는 스크립트는 조건 적으로 && (and)|| (또는) 연산자.

예를 들어, cd 명령이 성공한 경우에만 현재 디렉토리를 인쇄합니다.

cd my_directory && pwd

마찬가지로 cd 명령이 실패하면 재앙을 방지하면서 종료됩니다.

cd my_directory || exit
rm -rf *

이런 식으로 여러 문장을 결합 할 때, (많은 C 스타일의 언어와 달리) 이 연산자는 우선 순위가없고 왼쪽 연관 이라는 것을 기억하는 것이 중요합니다.

따라서이 진술은 예상대로 작동 할 것입니다 ...

cd my_directory && pwd || echo "No such directory"
  • cd 가 성공하면 && pwd 실행되고 현재 작업 디렉토리 이름이 인쇄됩니다. pwd 가 실패하지 않는 한 (드물게) || echo ... 실행되지 않습니다.
  • cd 가 실패하면 && pwd 가 생략되고 || echo ... 실행됩니다.

그러나 이것은하지 않을 것입니다 (만약 당신이 생각 if...then...else ) ...

cd my_directory && ls || echo "No such directory"
  • cd 가 실패하면 && ls 는 건너 뛰고 || echo ... 실행됩니다.
  • cd 가 성공하면 && ls 가 실행됩니다.
    • ls 가 성공하면, || echo ... 무시됩니다. (여태까지는 그런대로 잘됐다)
    • 하지만 ... ls 가 실패하면, || echo ... 도 실행됩니다.

      그것은 이전 명령 인 ls 이지 cd 아닙니다.

조건부 명령리스트를 사용하는 이유

조건부 실행은 if...then 보다 빠릅니다 if...then 하지만 주요 이점은 함수와 스크립트가 일찍 종료되거나 "단락"될 수 있다는 것입니다.

구조체와 변수를 위해 메모리가 명시 적으로 할당되는 C 와 같은 많은 언어와 달리 (따라서 할당을 해제해야합니다.) bash 는 이것을 커버하에 처리합니다. 대부분의 경우 함수를 종료하기 전에 정리할 필요가 없습니다. return 문은 스택의 반환 주소에서 함수 및 픽업 실행에 국한된 모든 것을 할당 해제합니다.

가능한 한 빨리 함수 또는 스크립트를 종료하면 코드의 불필요한 실행을 피하면서 성능을 크게 향상시키고 시스템로드를 줄일 수 있습니다. 예를 들면 ...

my_function () {

    ### ALWAYS CHECK THE RETURN CODE

    # one argument required. "" evaluates to false(1)
    [[ "$1" ]]             || return 1

    # work with the argument. exit on failure
    do_something_with "$1" || return 1
    do_something_else      || return 1

    # Success! no failures detected, or we wouldn't be here
    return 0
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow