기본 셸 지식

8478 단어 linux
1. 변수 에 값 을 부여 할 때 변수, 등호, 값 사이 에 빈 칸 이 있 으 면 안 됩 니 다. 2. 명령 의 출력 값 을 변수 에 어떻게 부여 합 니까?'기 호 를 사용 합 니 다. 예 를 들 어 date 명령 의 출력 값 을 a 라 는 변수 a =' date '또는 a = $(date) 라 는 용법 은 매우 의미 가 있 습 니 다. 예 를 들 어 로그 파일 생 성 에 사용 할 수 있 습 니 다.
#!/bin/sh
file=`date +%Y%m%d`
ls > ${file}.log

3. export 변 수 는 하위 프로 세 스에 미 치 는 영향 입 니 다. 만약 변수 가 export 가 없다 면 이 변 수 는 현재 셸 의 환경 변수 에 가입 하지 않 을 것 입 니 다. 따라서 하위 프로 세 스 도 이 변수의 값 을 보지 못 할 것 입 니 다.4. 하위 프로 세 스 와 하위 셸 의 차이 점 은 코드 를 먼저 봅 니 다.
unset abcd
abcd=1
(echo "a=${a}")
sh -c 'echo a=${a}'

이 코드 의 출력:
a=1
a=

우선 명령 을 묶 는 것 이 무슨 뜻 인지 설명 하 십시오. 하위 셸 을 사용 하여 이 명령 을 수행 합 니 다.sh - c 'echo a = ${a}' 이 명령 은 하위 프로 세 스 를 생 성하 여 이 명령 을 수행 하 는 것 입 니 다.
하위 셸 은 a = 1 을 출력 합 니 다. 하위 셸 은 부모 프로 세 스 fork 에서 키 프로 세 스 를 만 들 었 기 때 문 입 니 다. 이 하위 프로 세 스 는 부모 프로 세 스 와 거의 같 습 니 다. (할당 할 수 없 는 양 을 제외 하고) 물론 a 도 복사 되 었 기 때문에 하위 셸 은 a = 1 을 출력 합 니 다.그러나 sh - c 'echo a = ${a}' 이 명령 도 부모 프로 세 스 fork 에서 키 프로 세 스 를 내 어 이 명령 을 실 행 했 지만 fork 이후 exec 함 수 를 실 행 했 고 bash 프로그램 을 다시 실 행 했 기 때문에 코드 세그먼트, 변 수 는 모두 새로운 프로그램 으로 바 뀌 었 기 때문에 a 의 값 은 비어 있 지만 exec 함 수 를 실행 할 때 환경 변 수 를 전달 하 는 것 을 알 수 있 습 니 다.이것 도 export 이후 의 변수 가 하위 프로 세 스에 서 볼 수 있 는 이유 입 니 다.
5. 파 이 프 를 사용 할 때 Linux 시스템 은 실제 적 으로 파이프 기호 전후의 두 명령 을 동시에 실행 하고 시스템 내부 에서 연결 합 니 다.첫 번 째 명령 이 출력 을 만 드 는 동시에 출력 은 두 번 째 명령 에 즉시 전 달 됩 니 다.데이터 전송 은 중간 파일 이나 버퍼 를 사용 하지 않 습 니 다.
테스트 프로그램: test. sh
#!/bin/bash
echo "abcd"
sleep 3
echo "efg"

셸 에서 실행 합 니 다./test. sh | cat 는 첫 번 째 명령 이 실행 되 기도 전에 출력 이 있 는 것 을 볼 수 있 습 니 다.
6. if 구문 (1) 형식:
if command
then
	command
fi

if 가 command 가 종료 되 었 는 지 여 부 를 0 으로 판단 하 는 것 을 기억 하 십시오. command 가 실 행 된 것 이 true 인지 false 인지 아 닙 니 다.(2) if - then - else 구문 형식:
if command
then
	command
else
	command
fi

(3) if - then - elif 형식:
if command
then
	command
elif command
then
	command
fi

우 리 는 일반적으로 프로그램 에서 조건 이 성립 되 는 지 여 부 를 판단 해 야 하지만, 여 기 는 명령 의 종료 상태 만 판단 할 수 있 습 니 다. 어떤 명령 이 이러한 수 요 를 만족 시 킬 수 있 습 니까? 있 습 니 다!이 명령 은 test 입 니 다. 이 명령 이 성립 되 지 않 으 면 상태 가 1 이 아니 라 성립 되면 상태 0 으로 돌아 갑 니 다.
7. if 판단 의 몇 가지 유형 (1) 수치 비교
n1 -eq n2       n1是否等于n2
n1 -ne n2       n1是否不等于n2
n1 -ge n2       n1是否大于或等于n2
n1 -gt n2       n1是否大于n2
n1 -le n2       n1是否小于等于n2
n1 -lt n2       n1是否小于n2

