셸 프로 그래 밍 학습 노트 [오리지널]
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에 따라 라이센스가 부여됩니다.