Установка ShellCheck в Unix/Linux
ShellCheck — утилита для отладки ваших shell скриптов. Он позволит улучшить ваши написанные bash скрипты.
Установка ShellCheck в Debian/Ubuntu Linux
Выполняем команду:
# apt install shellcheck -y
Очень простая установка.
Установка ShellCheck в CentOS/RHEL/Fedora/Oracle Linux
Для начала, подключаем EPEL репозиторий, описание тут — включить EPEL репозиторий на CentOS
После чего, выполняем:
# yum install ShellCheck -y
PS: При использовании, Fedora — можно использовать:
# dnf install ShellCheck -y
Установка ShellCheck в Arch Linux
Выполняем команду:
# pacman -S shellcheck
Установка ShellCheck в Gentoo Linux
Выполняем команду:
# emerge --ask shellcheck
Установка ShellCheck в OpenSUSE Linux
Выполняем команду:
# zypper in ShellCheck
Установка ShellCheck в macOS Unix
Подключаем HOMEBREW, если нужно помощь, вот запить о том как можно выполнить установку brew — Установка homebrew на Mac OS X
Далее, стоит выполнить:
$ brew install shellcheck
Можно переходить к использовании.
Использование ShellCheck в Unix/Linux
Приведу наглядный пример использования данной утилиты на примере моего написанного скрипта. Для начала, я его возьму из гита:
# cd /usr/local/src && wget raw.githubusercontent.com/SebastianUA/redis/master/flush-cache.sh
И после чего, запускаем тестирование:
# shellcheck flush-cache.sh
Получаем вывод:
In flush-cache.sh line 1:
#!/usr/bin/env bash -x
^-- SC2096: On most OS, shebangs can only specify a single parameter.
In flush-cache.sh line 18:
SETCOLOR_NUMBERS="echo -en \\033[0;34m" #BLUE
^-- SC2034: SETCOLOR_NUMBERS appears unused. Verify it or export it.
In flush-cache.sh line 21:
if [ "`whoami`" = "root" ]; then
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 56:
echo" `whoami 2> /dev/null` doesn't have permissions. Please use ROOT user for it!";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 64:
echo "**************************************************************" >> $FlushCacheReport
^-- SC2129: Consider using { cmd1; cmd2; } >> file instead of individual redirects.
In flush-cache.sh line 65:
echo "HOSTNAME: `hostname`" >> $FlushCacheReport
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 78:
echo "expect has been INSTALLED on this server: `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 82:
echo "expect INSTALLED on this server: `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 86:
if [ -z "`rpm -qa | grep mailx`" ]; then
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 89:
echo "service of mail has been installed on `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 93:
echo "mailx INSTALLED on this server: `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 102:
echo "expect has been INSTALLED on this server: `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 106:
echo "expect INSTALLED on this server: `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 110:
if [ -z "`which mailx`" ]; then
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 113:
echo "service of mail has been installed on `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 117:
echo "mailx INSTALLED on this server: `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 123:
echo 'OS=' $OS 'VER=' $VER
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 130:
if [ $? -eq 0 ]; then
^-- SC2181: Check exit code directly with e.g. 'if mycmd;', not indirectly with $?.
In flush-cache.sh line 132:
echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"
^-- SC2046: Quote this to prevent word splitting.
In flush-cache.sh line 137:
echo -n "$(tput hpa $(tput cols))$(tput cub 6)[fail]"
^-- SC2046: Quote this to prevent word splitting.
In flush-cache.sh line 144:
for Roots in `echo $RootF|xargs -I{} -n1 echo {}` ; do
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 156:
for Iconfig in `ls -al /etc/nginx/conf.d/*.conf | grep "^-"| grep -vE "(default|geo|example)"|awk '{print $9}'|xargs -I{} -n1 echo {}` ; do
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2010: Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames.
In flush-cache.sh line 157:
RootF=$(cat $Iconfig 2> /dev/null| grep root|cut -d ";" -f1 | awk '{print $2}'|grep -vE "(SCRIPT_FILENAME|fastcgi_param|fastcgi_script_name|log|-f)"|uniq| grep -vE "(blog|wp)")
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
In flush-cache.sh line 158:
SITE=$(cat $Iconfig 2> /dev/null| grep "server_name"|awk '{print $2}'|cut -d ";" -f1)
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
In flush-cache.sh line 159:
echo $SITE
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 165:
for Iconfig in `ls -alR /etc/httpd/conf.d/*.conf | grep "^-"| grep -vE "(default|geo|example)"|awk '{print $9}'|xargs -I{} -n1 echo {}` ; do
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2010: Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames.
In flush-cache.sh line 166:
RootF=$(cat $Iconfig 2> /dev/null| grep DocumentRoot| cut -d '"' -f2|uniq| grep -v "blog")
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
In flush-cache.sh line 167:
SITE=$(cat $Iconfig 2> /dev/null| grep -E "ServerName"|awk '{print $2}')
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
In flush-cache.sh line 172:
echo "Please check which web-server installed on `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 179:
for Iconfig in `ls -al /etc/nginx/conf.d/*.conf | grep "^-"| grep -vE "(default|geo|example)"|awk '{print $9}'|xargs -I{} -n1 echo {}` ; do
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2010: Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames.
In flush-cache.sh line 180:
RootF=$(cat $Iconfig 2> /dev/null| grep root|cut -d ";" -f1 | awk '{print $2}'|grep -vE "(SCRIPT_FILENAME|fastcgi_param|fastcgi_script_name|log|-f)"|uniq| grep -vE "(blog|wp)")
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
In flush-cache.sh line 181:
SITE=$(cat $Iconfig 2> /dev/null| grep "server_name"|awk '{print $2}'|cut -d ";" -f1)
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
In flush-cache.sh line 182:
echo $SITE
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 189:
for Iconfig in `ls -alR /etc/apache2/sites-enabled/*.conf| awk '{print $9}'|xargs -I{} -n1 echo {}` ; do
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2012: Use find instead of ls to better handle non-alphanumeric filenames.
In flush-cache.sh line 190:
RootF=$(cat $Iconfig 2> /dev/null| grep DocumentRoot| cut -d '"' -f2|uniq| grep -v "blog")
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
In flush-cache.sh line 191:
SITE=$(cat $Iconfig 2> /dev/null| grep -E "ServerName"|awk '{print $2}')
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
In flush-cache.sh line 196:
echo "Please check which web-server2 installed on `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 209:
CacheRedisIP=$(cat `echo $LocalXML` 2> /dev/null| grep Cache_Backend_Redis -A13| grep "<server>"|uniq|cut -d ">" -f2 | cut -d "<" -f1)
^-- SC2046: Quote this to prevent word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 211:
CacheRedisIP=$(cat `echo $LocalXML` 2> /dev/null| grep Cache_Backend_Redis -A13| grep "<server>"| uniq|cut -d "[" -f3| cut -d "]" -f1)
^-- SC2046: Quote this to prevent word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 215:
CacheRedisSock=$(cat `echo $LocalXML` 2> /dev/null| grep Cache_Backend_Redis -A13| grep "<server>"|uniq| cut -d ">" -f2|cut -d "<" -f1| cut -d "." -f2)
^-- SC2046: Quote this to prevent word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 217:
CacheRedisSock=$(cat `echo $LocalXML` 2> /dev/null| grep Cache_Backend_Redis -A13| grep "<server>"| uniq| cut -d ">" -f2|cut -d "<" -f1| cut -d "." -f2)
^-- SC2046: Quote this to prevent word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 221:
CacheRedisPorts=$(cat `echo $LocalXML` 2> /dev/null| grep Cache_Backend_Redis -A13| cut -d '>' -f2| grep port | cut -d '<' -f1|uniq)
^-- SC2046: Quote this to prevent word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 223:
CacheRedisPorts=$(cat `echo $LocalXML 2> /dev/null` |grep Cache_Backend_Redis -A13 | grep port | cut -d "[" -f3| cut -d "]" -f1| grep -Ev "gzip"|uniq)
^-- SC2046: Quote this to prevent word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 232:
CacheRedisDB=$(cat `echo $LocalXML` 2> /dev/null| grep Cache_Backend_Redis -A13 | grep database | cut -d ">" -f2 |cut -d "<" -f1|uniq)
^-- SC2046: Quote this to prevent word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 237:
echo "CacheRedisIPs: `echo $CacheRedisIP 2> /dev/null`";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 241:
echo "redis-cli -s `echo $CacheRedisIP` flushall";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 242:
echo 'flushall' | redis-cli -s `echo $CacheRedisIP`;
^-- SC2046: Quote this to prevent word splitting.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 245:
for ICacheRedisIP in `echo $CacheRedisIP|xargs -I{} -n1 echo {}` ; do
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 246:
for ICacheRedisPorts in `echo $CacheRedisPorts|xargs -I{} -n1 echo {}` ; do
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 247:
echo "Cache-redis-ports: `echo $CacheRedisPorts 2> /dev/null`";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 251:
if [ -n "`whereis redis-cli| awk '{print $2}'`" ]; then
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 252:
R_flush=$(redis-cli -h `echo $ICacheRedisIP` -p `echo $ICacheRedisPorts` flushall)
^-- SC2034: R_flush appears unused. Verify it or export it.
^-- SC2046: Quote this to prevent word splitting.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2046: Quote this to prevent word splitting.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 254:
echo "redis-cli -h `echo $ICacheRedisIP` -p `echo $ICacheRedisPorts` flushall";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 260:
echo $ICacheRedisIP '+' $ICacheRedisPorts
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 272:
echo "CacheRedisDB = `echo $CacheRedisDB 2> /dev/null`"
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 275:
Server_port="SERVER::::> `echo $ICacheRedisIP` PORT::::> `echo $ICacheRedisPorts`";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 277:
echo "`echo $Server_port`";
^-- SC2005: Useless echo? Instead of 'echo $(cmd)', just use 'cmd'.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 278:
for ICacheRedisDB in `echo $CacheRedisDB|xargs -I{} -n1 echo {}` ; do
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 281:
echo "`echo $Server_port` DataBase::::> `echo $ICacheRedisDB`";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 283:
CacheRedisDBAuth=$(cat `echo $LocalXML` 2> /dev/null| grep Cache_Backend_Redis -A13 | grep password | cut -d ">" -f2 |cut -d "<" -f1|uniq)
^-- SC2046: Quote this to prevent word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 304:
for ICacheRedisDBAuth in `echo $CacheRedisDBAuth|xargs -I{} -n1 echo {}` ; do
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 340:
echo "Local Cache on server `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 344:
`rm -rf echo $Cache_Dir`
^-- SC2092: Remove backticks to avoid executing output.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 359:
MemcachedServer=$(cat `echo $LocalXML` 2> /dev/null | grep -Ev ^$| grep '<memcached>' -A7| grep -E 'host|CDATA|port' | grep -v "ersistent"| grep host| cut -d "[" -f3| cut -d "]" -f1|uniq)
^-- SC2046: Quote this to prevent word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 360:
MemcachedPort=$(cat `echo $LocalXML` 2> /dev/null | grep -Ev ^$| grep '<memcached>' -A7| grep -E 'host|CDATA|port' | grep -v "ersistent"| grep port| cut -d "[" -f3| cut -d "]" -f1|uniq)
^-- SC2046: Quote this to prevent word splitting.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 366:
echo "Memcached Server => `echo $MemcachedServer`";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 367:
echo "Memcached Port => `echo $MemcachedPort`";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 369:
`which expect | grep -E expect` <<EOF
^-- SC2092: Remove backticks to avoid executing output.
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 378:
echo "memcached has been flushed on server `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 382:
echo "Din't find memcached on server `hostname`";
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 391:
for IRootFolder in `cat $RootFolder|xargs -I{} -n1 echo {}` ; do
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
In flush-cache.sh line 393:
echo " ~~~~~~ `echo $SITE` ~~~~~~ ";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 402:
echo "Root-XML with '/' : `echo $LocalXML| grep -vE "DocumentRoot"`";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 412:
echo "Root-XML: `echo $LocalXML`";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^-- SC2086: Double quote to prevent globbing and word splitting.
In flush-cache.sh line 422:
mail -s " HOSTNAME is `hostname`" $List_of_emails < $FlushCacheReport
^-- SC2006: Use $(..) instead of legacy `..`.
In flush-cache.sh line 423:
if [ $? -eq 0 ]; then
^-- SC2181: Check exit code directly with e.g. 'if mycmd;', not indirectly with $?.
In flush-cache.sh line 425:
echo "LOG_FILE= $FlushCacheReport has been sent to `echo $List_of_emails`";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
In flush-cache.sh line 429:
echo "The email hasn't been sent to `echo $List_of_emails`";
^-- SC2006: Use $(..) instead of legacy `..`.
^-- SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
Утилита поможет отладить ваши баш-скрипты помогая советами (как видно с вывода моего скрипта).
Интеграция ShellCheck в текстовый редактор
ShellCheck позоляет произвести интеграцию с некоторыми текстовыми редакторами (vim, emacs). Он может проверять ваш код прямо в текстовом редакторе. Для этого стоит установить:
- pearofducks/ansible-vim
- neomake/neomake
Давайте установим эти плагины для vim, открываем:
# vim ~/.vimrc
Прописываем:
call plug#begin('~/.vim/autoload')
Plug 'pearofducks/ansible-vim'
Plug 'pearofducks/ansible-vim', { 'do': './UltiSnips/generate.py' }
Plug 'neomake/neomake'
call plug#end()
Чтобы установить плагины, откройте редактор вим, и в нем введите:
:PlugInstall
Теперь, открываем любой плагин и вводим:
:Neomake
Получаем подсказки.
На этом у меня все, статья «Установка ShellCheck в Unix/Linux » подошла к завершению.