셸 체크 는 더 좋 은 스 크 립 트 를 만 드 는 데 도움 을 줍 니 다.
셸 체크 는 실 용적 인 셸 스 크 립 트 정적 검사 도구 입 니 다.
우선 간단 한 문법 오 류 를 미리 발견 하고 복구 하 며 시간 을 절약 하 는 데 도움 을 줄 수 있다.매번 운행 을 해 야 작은 곳 을 잘못 썼 다 는 것 을 알 게 되 어 정말 시간 을 낭비 하 는 것 이다.그 다음 에 현재 완선 되 지 않 고 건장 하지 못 한 쓰기 방법 에 대해 건 의 를 하고 미리 구 덩이 를 돌아 서 문제 가 발생 하지 않도록 도와 줄 수 있 습 니 다.
그 소개 에서 목 표 는 모든 사용 자 를 대상 으로 하 는 것 으로 초보 자 부터 고수 까지 모두 사용 할 수 있다.
어떻게 사용 합 니까?
홈 페이지 에서 사용
아주 간단 합 니 다.https://www.shellcheck.net 스 크 립 트 를 붙 이 고 검 사 를 실행 하면 됩 니 다.
명령 줄 에서 사용
다운로드 후 명령 줄 에서 셸 check yourscript 를 호출 하면 됩 니 다.
편집기 에 통합 (추천)
셸 체크 를 일상 편집기 에 직접 통합 하 는 것 을 추천 합 니 다. 편집기 에서 셸 체크 제안 을 직접 보고 가장 빠 른 속도 로 문 제 를 발견 하고 복구 할 수 있 습 니 다.
대부분의 발행 판 패키지 관리 에 서 는 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.