기본 셸 지식
8478 단어 linux
#!/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, 다 중 명령 실행"."& &"와 함께 사용 해 야 합 니 다. ""시, 앞의 명령 이 성공 하 든 안 하 든 뒤의 명령 이 실 행 됩 니 다."& "시, 앞의 명령 만 실 행 됩 니 다. 뒤의 명령 만 실 행 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.