2015-04-17 3 views
0

Мне интересно, правильно ли я сделал это. Я пытаюсь изучить BASH и действительно хочу изучить «Best Practices» в первый раз, поэтому я не принимаю sloppy/easy way.IF/THEN Best Practices

Что мне интересно, могу ли я установить инструкцию IF/THEN, как я сделал ниже? Почему или почему нет? Будет ли блок ниже обслуживаться лучше, используя вместо этого elif?

И, наконец, я надеялся, что кто-то может пролить свет на меня при использовании «$ {foo}» и «$ (bar)» ... фигурных скобок или скобок? Я (до сих пор) использовал фигурные скобки, когда я определяю переменную «foo =« bar », позже называется« $ {foo] и скобкой, когда я беру команду «foo = $ (find. - type f -name bar) «будет называться« $ foo »... или, может быть, я просто ушел и дважды делаю то же самое, я не знаю ... Мне бы хотелось услышать, ве все должны сказать: D

# Downloading the script bundle 
echo "Lets get the script bundle and get to work!" 
wget http://place.to.get/att.tar 

# Logic switch, checking if the TAR bundle exists. If it does 
# verify the MD5 Checksum (to prevent corruption). 
# If verfied, then un-tar the bundle in our working directory 
# otherwise, exit with an error code, otherwise 
if [[ -f att.tar ]] 
    then 
     echo "Okay, we have the bundle, lets verify the checksum" 
     sum=$(md5sum /root/att/att.tar | awk '{print $1}') 
      if [[ $sum -eq "xxxxINSERT-CHECKSUM-HERExxxx" ]] 
       then 
        tar -xvf att.tar 
      else 
       clear 
       echo "Couldn't verify the MD5 Checksum, something went wrong" | tee /tmp/att.$time.log 
       sleep 0.5 
       exit 1; 
      fi 
    else 
    clear 
    echo "There was a problem getting the TAR bundle, exiting now ..." | tee /tmp/att.$time.log 
    sleep 0.5 
    exit 1; 
fi 
+1

фигурные скобки предназначены для переменных расширений (необязательно во многих случаях). Круглые скобки предназначены для подстановки команд (и необязательно, если вам нужна эта функциональность). '$ foo' и' $ {foo} 'идентичны. Вам нужны только скобки, когда то, что следует за фигурными скобками, будет рассматриваться как часть имени переменной. Таким образом, '$ {foo} bar' является переменной-foo, тогда строка-строка, но' $ foobar' является переменной-foobar. –

+1

Запустите свой код через http://www.shellcheck.net/ и исправьте то, о чем он жалуется. Однако этот снипп довольно хорош на этом фронте. Я бы лично не предложил использовать другой уровень отступов для 'then' и else', чем вы используете для' if' и 'fi', который просто будет запутанным, я думаю. Лично я также использую 'if [...]; а затем вместо того, чтобы поместить его на свою линию. –

+0

не является поклонником вашего стиля отступов –

ответ

2

Общие комментарии

  • ничего плохого с вложенными «если», но ранний выход будет понятнее
  • вырезать дешевле, чем AWK, но читать дешевле все еще
  • Простые тесты строки равенства являются незначительно дешевле с «[» вместо «[[»
  • сообщений об ошибках записи в Stderr
  • Использование чтения и < <() вместо $ (| вырезать -f1 -d»«), потому что он избегает трубы и второй вилки/Exec
  • использовать функции

упрощенная версия

bail() { 
    clear 
    echo "${@}" | tee /tmp/att.${time}.log >&2 
    exit 1 
} 

# Downloading the script bundle 
echo "Lets get the script bundle and get to work!" >&2 
wget http://place.to.get/att.tar || bail "There was a problem getting the TAR bundle, exiting now ..." 

sum='' 
read sum rest < <(md5sum /root/att/att.tar) 

[ $sum == "xxxxINSERT-CHECKSUM-HERExxxx" ] || bail "Couldn't verify the MD5 Checksum, something went wrong" 

tar -xvf att.tar || bail "Extract failed" 
+0

Использование переменных для хранения * сообщений об ошибках * и * может также помочь 'xxxxINSERT-CHECKSUM-HERExxxx' *. –

+0

@RTLinuxSW Что такое «$ {@}» .... Я попытался это сделать Google, но не повезло. Кроме того, я запускал код через shellcheck.net ... отличный инструмент! Исправлено несколько незначительных ошибок, спасибо! – misteralexander

+0

«$ {@}» объясняется на странице руководства BASH, раздел «Параметры», подраздел «Специальные параметры». Важность двойных кавычек описана в этом параграфе. – RTLinuxSW