(2) 문자열 비교
str1 = str2           str1是否等于str2,=两边要有空格,否则为赋值了
str1 != str2          str1是否不等于str2
str1 < str2           str1是否小于str2
str1 > str2           str1是否大于str2
-n str1               str1长度是否非0
-z str1               str1长度是否为0,即为NULL

(3) 파일 비교
-d file 检查file是否存在并是一个目录
-e file 检查file是否存在
-f file 检查file是否存在并是一个文件
-r file 检查file是否存在并可读
-s file 检查file是否存在并非空
-w file 检查file是否存在并可写
-x file 检查file是否存在并可执行
-O file 检查file是否存在并属当前用户所有
-G file 检查file是否存在并且默认组与当前用户相同
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧

(4) 논리 적 판단
-a         与 
-o        或 
!        非

8. 복합 조건 테스트
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]

9. for 순환 형식:
for var in list
do
	commands
done

예 를 들 어 현재 디 렉 터 리 아래 의 모든 파일 이름 을 인쇄 합 니 다 (숨겨 진 파일 은 포함 되 지 않 습 니 다)
#!/bin/bash
for test in *
do
        echo $test
done

값 list 의 목록 은 기본적으로 빈 칸 으로 구 분 됩 니 다. 값 자체 에 빈 칸 이 포함 되 어 있 으 면 작은 따옴표 로 값 을 싸 고 작은 따옴표 는 값 의 일부분 이 아 닙 니 다.10. while 순환
while test command
do
	other commands
done

11. 수치 형 변 수 를 어떻게 사용 하 는 지 let 명령 을 사용 합 니 다. 예 를 들 어 현재 폴 더 아래 에 있 는 10 개의 파일 을 인쇄 해 야 합 니 다.
#!/bin/bash
let i=0
for file in *
do
        if [ $i -ge 10 ]
        then 
                break
        else
                let i++
                echo $file
        fi
done

12. 명령 행 인 자 를 어떻게 처리 하 는 지 명령 전달 인자 가 필요 할 때 우 리 는 특수 한 변 수 를 사용 할 수 있 습 니 다.
$#               命令行参数的个数
$0               命令的名称
$1               命令行的第一个参数
$2               命令行的第二个参数,依此类推
$?               上一次命令的退出状态
$*               全部命令行参数
$@               全部命令行参数,与$*稍有差别

스 크 립 트 를 실행 할 때 스 크 립 트 에 인 자 를 입력 하여 스 크 립 트 의 실행 행 위 를 결정 할 수 있 습 니 다. 예 를 들 어
./test.sh -a -b input.txt

이 명령 행 의 뜻 이 test. sh 라 고 가정 하면 이 스 크 립 트 는 - a 라 는 옵션 을 사 용 했 고 - b 라 는 옵션 도 사 용 했 습 니 다. 그리고 - b 라 는 옵션 은 인자 input. txt 를 가 져 왔 습 니 다. 그러면 프로그램 에서 이 매개 변 수 를 어떻게 식별 합 니까?가장 간단 한 것 은 프로그램 에서 케이스 를 사용 하여 효과 적 인 옵션 을 판단 하 는 것 입 니 다. 예 를 들 어:
#!/bin/bash
while [ -n "$1" ]
do
        case "$1" in
                -a) echo "option -a";;
                -b) para=$2
                        echo "option -b with para $para"
                        shift;;
                # 默认--后面的参数是作为命令行的参数,而不是选项的参数
                --) shift   
                        break;;
                *) echo "$1 is not a option";;
        esac
        shift
done

test. sh 를 실행 해 보 세 요.
root@ubuntu:~/traninig/shell_test$ ./test.sh -a -b 1
option -a
option -b with para 1

이렇게 하면 당연히 비교적 간단 한 명령 옵션 입 니 다. 조합 옵션 을 만나면 어떻게 합 니까? 예 를 들 어:
./test.sh -ab 1

이 때 getopt 명령 을 사용 하여 옵션 을 해석 해 야 합 니 다. 옵션 을 해석 하 는 형식 은 이 렇 습 니 다.
getopt 选项排列(如选项带参数,则选项后面加冒号)   命令选项

