셸 체크 는 더 좋 은 스 크 립 트 를 만 드 는 데 도움 을 줍 니 다.

10444 단어
간단 한 소개
셸 체크 는 실 용적 인 셸 스 크 립 트 정적 검사 도구 입 니 다.
우선 간단 한 문법 오 류 를 미리 발견 하고 복구 하 며 시간 을 절약 하 는 데 도움 을 줄 수 있다.매번 운행 을 해 야 작은 곳 을 잘못 썼 다 는 것 을 알 게 되 어 정말 시간 을 낭비 하 는 것 이다.그 다음 에 현재 완선 되 지 않 고 건장 하지 못 한 쓰기 방법 에 대해 건 의 를 하고 미리 구 덩이 를 돌아 서 문제 가 발생 하지 않도록 도와 줄 수 있 습 니 다.
그 소개 에서 목 표 는 모든 사용 자 를 대상 으로 하 는 것 으로 초보 자 부터 고수 까지 모두 사용 할 수 있다.
  • 전형 적 인 초보 자의 문법 문 제 를 지적 하고 밝 히 면 셸 은 신비 로 운 오류 메 시 지 를 제공한다.
  • 전형 적 인 중급 의미 문 제 를 지적 하고 밝 히 면 이런 문제 들 은 셸 에 게 이상 하고 반 직각 적 인 행 위 를 초래 할 수 있다.
  • 고급 사용자 의 스 크 립 트 에서 미래 에 어떤 상황 에서 실패 할 수 있 는 함정 을 지적 했다.

  • 어떻게 사용 합 니까?
    홈 페이지 에서 사용
    아주 간단 합 니 다.https://www.shellcheck.net 스 크 립 트 를 붙 이 고 검 사 를 실행 하면 됩 니 다.
    명령 줄 에서 사용
    다운로드 후 명령 줄 에서 셸 check yourscript 를 호출 하면 됩 니 다.
    편집기 에 통합 (추천)
    셸 체크 를 일상 편집기 에 직접 통합 하 는 것 을 추천 합 니 다. 편집기 에서 셸 체크 제안 을 직접 보고 가장 빠 른 속도 로 문 제 를 발견 하고 복구 할 수 있 습 니 다.
  • Vim 은 ALE, Neomake 또는 Syntastic 을 통 해 집적
  • Emacs 는 Flycheck 또는 Flymake 를 통 해 통합
  • Sublime Sublime Linter 통과
  • Atom Linter 통과
  • VSCode 는 vscode - shellcheck 을 통과 합 니 다.
  • 설치 방법
    대부분의 발행 판 패키지 관리 에 서 는 debian 기반 기기 와 같은 셸 check 이 있 습 니 다.
    apt-get install shellcheck

    다른 시스템 의 구체 적 인 설치 방식 은 셸 체크 의 github 홈 페이지 를 찾 아 볼 수 있 습 니 다.
    물론 자체 적 으로 소스 코드 에서 설치 하 는 것 도 선택 할 수 있다.
    질문 목록
    그렇다면 셸 체크 는 구체 적 으로 어떤 문 제 를 검사 할 것 인지, 다음은 불완전한 문제 검사 목록 을 제시 합 니 다.이런 표기 법 이 잘못 되 거나 위험 하 다 는 것 을 깨 달 을 수 있 는 지 살 펴 볼 수 있다.자신 이 모 르 거나 실수 하기 쉬 운 것 이 있다 는 것 을 알 게 된다 면, 아마도 당신 도 시간 이 좀 걸 릴 것 입 니 다. 셸 체크 를 달 아야 할 것 입 니 다.
    따옴표 문제
    echo $1                           # Unquoted variables  #      
    find . -name *.ogg                # Unquoted find/grep patterns #find/grep          
    rm "~/my file.txt"                # Quoted tilde expansion #         
    v='--verbose="true"'; cmd $v      # Literal quotes in variables #         
    for f in "*.ogg"                  # Incorrectly quoted 'for' loops #    for  
    touch $@                          # Unquoted $@  # $@    
    echo 'Don't forget to restart!'   # Singlequote closed by apostrophe  #            
    echo 'Don\'t try this at home'    # Attempting to escape ' in ''  #                    
    echo 'Path is $PATH'              # Variables in single quotes #           
    trap "echo Took ${SECONDS}s" 0    # Prematurely expanded trap #      

    조건 부 판단
    Shell Check 은 대부분의 부정 확 한 조건 판단 문 구 를 식별 할 수 있 습 니 다.
    [[ n != 0 ]]                      # Constant test expressions  #        
    [[ -e *.mpg ]]                    # Existence checks of globs #             ,     
    [[ $foo==0 ]]                     # Always true due to missing spaces #      ,      
    [[ -n "$foo " ]]                  # Always true due to literals #       ,      
    [[ $foo =~ "fo+" ]]               # Quoted regex in =~   #   =~         
    [ foo =~ re ]                     # Unsupported [ ] operators #     []   
    [ $1 -eq "shellcheck" ]           # Numerical comparison of strings #         
    [ $n && $m ]                      # && in [ .. ]  #  []   &&   
    [ grep -q foo file ]              # Command without $(..)  #     $(..)
    [[ "$$file" == *.jpg ]]           # Comparisons that can't succeed #       
    (( 1 -lt 2 ))                     # Using test operators in ((..)) # ((..))     

    명령 에 대한 일반적인 오류 사용
    Shell Check 은 일부 명령 에 대한 오 류 를 식별 할 수 있 습 니 다.
    grep '*foo*' file                 # Globs in regex contexts  # grep              
    find . -exec foo {} && bar {} \;  # Prematurely terminated find -exec  #  find -exec     
    sudo echo 'Var=42' > /etc/profile # Redirecting sudo #    sudo
    time --format=%s sleep 10         # Passing time(1) flags to time builtin #  time(1)         time
    while read h; do ssh "$h" uptime  # Commands eating while loop input  #        while   ,            
    alias archive='mv $1 /backup'     # Defining aliases with arguments #        alias
    tr -cd '[a-zA-Z0-9]'              # [] around ranges in tr #  tr        []
    exec foo; echo "Done!"            # Misused 'exec'  #      exec
    find -name \*.bak -o -name \*~ -delete  # Implicit precedence in find  #  find       
    # find . -exec foo > bar \;       # Redirections in find  #find     
    f() { whoami; }; sudo f           # External use of internal functions #         

    초보 자의 흔 한 실수
    Shell Check 은 많은 초보 자의 문법 오 류 를 식별 합 니 다.
    var = 42                          # Spaces around = in assignments #       
    $foo=42                           # $ in assignments #          $
    for $var in *; do ...             # $ in for loop variables  #         $
    var$n="Hello"                     # Wrong indirect assignment #     
    echo ${var$n}                     # Wrong indirect reference #     
    var=(1, 2, 3)                     # Comma separated arrays #      
    array=( [index] = value )         # Incorrect index initialization #        
    echo $var[14]                     # Missing {} in array references #      {}
    echo "Argument 10 is $10"         # Positional parameter misreference #         
    if $(myfunction); then ..; fi     # Wrapping commands in $() #      $()
    else if othercondition; then ..   # Using 'else if'  #  else if
    f; f() { echo "hello world; }     # Using function before definition            
    [ false ]                         # 'false' being true #   false true
    if ( -f file )                    # Using (..) instead of test #  ()      

    풍격.
    Shell Check 은 스타일 개선 제안 을 할 수 있 습 니 다.
    [[ -z $(find /tmp | grep mpg) ]]  # Use grep -q instead  #    grep -q
    a >> log; b >> log; c >> log      # Use a redirection block instead #        
    echo "The time is `date`"         # Use $() instead #    $()
    cd dir; process *; cd ..;         # Use subshells instead   #    subshell
    echo $[1+2]                       # Use standard $((..)) instead of old $[]  #       $((..))
    echo $(($RANDOM % 6))             # Don't use $ on variables in $((..)) # $((..))     $
    echo "$(date)"                    # Useless use of echo #     echo
    cat file | grep foo               # Useless use of cat #    cat

    데이터 와 맞 춤 법 오류
    Shell Check 은 데이터 와 맞 춤 법 오 류 를 식별 할 수 있 습 니 다.
    args="$@"                         # Assigning arrays to strings #          
    files=(foo bar); echo "$files"    # Referencing arrays as strings #           
    declare -A arr=(foo bar)          # Associative arrays without index #         
    printf "%s
    " "Arguments: $@." # Concatenating strings and arrays # [[ $# > 2 ]] # Comparing numbers as strings # var=World; echo "Hello " var # Unused lowercase variables # echo "Hello $name" # Unassigned lowercase variables # cmd | read bar; echo $bar # Assignments in subshells # subshells cat foo | cp bar # Piping to commands that don't read # printf '%s: %s
    ' foo # Mismatches in printf argument count # pirintf

    노 봉 성
    Shell Check 은 스 크 립 트 의 노 스틱 성 을 향상 시 키 는 제안 을 할 수 있 습 니 다.
    rm -rf "$STEAMROOT/"*            # Catastrophic rm #           rm
    touch ./-l; ls *                 # Globs that could become options #              
    find . -exec sh -c 'a && b {}' \; # Find -exec shell injection # Find -exec shell  
    printf "Hello $name"             # Variables in printf format #  printf           
    for f in $(ls *.txt); do         # Iterating over ls output #  ls        
    export MYVAR=$(cmd)              # Masked exit codes #       
    case $version in 2.*) :;; 2.6.*) # Shadowed case branches #    case  

    이식 성
    Shell Check 은 shebang 이 지원 하지 않 는 기능 을 사용 했다 고 경고 합 니 다..예 를 들 어 shebang 을 #!/bin/sh 로 설정 하면 Shell Check 은 유사 한 checkbashisms 이식 가능 한 문제 에 대해 경 고 를 보 냅 니 다.
    echo {1..$n}                     # Works in ksh, but not bash/dash/sh    #  ksh    ,  bash/dash/sh     
    echo {1..10}                     # Works in ksh and bash, but not dash/sh #  ksh    ,  bash/dash/sh     
    echo -n 42                       # Works in ksh, bash and dash, undefined in sh #  ksh/bash/dash    ,  sh     
    trap 'exit 42' sigint            # Unportable signal spec #             
    cmd &> file                      # Unportable redirection operator #              
    read foo < /dev/tcp/host/22      # Unportable intercepted files  #              
    foo-bar() { ..; }                # Undefined/unsupported function name #    /       
    [ $UID = 0 ]                     # Variable undefined in dash/sh # dash/sh        
    local var=value                  # local is undefined in sh # sh     local
    time sleep 1 | sleep 5           # Undefined uses of 'time' #    time      

    기타 잡다 한 문제
    Shell Check 은 다른 문 제 를 식별 할 수 있 습 니 다.
    PS1='\e[0;32m\$\e[0m '            # PS1 colors not in \[..\]  # PS1      \[..\]  
    PATH="$PATH:~/bin"                # Literal tilde in $PATH # $PATH     
    rm “file”                         # Unicode quotes #Unicode   
    echo "Hello world"                # Carriage return / DOS line endings #     DOS    /
    echo hello \                      # Trailing spaces after \   # \       
    var=42 echo $var                  # Expansion of inlined environment #         
    #!/bin/bash -x -e                 # Common shebang errors # shebang      
    echo $((n/180*100))               # Unnecessary loss of precision #         
    ls *[:digit:].txt                 # Bad character class globs #       
    sed 's/foo/bar/' file > file      # Redirecting to input #       
    while getopts "a" f; do case $f in "b") # Unhandled getopts flags #     getopts  

    총결산
    이상 은 셸 check 의 소개 입 니 다. 주로 github 의 readme 에서 왔 고 소스 코드 는 github 에 있 습 니 다.https://github.comf/koalaman/shellcheck
    간단 하고 실 용적 이 며 설정 만 잘 하면 지속 적 으로 도움 을 줄 수 있 습 니 다.그리고 이 는 건의 적 인 것 으로 실제 상황 에 따라 채택 여 부 를 스스로 결정 할 수 있다.즉, 버 리 는 임시 스 크 립 트 를 사용 하 더 라 도 호환성 등 은 너무 care 할 필요 가 없다.장기 적 으로 사용 하 는 것 은 그래도 보완 하 는 것 이 비교적 타당 하 다.
    본문 주소https://www.cnblogs.com/zqb-all/p/10054594.html

    좋은 웹페이지 즐겨찾기