Shell_기초 학습

10007 단어
항목
  • 작업 중 셸 스 크 립 트 와 관련 되 어 있 습 니 다. 그 중에서 프로 세 스 의 시작 을 완성 하고 서버 에 점 을 찍 으 며 서버 에서 내용 을 되 돌려 주 는 4 가지 작업 을 해 야 합 니 다. 대체적으로 이렇게 많은 기능 입 니 다.버 전이 빨리 바 뀌 었 기 때문에 이 스 크 립 트 는 유지 하 는 사람 이 없 었 습 니 다. 차라리 제 가 하 겠 습 니 다.
  • 이전에 셸 을 접 해 본 적 이 없 는데 이번 에는 처음으로 정식 적 으로 응용 급 셸 스 크 립 트 를 쓴 셈 이다. 쓰 는 과정 에서 관련 된 셸 기초 지식 을 학습 노트 로 작성 했다.

  • 학습 노트
    기본 명령
    명령 하 다.
    용법 적 함의
    $$
    현재 프로 세 스 PID 가 져 오기
    $#
    매개 변수의 수 를 되 돌려 줍 니 다.
    $!
    마지막 으로 실행 중인 배경 프로 세 스 의 PID
    n
    첫 번 째 매개 변 수 를 n 번 째 매개 변수 값 으로 되 돌려 줍 니 다.
    $@
    모든 인자 되 돌리 기
    $?
    이전 명령 이 실 행 된 결 과 를 되 돌려 줍 니 다. 0: 실행 성공;1: 실행 실패
    |
    단일 세로 선, '|' 앞 명령 의 출력 을 '|' 뒤의 입력 으로 합 니 다.
    ||
    두 세로 로 나 누 어 진 여러 명령 은 다음 과 같은 규칙 에 따라 실행 되 며, 이전 명령 이 사실 이 라면 뒤의 명령 은 실행 되 지 않 으 며, 이전 명령 이 가짜 라면 뒤의 명령 을 계속 수행 합 니 다.
    &
    & 명령 이 성공 하 든 안 하 든 여러 명령 을 동시에 수행 합 니 다.
    &&
    & & 여러 명령 을 동시에 실행 할 수 있 습 니 다. 잘못된 명령 을 수행 할 때 뒤의 명령 을 실행 하지 않 습 니 다.만약 계속 잘못된 것 이 없다 면, 집행 이 완료 된다.
    exit
    현재 프로 세 스 를 종료 합 니 다. 명령 은 종료 상 태 를 나타 내 는 전체 수 치 를 매개 변수 로 받 아들 일 수 있 습 니 다.지정 하지 않 으 면 기본 상태 값 은 0 입 니 다.0 은 성공 을 나타 내 고 0 이 아 닌 실 패 를 나타 낸다. 예 를 들 어 echo "befor exit"exit 8 echo "after exit"echo "$?"결 과 는 befor exit 8 이다.
    -z
    if 표현 식 [- z $string] string 이 비어 있 으 면 진짜 입 니 다.
    -n
    if 표현 식 [- n $string] string 이 비어 있 지 않 으 면 0 (true) 을 되 돌려 줍 니 다.
    -s
    if 표현 식 [- s FILE] FILE 가 존재 하고 크기 가 0 이 아니라면 진짜 입 니 다.
    -a
    if 표현 식 [- a FILE] FILE 가 존재 하면 진짜 입 니 다.
    if 구문
  • 문법
  • if [ command ];then
         符合该条件执行的语句
    elif [ command ];then
         符合该条件执行的语句
    else
         符合该条件执行的语句
    fi
    
  • 설명
  • 1. [] 는 조건 부 테스트 를 나타 낸다. 여기 빈 칸 을 주의 하 는 것 이 중요 하 다. '[' 뒤에 '와'] '앞 에 빈 칸 이 있어 야 한다
  • .
  • 2. 셸 에 서 는 then 과 fi 가 분 리 된 문구 입 니 다. 같은 줄 에 입력 하려 면 분점 으로 분리 해 야 합 니 다.
  • 3. if 판단 에서 변 수 를 처리 할 때 불필요 한 오류 가 발생 하지 않도록 따옴표 가 필요 합 니 다. 따옴표 가 없 으 면 빈 칸 등 문자열 변 수 를 판단 할 때 오류 가 발생 할 수 있 습 니 다. 예 를 들 어 [n "$var"] var 가 비어 있 으 면 오류 가 발생 할 수 있 습 니 다
  • 4. 부동 소수점 값 을 지원 하지 않 는 다 고 판단
  • 5. 단독으로 만 사용 하면 > 또는
  • 6. 기본적으로 if 문 구 를 실행 하 는 명령 에 따 른 오류 정 보 는 스 크 립 트 의 출력 결과 에 나타 납 니 다
  • 7. - z 또는 n 을 사용 하여 길 이 를 검사 할 때 정의 되 지 않 은 변수 도 0
  • 입 니 다.
  • 8. 빈 변수 와 초기 화 되 지 않 은 변 수 는 셸 스 크 립 트 테스트 에 재난 적 인 영향 을 미 칠 수 있 으 므 로 변수의 내용 이 불확실 할 때 테스트 번호 전에 - n 또는 - z 테스트
  • 를 사용 합 니 다.
  • 9.? 변 수 는 이전에 명령 을 실행 한 종료 상태 (최근 에 완 료 된 프론트 프로 세 스) (종료 상 태 를 검사 할 수 있 습 니 다)
  • 를 포함 합 니 다.

    수치 판단
    [ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
    [ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
    [ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
    [ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
    [ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
    [ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=
    

    \# *,\#\# *,% *,%% * 의 의미 및 용법
    假设定义了一个变量为:
    代码如下:
    file=/dir1/dir2/dir3/my.file.txt
    可以用${ }分别替换得到不同的值:
    ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
    ${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt
    ${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
    ${file##*.}:删掉最后一个 .  及其左边的字符串:txt
    ${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3
    ${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)
    ${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
    ${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my
    记忆的方法为:
    # 是 去掉左边(键盘上#在 $ 的左边)
    % 是去掉右边(键盘上% 在$ 的右边)
    单一符号是最小匹配;两个符号是最大匹配
    ${file:0:5}:提取最左边的 5 个字节:/dir1
    ${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
    也可以对变量值里的字符串作替换:
    ${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
    ${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
    

    기호 $뒤의 괄호
  • ${a} 변수 a 의 값 은 잘못된 의 미 를 일 으 키 지 않 은 상태 에서 대괄호 를 생략 할 수 있 습 니 다.
  • $(cmd) 명령 이 바 뀌 었 습 니 다. 결 과 는 셸 명령 cmd 의 출력 입 니 다. cmd 효과 와 같 지만 일부 셸 버 전 은 tcsh 와 같은 $() 형식의 명령 교 체 를 지원 하지 않 습 니 다.
  • $(exp) 와 expr exp 효과 가 같 습 니 다. 수학 식 exp 의 수 치 를 계산 합 니 다. 그 중에서 exp 는 C 언어의 연산 규칙 에 부합 하면 됩 니 다. 심지어 세 개의 연산 자 와 논리 식 까지 계산 할 수 있 습 니 다.
  • 표준 입력, 표준 출력, 표준 오류
    /dev/null 代表空设备文件
    > 代表重定向到哪里,例如:echo "123" > /home/123.txt
    1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
    2 表示stderr标准错误
    & 表示等同于的意思,2>&1,表示2的输出重定向等同于1
    
    重定向的使用有如下规律:
    1)标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个。
    2)标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
    3)文件描述符在重定向符号左侧时直接写即可,在右侧时前面加&。
    4)文件描述符与重定向符号之间不能有空格!
    
    eg:
    command <   filename  >   filename2     把标准输入重定向到filename文件中,把标准输出重定向到filename2文件中
    command 0<  filename 1>   filename2     把标准输入重定向到filename文件中,把标准输出重定向到filename2文件中
    command >   filename 2>&1               把标准输出和标准错误一起重定向到filename文件中(覆盖)
    command >>  filename 2>&1               把标准输出和标准错误一起重定向到filename文件中(追加)
    command <   filename                    把标准输入重定向到filename文件中
    command 0<  filename                    把标准输入重定向到filename文件中
    command >   filename                    把标准输出重定向到filename文件中(覆盖)
    command 1>>  fielname                   把标准输出重定向到filename文件中(追加)
    

    소프트 연결
        ln –s 源文件 目标文件
    

    등호 와 이등 호의 차이
  • = = 변수 가 동일 한 지 판단 하 는 데 사용 할 수 있 습 니 다. = 변수 가 동일 한 지 판단 하 는 데 사용 할 수 있 는 것 외 에 할당 도 표시 할 수 있 습 니 다.
  • = 와 = = [] 에서 판단 (문자열 비교) 을 표시 할 때 등가 이다. 예 를 들 어
  • s1="foo"
    s2="foo"
    [ $1=$2 ] && echo "equal"
    [ $1==$2 ] && echo "equal"
    
  • 은 () 에서 = 할당 을 나타 낸다. = = 판단 (정수 비교) 을 나타 내 는데 이들 은 등가 가 아니다. 예 를 들 어
  • ((a=5))
    echo $a  # 此时为赋值操作
    ((a==5)) && echo "equal"    # 此时表示判断
    

    작은 따옴표 와 작은 따옴표 의 차이
    #!/bin/bash
    url="http://c.biancheng.net"
    website1='C语言中文网:${url}'
    website2="C语言中文网:${url}"
    echo $website1
    echo $website2
    运行结果:
    C语言中文网:${url}
    C语言中文网:http://c.biancheng.net
    
  • 작은 따옴표 '로 변 수 를 포위 할 때 작은 따옴표 안에 있 는 것 을 출력 합 니 다. 내용 에 변수 와 명령 이 있 더 라 도 그대로 출력 합 니 다. 이러한 방식 은 순 문자열 을 표시 하 는 상황, 즉 변수, 명령 등 을 해석 하고 싶 지 않 은 장면 을 정의 하 는 데 적합 합 니 다.
  • 두 따옴표 ""로 변 수 를 둘 러 싼 값 을 출력 할 때, 두 따옴표 의 변수 이름과 명령 을 그대로 출력 하 는 것 이 아니 라, 두 따옴표 에 있 는 변수 와 명령 을 먼저 해석 합 니 다. 이 방식 은 문자열 에 변수 와 명령 이 첨부 되 어 있 고, 이 를 분석 한 후에 지 려 는 변수 정의 에 적합 합 니 다.
  • 소괄호 와 대괄호 의 구별
    소괄호 ()
    ① 명령 그룹. 괄호 안에 있 는 명령 은 키 셸 프로그램 을 새로 엽 니 다. 괄호 안에 있 는 변 수 는 로 컬 변수 이 므 로 스 크 립 트 의 다른 부분 에 서 는 사용 할 수 없습니다. 괄호 안에 있 는 여러 명령 은 분점 으로 구분 되 어 있 습 니 다. 비고: 괄호 안에 있 는 변 수 는 하위 셸 에 있 기 때문에 스 크 립 트 의 나머지 부분 은 사용 할 수 없습니다. 부모 프로 세 스, 즉 스 크 립 트 자체 에 서 는 하위 셸 에서 읽 을 수 없습니다.프로 세 스 에서 만 든 변수, 즉 하위 셸 에서 만 든 변수 입 니 다.
    (cmd1;cmd2;cmd3)
    

    ② 명령 바 꾸 기. 명령 바 꾸 기 (cmd) 구 조 는 $(cmd) 의 cmd 를 한 번 실행 하고 출력 을 받 은 다음 이 출력 을 원래 명령 에 넣 습 니 다. 예 를 들 어:
    [root@localhost tmp]# ls
    fstab  functions  hellobash  issue  mytestdir  scripts
    [root@localhost tmp]# echo $(ls)
    fstab functions hellobash issue mytestdir scripts
    [root@localhost tmp]# echo `ls`
    fstab functions hellobash issue mytestdir scripts
    

    ③ 배열 을 초기 화 하 는 데 사 용 됩 니 다. 예 를 들 어 arr = (m n)
    대괄호 {}
    ① 확장. 대괄호 안에 있 는 파일 이름 을 확장 합 니 다. 대괄호 에 서 는 이 공백 이 인용 되 거나 전의 되 지 않 는 한 공백 이 있 을 수 없습니다. 확장 은 보통 쉼표 (,) 로 나 뉘 어 확장 합 니 다. 예 를 들 어 echo {a, b}. txt 는 간격 이 있 는 각 내용 을 모두 표시 합 니 다. echo {1.5}. txt 는 1 에서 5 중간 내용 을 자동 으로 보완 합 니 다.
    [root@localhost ~]# echo {a,b}.txt
    a.txt b.txt
    [root@localhost ~]# echo {1..5}.txt
    1.txt 2.txt 3.txt 4.txt 5.txt
    

    ② 내부 그룹. 작은 괄호 안에 있 는 명령 과 달리 큰 괄호 안에 있 는 명령 은 현재 셸 에서 실 행 됩 니 다. 하위 셸 을 다시 열지 않 습 니 다. 괄호 안에 있 는 명령 은 분점 으로 구분 되 며, 마지막 명령 은 분점 으로 구분 되 어야 합 니 다. {} 의 첫 번 째 명령 과 왼쪽 괄호 사이 에 빈 칸 이 있어 야 합 니 다.
    쌍 소괄호 ()
  • (...) 구 조 는 산술 표현 식 의 결 과 를 계산 하고 테스트 할 수 있 습 니 다. 종료 상 태 는 [...] 구조 와 정반 대 입 니 다. c 스타일 의 for, while 순환 문 구 를 사용 할 수 있 습 니 다. () 모든 변수 ($를 추가 하 든 말 든) 는 수치 입 니 다.
  • $(...) 구조의 표현 식 은 C 스타일 의 표현 식 입 니 다. 그 결 과 는 표현 식 값 입 니 다. 그 중에서 변 수 는 '$' 를 사용 하지 않 아 도 됩 니 다 (물론 입 니 다)
  • for((...;...;...))
    do
      cmd
    done
    while ((...))
    do
      cmd
    done
    

    기타 작은 지식
  • 프로 세 스 번호 가 져 오기:
  • ps|grep "${pname}" |grep -v "grep"|grep -v grep|awk '{print $1}' > "supertack.pid"
    - 如果是2个pid,则此时文件supertack.pid中会保存为:
    1234
    1235
    - 可以通过如下方式将2行内容输出到同一行,并以空格分隔开:
    fpid=$(echo $(cat ${supertack_pid}))
    echo $fpid  
    输出为:1234 1235
    然后在 kill -9 $fpid
    
  • 로 컬 계수 수 요 는 이 렇 습 니 다. 로 컬 셸 스 크 립 트 에서 첫 번 째 실행 과 20 번 째 실행 할 때 한 가지 일 을 하고 싶 습 니 다. 다음 과 같은 방법 은 대체적으로 다음 과 같 습 니 다.
  • 방법 이 시작 되면 한 번 실행
  • 방법 은 호출 될 때마다 실행 기록 을 누적 하고 파일 에 저장 합 니 다
  • 방법 은 20 번 째 실 행 될 때 저장 파일 의 기록 횟수 를 초기 화 합 니 다.
  • tick_times="a_ticktack_times.log"
    ticktimes=20
    control_tick(){
        [ -s "${tick_times}" ] && { ticktimes=$(cat ${tick_times});}
        [ -z "${ticktimes}" ] &&  { echo "1">${tick_times};ticktimes=1;}
        debug_print "control_tick ticktimes=$ticktimes"
        if [ `expr $ticktimes % 20` == 0  ];then
            echo "1">${tick_times}
            return 8;
        else
            ticktimes=$(expr $ticktimes + 1);
            echo "${ticktimes}">${tick_times}
            return 7;
        fi
    }
    work(){
       control_tick
       is_tick=$?
       [ "${is_tick}" = 7 ] && {   echo  "TICK WAIT ,is_tick=fase[$is_tick]" && return 1 ; }
      do something;
    }
    
  • 1 차원 제 이 슨 문자열 분석
  • f_jparse() {
        echo $1 | \
        sed -e 's/[{}]//g' | \
        sed -e 's/", "/","/g' | \
        sed -e 's/" ,"/","/g' | \
        sed -e 's/" , "/","/g' | \
        sed -e 's/","/'\"---RECORDSEPERATOR---\"'/g' | \
        awk -v RS='---RECORDSEPERATOR---' "\$1~/^\"$2\"/ {print}" | \
        sed -e "s/\"$2\"://"| sed 's/\"//g'|sed -e 's/\(^ *\)//' -e 's/\( *$\)//'
    }
    json={
      'type':1,
      'name':123
    }
    xurl=$(f_jparse "$json" 'type')
    echo $xurl
    输出:1
    

    현재 프로젝트 에서 이런 지식 만 사용 하고 나중에 총 결 을 만나면

    좋은 웹페이지 즐겨찾기