수색…
통사론
- [ "$ 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
}