위의 예 를 사용 하여.../test. sh - ab 1 을 정확하게 해석 할 수 있 도록 합 니 다.
root@ubuntu:~/traninig/shell_test$ getopt ab: -ab 1
 -a -b 1 --

설명:
getopt   解析组合选项的命令
ab:      说明需要使用的选项,都是单个字母一个选项
-ab 1    组合选项
输出:-a -b 1 --   这个就是简化了的命令行选项参数,可以使用上面的办法进行解析

이것 을 프로그램 에 사용 하 세 요.
#!/bin/bash
#set命令将--后面的内容设置成命令行参数,也就是$@
set -- $(getopt ab: "$@")
while [ -n "$1" ]
do
        case "$1" in
                -a) echo "option -a";;
                -b) para=$2
                        echo "option -b with para $para"
                        shift;;
                --) shift
                        break;;
                *) echo "$1 is not a option";;
        esac
        shift
done

테스트:
root@ubuntu-146:~/traninig/shell_test$ ./test.sh -ab 1
option -a
option -b with para 1

하지만 이 getopt 는 매개 변수 에 빈 칸 이 있 는 것 을 처리 할 수 없습니다.
root@ubuntu-146:~/traninig/shell_test$ ./test.sh -ab "1 2"
option -a
option -b with para 1
2 is not a option

명령 옵션 매개 변수 에 빈 칸 을 사용 할 수 있 도록 getopts 명령 을 사용 하여 옵션 매개 변 수 를 분석 해 야 합 니 다. getopts 의 사용 과 getopt 의 사용 방법 은 크게 다 릅 니 다.
#!/bin/bash
while getopts ab: opt
do
        case "$opt" in
                a) echo "option -a";;
                b) echo "option -b with para $OPTARG";;
                *) echo "unknown option $OPTARG";;
        esac
done

우선, getopts 의 사용 은 다 릅 니 다. getopts 는 먼저 내부 에서 $@ 의 내용 을 분석 한 다음 에 차례대로 opt 를 채 워 서 판단 합 니 다. 또한 분 석 된 내용 도 getopt 와 다 릅 니 다. getopts 가 분석 한 옵션 이 없 음 이 분명 합 니 다. 그래서 case 에 옵션 의 앞 에는 - 가 없습니다. 또한 두 개의 환경 변수, OPTARG 와 OPTIND 도 있 습 니 다. 옵션 이 파 라 메 터 를 가지 고 있다 면,그러면 OPTARG 의 내용 은 바로 매개 변수 입 니 다. OPTIND 는 getopts 가 매개 변 수 를 처리 하 는 위 치 를 대표 합 니 다. 매개 변 수 를 처리 할 때마다 OPTIND 는 1 을 추가 합 니 다. 이 OPTIND 매개 변 수 는 명령 에 전 달 된 매개 변수 에 사용 할 수 있 습 니 다.
#!/bin/bash
while getopts ab: opt
do
        case "$opt" in
                a) echo "option -a";;
                b) echo "option -b with para $OPTARG";;
                *) echo "unknown option $OPTARG";;
        esac
done
shift $[ $OPTIND-1 ]
count=1
for para in "$@"
do
        echo "#para${count} : ${para}"
        shift
        let count++
done

13. 입 출력 재 설정 입력 재 설정:
exec 3&-               #将3重定向到-,这是一个特殊的描述符,意思就是关闭3

해당 되 는 출력 방향 변경:
exec 3>&1               #将3重定向到1,也就是保存了标准输出
exec 1> inputfile       #将标准输出重定向到inputfile这个文件
exec 1>&3               #将1重定向到3,恢复标准输出
exec 3>&-               #将3重定向到-,这是一个特殊的描述符,意思就是关闭3

표준 입 출력 에 사용 되 는 기호 가 다 릅 니 다. 출력 은 ">"입 니 다. 입력 할 때 "물론 파일 설명 자 를 입 출력 으로 바 꿀 수도 있 습 니 다. 그러나 일부 문제 가 발생 할 수 있 습 니 다. 14, 다 중 명령 실행"."& &"와 함께 사용 해 야 합 니 다. ""시, 앞의 명령 이 성공 하 든 안 하 든 뒤의 명령 이 실 행 됩 니 다."& "시, 앞의 명령 만 실 행 됩 니 다. 뒤의 명령 만 실 행 됩 니 다.

좋은 웹페이지 즐겨찾기