셸 프로 그래 밍 학습 노트 [오리지널]
1. Bourne Shell 은 다음 과 같은 네 가지 변수 가 있 습 니 다.
위치 변수
$0 与键入的命令行一样,包含脚本文件名
$1, $2, ……. $9 分别包含第一个到第九个命令行参数
$# 包含命令行参数的个数
$@ 包含所有命令行参数: “$1, $2, ……. $9”会一个一个拆分解析
$? 包含前一个命令的退出状态
$* 包含所有命令行参数: “$1, $2, ……. $9”所有包括在一起解析的
$$ 包含正在执行进程的ID号
환경 변수
ts.sh
#!/bin/sh
echo “PATH=$PATH”
./ts.sh
HOME : /etc/passwd 파일 에 열 거 된 사용자 홈 디 렉 터 리
IFS: Internal Field Separator, 기본 값 은 빈 칸, tab 및 줄 바 꿈 문자 입 니 다.
PATH: 셸 검색 경로
PS1, PS2: 기본 프롬프트 ($) 및 줄 바 꾸 기 프롬프트 (>)
TERM: 터미널 유형, vt 100, ansi, vt 200, xterm 등 자주 사용 합 니 다.
4. read 용법
read 는 표준 입력 에서 한 줄 을 읽 고 뒤의 변 수 를 할당 합 니 다. 문법 은 다음 과 같 습 니 다.
read var
읽 은 데 이 터 를 모두 var 에 할당 합 니 다.
read var1 var2 var3
읽 기 줄 에 있 는 첫 번 째 단어 (word) 를 var 1 에, 두 번 째 단 어 를 var 2 에, 나머지 모든 단 어 를 마지막 변수 에 부여 합 니 다.
read 문 구 를 실행 할 때 표준 입력 이 데이터 가 없 으 면 프로그램 은 여기 서 머 물 러 서 데이터 가 오 거나 종 료 된 것 을 알 고 있 습 니 다.
#!/bin/sh
read val val2 val3
echo "val=$val"
echo "val2=$val2"
echo "val3=$val3"
5. 셸 프로 그래 밍 코드 분석
#!/bin/sh
#位置变量
#$0 与键入的命令行一样,包含脚本文件名
#$1, $2, ……. $9 分别包含第一个到第九个命令行参数
#$# 包含命令行参数的个数
#$@ 包含所有命令行参数: “$1, $2, ……. $9”会一个一个拆分解析
#$? 包含前一个命令的退出状态
#$* 包含所有命令行参数: “$1, $2, ……. $9”所有包括在一起解析的
#$$ 包含正在执行进程的ID号
#1. shell头文件
echo "hello world"
#2. 用户自定义变量
echo "please input your num:"
#接收用户输入信息
# read num
# echo "num = $num"
#3. 预定义变量
num=123
echo "num = $num"
#4. 位置变量
echo "*********<>********************* "
# $0 $1 $2 $3 $4
# ./ts1.sh 1 2 3 4
echo "argv[0]=$0"
# echo "argv[1]=$1"
echo "argv[2]=$2"
# echo "argv[3]=$3"
# echo "argv[4]=$4"
echo "argc =$#"
ls ./
echo "exit = $?" # 正常退出=0
ls ./xxx
echo "exit = $?" # 异常退出>0
echo "*************<>***************** "
#5. 特殊符号
echo "num = $num" # 双引号是保留特殊字符
echo 'num = $num' # 单引号当做字符串
echo `pwd` # 反单引号解析为shell 命令
echo "**************<>**************** "
#6. 环境变量
echo "PATH=$PATH"
#7. 算术运算
num=5
sum="expr $sum \* 6"
echo "sum=$sum"
echo $sum
sum='expr $sum \* 6'
echo "sum=$sum"
echo $sum
sum=`expr $num \* 6`
echo "sum=$sum"
echo $sum
#8. 逻辑运算
# test 表达式
# 比较字符串 比较整数 比较文件
#9. shell 控制语句
# if switch for while break ...
# 方法一 判断输入参数的个数是否小于3
if [ $# -lt 3 ]
then
echo "argc is less than 3"
else
echo "argc is great than 3"
fi
# 方法二
if [ $# -lt 3 ] ; then
echo "argc is less than 3"
else
echo "argc is great than 3"
fi
echo "******************************"
# case esac 多路分支语句
case $1 in
hello)
echo "case: hello"
;;
sky)
echo "case: sky"
;;
other)
echo "case: other nothing"
;;
*)
echo "case: * none"
;;
esac
echo "******************************"
# for语句
for name in $@
do
case $1 in
hello)
echo "case: hello"
;;
sky)
echo "case: sky"
;;
other)
echo "case: other nothing"
;;
*)
echo "case: * none"
;;
esac
done
echo "******************************"
#while语句
num=10
sum=0
while [ $num -gt 0 ]
do
sum=`expr $sum + $num`
num=`expr $num - 1`
done
echo "sum=$sum"
echo "******************************"
#break and continue
echo "**********break and continue*******************"
if [ $# = 0 ]
then
echo "Numberic arguments required"
exit
fi
if [ $# -gt 10 ] #所有位置参数
then
echo "Only ten arguments allowed"
exit
fi
for number
do
count=`expr $number % 2` #用2求模,count的值只能是0或1
if [ $count -eq 1 ] # 是奇数
then
continue #下一轮循环
else
output="$output $number" #偶数放到偶数队列中
fi
done
echo "Even number: $output"
echo "******************************"
# 10. 函数调用
# 函数不需要指定是返回什么类型
my_func()
{
set -x
echo "my function"
sum=`expr $1 + $2`
echo "sum=$sum"
return $sum
set +x
}
my_func 1 2
echo "sum2=$?"
echo "******************************"
6. test 문장의 사용
test 문 구 는 세 가지 대상 을 테스트 할 수 있 습 니 다.
문자열 정수 문건
모든 테스트 대상 에는 약간의 테스트 조작 부호 가 있다.
예 를 들 면:
test “$answer”= “yes”
변수 answer 의 값 이 문자열 yes 인지 여부
test $num -eq 18
변수 num 의 값 이 정수 18 인지 여부
test –d tmp
tmp 가 디 렉 터 리 이름 인지 테스트 합 니 다.
s1 != s2 두 문자열 의 내용 에 차이 가 있 는 지 테스트 합 니 다.
-z s1 s1 문자열 의 길이 가 0 인지 테스트 합 니 다.
-n s1 s1 문자열 의 길이 가 0 이 아 닌 지 테스트 합 니 다.
a –ne b a 와 b 가 같 지 않 은 지 테스트 합 니 다.
a –gt b a 가 b 보다 큰 지 테스트 하기
a –ge b a 가 b 보다 큰 지 테스트 합 니 다.
a –lt b a 가 b 보다 작은 지 테스트 하기
a –le b a 가 b 보다 작 는 지 테스트 합 니 다.
- f name 테스트 name 이 일반 파일 인지
-L name name 이 심 볼 릭 링크 인지 테스트 하기
-r name name 파일 이 존재 하고 읽 을 수 있 는 지 테스트 합 니 다.
-w name name 파일 이 존재 하고 쓸 수 있 는 지 테스트 합 니 다.
-x name name 파일 이 존재 하고 실행 가능 한 지 테스트 합 니 다.
-s name name 파일 이 존재 하 는 지, 길이 가 0 이 아 닌 지 테스트 합 니 다.
f1 –nt f2 파일 f1 이 파일 f2 보다 업데이트 되 었 는 지 테스트 합 니 다.
f1 –ot f2 파일 f1 이 파일 f2 보다 더 오래된 지 테스트 합 니 다.
7. 셸 제어 문
1)if…then…fi
문법 구조:
if 표현 식
then 명령 표
fi
표현 식 이 사실 이 라면 명령 표 의 명령 을 실행 합 니 다.그렇지 않 으 면 if 문 구 를 종료 하고 fi 뒤의 문 구 를 실행 합 니 다.
if 와 fi 는 조건문 의 괄호 이 므 로 쌍 을 지어 사용 해 야 합 니 다.
명령 표 의 명령 은 하나 일 수도 있 고 몇 개 일 수도 있다.
2)case…esac
다 중 분기 문 case 는 다 중 조건 테스트 에 사 용 됩 니 다. 문법 은 다음 과 같 습 니 다.
case 문자열 변수 in
모드 1)
명령 표 1
;;
모드 2)
명령 표 2
;;
……
모드 n)
명령 표 n
;;
esac
주의:
case 문 구 는 문자열 변수 만 감지 할 수 있 습 니 다.
각 모드 에 서 는 괄호 가 있 는 파일 이름 의 메타 문 자 를 사용 할 수 있 습 니 다.
명령 표 는 단독 2 점 줄 로 끝나 고 케이스 문 구 를 종료 합 니 다.
모드 n 은 항상 문자 * 로 모든 다른 모드 를 표시 합 니 다.
마지막 2 점 줄 은 생략 할 수 있다.
3)for…do…done
순환 횟수 가 알려 지 거나 확 정 될 때 for 순환 문 구 를 사용 하여 명령 을 여러 번 실행 합 니 다.순환 체 는 문장 괄호 do 와 done 에 의 해 한정 된다.형식:
변수 이름 in 단어 표
do
명령 표
Done
변 수 는 단어 표 의 각 단 어 를 순서대로 가 져 오고 단 어 를 가 져 올 때마다 순환 체 의 명령 을 실행 합 니 다.순환 횟수 는 단어 표 의 단어 수 에 의 해 확정 된다.명령 표 의 명령 은 하나 일 수도 있 고, 분점 이나 줄 바 꿈 문자 로 나 눌 수도 있다.
단어 표 가 명령 행 의 모든 위치 매개 변수 일 경우 for 구문 에서 'in 단어 표' 부분 을 생략 할 수 있 습 니 다.
4)while…do…done
문법 구 조 는 다음 과 같다.
while 명령 또는 표현 식
do
명령 표
done
while 문 구 는 먼저 다음 명령 이나 표현 식 의 값 을 테스트 합 니 다. 만약 사실 이 라면 순환 체 의 명령 을 한 번 실행 한 다음 에 이 명령 이나 표현 식 의 값 을 테스트 하고 순환 체 를 실행 합 니 다. 이 명령 이나 표현 식 이 가짜 일 때 까지 순환 을 종료 합 니 다.
while 문장의 종료 상 태 는 명령 표 에서 실 행 된 마지막 명령 의 출시 상태 입 니 다.
5)until…do…done
문법 구조:
until 명령 이나 표현 식
do
명령 표
done
until 순환 은 while 순환 기능 과 비슷 합 니 다. 테스트 명령 이나 표현 식 값 이 가짜 일 때 만 순환 체 의 명령 표를 실행 합 니 다. 그렇지 않 으 면 순환 을 종료 합 니 다.
6) break 와 contine
break n 은 n 층 에서 뛰 어 내 리 는 것 을 나타 낸다.
contine 문 구 는 바로 최근 순환 문장의 다음 순환 으로 갑 니 다.
continue n 은 최근 n 층 순환 문장의 다음 순환 으로 갑 니 다.
8. 셸 프로 그래 밍 디 버 깅 기법
1) 스 크 립 트 실행 결과 추적
디 버 깅 을 시작 하 는 곳 에 추가: set – x
디 버 깅 이 끝 난 곳 에 추가: set + x
#一个循环测试的demo
#!/bin/sh
count=0
sum=0
while [ $count -le 5 ]
do
if [ $count = 3 ]
then
echo "break count=$count"
break
fi
sum=`expr $sum + $count`
count=`expr $count + 1`
echo "count=$count"
sleep 1
done
echo "sum=$sum"
#!/bin/sh echo "zbh" #if [ $1 = "1"]; then cd .. && pwd #fi echo "zbh ******* end"
이 파일 을 실행 할 때 source 를 사용 해 야 합 니 다. 그렇지 않 으 면 스 크 립 트 가 하위 프로 세 스에 서 실 행 됩 니 다. 현재 콘 솔 의 경 로 는 변 하지 않 습 니 다.
교 류 를 환영 합 니 다. 다음은 제 연락처 입 니 다.
qq:920052390
시 나 닷 컴 블 로그:http://blog.sina.com.cn/u/2049150530
블 로그 원:http://www.cnblogs.com/sky-heaven/
아 는 바:http://www.zhihu.com/people/zhang-bing-hua
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.