시스템 관리 중 bash 셸 스 크 립 트 상용 방법 요약
일상적인 시스템 관리 작업 에서 특정한 기능 을 수행 하기 위해 스 크 립 트 를 작성 해 야 합 니 다. 셸 스 크 립 트 를 작성 하 는 것 은 기본 적 인 기능 입 니 다!작성 하 는 과정 에서 자주 사용 하 는 기교 와 문법 을 파악 하면 대부분의 기능 을 완성 할 수 있 습 니 다. 즉, 2/8 원칙 입 니 다.
1. 작은 따옴표 와 작은 따옴표 의 차이
작은 따옴표 와 작은 따옴표 의 가장 큰 차이 점 은 작은 따옴표 가 변수의 내용 을 인용 할 수 있 지만 작은 따옴표 안 은 일반 문자 일 뿐 변수의 인용 을 하지 않 고 문 자 를 직접 출력 하 는 것 입 니 다.다음 과 같은 예 를 보십시오.
[root@linux ~]# name=HaHa
[root@linux ~]# echo $name
HaHa
[root@linux ~]# myname="$name is wow"
[root@linux ~]# echo $myname
HaHa is wow
[root@linux ~]# myname='$name is wow'
[root@linux ~]# echo $myname
$name is wow
위의 예 에서 보 듯 이 작은 따옴표 를 사 용 했 을 때 $name 은 보통 문자 일 뿐 직접 출력 할 뿐 입 니 다!
2. 한 줄 씩 파일 읽 기
for line in `cat file.txt`
do
echo $line
done
cat file.txt |while read line
do
echo $line
done
:
while read line
do
echo $line
done < file.txt
3. bash 셸 스 크 립 트 에서 자주 사용 되 는 변수
$0
현재 실행 중인 스 크 립 트 나 명령 이름
$1-$9
매개 변수의 위 치 를 대표 합 니 다. 예 를 들 어 $1 은 첫 번 째 매개 변 수 를 대표 합 니 다.
$#
스 크 립 트 호출 매개 변수의 개수
$@
모든 매개 변수의 내용
$*
모든 매개 변수의 내용
$$
현재 실행 중인 스 크 립 트 의 프로 세 스 번호
$?
명령 실행 후 되 돌아 오 는 상태
$!
배경 에서 실행 되 는 마지막 프로 세 스 번호
주의: $?이전 명령 이 올 바 르 게 실행 되 었 는 지 확인 하 는 데 사 용 됩 니 다. (Linux 에서 명령 종료 상 태 는 0 으로 명령 이 올 바 르 게 실행 되 었 음 을 표시 합 니 다. 0 값 이 아 닌 명령 이 잘못 되 었 음 을 표시 합 니 다) $$변 수 는 임시 저장 파일 의 이름 으로 임시 저장 파일 이 중복 되 지 않도록 하 는 것 이 가장 흔 합 니 다. $*$@ 과 출력 이 같 지만 for 순환 을 사용 하고 있 습 니 다. 더 블 따옴표 (") 를 사용 할 때"$* "는 하나의 요소 로 출력 되 고"$@ "은 매개 변수 가 하나의 요소 로 출력 됩 니 다.
테스트 예 를 보십시오
#cat test.sh
#!/bin/sh
echo '"$@" output.....'
for i in "$@"
do
echo $i
done
echo '"$*" output ....'
for i in "$*"
do
echo $i
done
출력 결과
#sh test.sh a b c d
"$@" output.....
a
b
c
d
"$*" output ....
a b c d
출력 결 과 를 보면 '$*' 출력 은 한 줄 이 고 '$@' 출력 은 네 줄 임 을 알 수 있 습 니 다.
4. 변수 내용 의 삭제 와 교체
우 리 는 일부 상황 에서 변수 에 있 는 문 자 를 삭제 하거나 교체 하려 면 다음 표 에 표 시 된 방법 을 사용 해 야 합 니 다.
변수 설정 방식
설명 하 다.
${변수\# 키워드}
변수 내용 이 처음부터 시 작 된 자료 가 '키워드' 에 부합 하면 최 단 자 료 를 삭제 합 니 다.
${변수\#\# 키워드}
변수 내용 이 처음부터 시 작 된 자료 가 '키워드' 에 부합 하면 최 장 자 료 를 삭제 합 니 다.
${변수% 키워드}
변수 내용 이 끝 에서 앞으로 의 자료 가 '키워드' 에 부합 하면 가장 짧 은 자 료 를 삭제 합 니 다.
${변수%% 키워드}
변수 내용 이 끝 에서 앞으로 의 자료 가 '키워드' 에 부합 하면 가장 긴 자 료 를 삭제 합 니 다.
${변수/오래된 문자열/새 문자열}
변수 내용 이 '오래된 문자열' 에 맞 으 면 '첫 번 째 오래된 문자열 은 새 문자열 로 대 체 됩 니 다.
${변수//오래된 문자열/새 문자열}
변수 내용 이 '오래된 문자열' 에 맞 으 면 '모든 오래된 문자열 이 새 문자열 로 대 체 됩 니 다.
예 를 들 어 다음 과 같 습 니 다.
[root@linux ~]# export test_str="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
[root@linux ~]# echo ${test_str#/*kerberos/bin:}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
5. 변수 조건 테스트 할당
어떤 때 에 우 리 는 특정한 변수 가 존재 하 는 지 판단 해 야 합 니 다. 변수 가 존재 하면 이 변 수 를 새로운 변수 에 할당 하고 변수 가 존재 하지 않 으 면 다른 값 을 새로운 변수 에 할당 합 니 다.
변수 설정 방식
str 정의 되 지 않 음
str 빈 문자열
str 가 비어 있 지 않 은 문자열 로 할당 되 었 습 니 다.
var=${str-expr}
var=expr
var=
var=$str
var=${str:-expr}
var=expr
var=expr
var=$str
var=${str+expr}
var=
var=expr
var=expr
var=${str:+expr}
var=
var=
var=expr
var=${str?expr}
expr 를 stderr 로 출력
var=
var=$str
var=${str:?expr}
expr 를 stderr 로 출력
expr 를 stderr 로 출력
var=$str
var=${str=expr}
var=expr
var=
var=$str
var=${str:=expr}
var=expr
var=expr
var=$str
예 를 들 면 다음 과 같다.
[root@linux ~]# test_name=""
[root@linux ~]# test_name=${test_name-root}
[root@linux ~]# echo $test_name
<== test_name ! !
[root@linux ~]# test_name=${test_name:-root}
[root@linux ~]# echo $test_name
root <== ‘:’ , !
기본적으로 이러한 변수의 테스트 도 셸 script 안의 if... then 을 통 해 처리 할 수 있 습 니 다. 그러나 상기 에서 언급 한 간단 한 방법 으로 변 수 를 테스트 하 는 것 은 프로그램 이 더욱 간소화 해 보 입 니 다!
6. 셸 의 구분자: 변수 IFS 사용
셸 스 크 립 트 에서 for 를 사용 하여 한 문 자 를 반복 하면 기본적으로 빈 칸 으로 문 자 를 나 눕 니 다. 그리고 앞에서 언급 한 for 순환 을 사용 하여 한 줄 한 줄 씩 파일 내용 을 읽 을 때 파일 줄 에 빈 칸 이 있 으 면 출력 결과 도 어 지 럽 습 니 다. 이 럴 때 IFS 변 수 를 사용 하여 특정한 문자 분할 문 자 를 설정 하여 출력 이 올 바른 목적 을 달성 합 니 다. 기본 값 으로 는 IFS 변 수 를 사용 합 니 다.IFS 는 < space > < tab > < new line >, 빈 칸 't' n 을 기본 분할 문자 로 사용 합 니 다.
앞에서 for 를 사용 하여 파일 을 한 줄 씩 읽 는 예 를 개선 하면 출력 이 정확 합 니 다. 아래 를 보십시오.
#!/bin/bash
IFS_old=$IFS # IFS ,
IFS=$’"n’ # IFS $’"n’
for line in `cat file.txt`
do
echo $line
done
file. txt 파일 내용 은 다음 과 같 습 니 다.
[root@linux]$ cat file.txt
sdfsdfsdfsdf
ssssss ssssss ssssss sssss
sdfsdfsdfsdfsdf
테스트 프로그램 출력 결 과 는 다음 과 같 습 니 다 (올 바른 출력)
[root@linux]$ sh test.sh
sdfsdfsdfsdf
ssssss ssssss ssssss sssss
sdfsdfsdfsdfsdf
IFS 변수 가 설정 되 어 있 지 않 으 면 기본 IFS 변수 값 을 사용 합 니 다. 출력 결 과 는 다음 과 같 습 니 다.
[root@linux]$ sh test.sh
sdfsdfsdfsdf
ssssss
ssssss
ssssss
sssss
sdfsdfsdfsdfsdf
상기 테스트 프로그램의 출력 결 과 는 자신의 수요 에 따라 IFS 변 수 를 설정 할 수 있 습 니 다. 예 를 들 어 다음 과 같 습 니 다.
while IFS=: read userName passWord userID groupID geCos homeDir userShell
do
echo "$userName -> $homeDir"
done < /etc/passwd
7. 셸 배열 의 사용
배열 할당 방식:
(1) array=(var1 var2 var3 ... varN)
(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)
(3) array[0]=var1
arrya[1]=var2
...
array[n]=varN
배열 요소 의 개수 나 길 이 를 계산 합 니 다:
(1) ${#array[@]}
(2) ${#array[*]}
배열 기초 문법 을 알 게 되 었 습 니 다. 예 를 들 어 설명 하 겠 습 니 다. 보 세 요.
#!/bin/bash
NAMESERVERS=("ns1.www.net." "ns2.www.net." "ns3.www.net.")
#
tLen=${#NAMESERVERS[@]}
#
for (( i=0; i<${tLen}; i++ ));
do
echo ${NAMESERVERS[$i]}
done
복잡 한 예 를 보고 파일 내용 을 배열 로 읽 습 니 다.
#!/bin/bash
# IFS ("n)
OLDIFS=$IFS
IFS=$'"n'
#
fileArray=($(cat file.txt))
# restore it
IFS=$OLDIFS
tLen=${#fileArray[@]}
#
for (( i=0; i<${tLen}; i++ ));
do
echo "${fileArray[$i]}"
done
8. 논리 적 판단 조건 테스트
테스트 결과
-e filename
파일 이 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
-r filename
파일 을 읽 고 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
-w filename
파일 은 1 을 되 돌려 쓸 수 있 습 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
-x filename
파일 은 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
-o filename
파일 은 사용자 본인 이 1 로 돌아 가 는 것 입 니 다. 그렇지 않 으 면 0 으로 돌아 갑 니 다.
-z filename
파일 길 이 는 0 으로 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
-f filename
파일 은 일반 파일 로 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
-d filename
파일 이 디 렉 터 리 파일 일 때 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
예 를 들 어 다음 과 같이 파일 이 존재 하 는 지 테스트 합 니 다.
#!/bin/bash
echo "checks the existence of the messages file."
echo -n "Checking..."
if [ -f /var/log/messages ];then
echo "/var/log/messages exists."
fi
echo
echo "...done."
결 과 를 비교 하 다
str1 = str2
두 문자열 이 같 을 때 진짜 입 니 다.
str1 != str2
두 문자열 이 같 지 않 을 때 진실 이다.
-n str1
문자열 의 길이 가 0 보다 클 때 진짜 입 니 다.
-z str1
문자열 의 길이 가 0 일 때 진짜 입 니 다.
str
문자열 이 비어 있 지 않 을 때 진실 입 니 다.
예 를 들 어 다음 과 같이 문자열 을 비교 하여 사용자 ID 를 테스트 합 니 다.
if [ "$(whoami)" != 'root' ]; then
echo "You have no permission to run $0 as non-root user."
exit 1;
fi
결 과 를 비교 하 다
num1 -eq num2
두 수가 같 으 면 진짜 가 된다.
num1 -ne num2
두 수가 같 지 않 으 면 진짜 가 된다.
num1 -gt num2
num 1 이 num 2 보다 크 면 진짜 입 니 다.
num1 -ge num2
num 1 이 num 2 보다 크 면 진짜 입 니 다.
num1 -lt num2
num 1 이 num 2 보다 작 으 면 진짜 입 니 다.
num1 -le num2
num 1 보다 작 으 면 num 2 가 진짜 입 니 다.
예 를 들 면 다음 과 같다.
num=`wc -l work.txt`
if [ $num -gt 150 ];then
echo "you've worked hard enough for today."
echo
fi
자세 한 테스트 동작 을 보 려 면 man 매 뉴 얼 man test 를 볼 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.