Тестирование, если переменная пуста в сценарии оболочки

Существуют скалы дистрибутив Linux, который сделан для кластеризации и основан на CentOS/RHEL.

Сильная сторона скал - то, что это будет по большей части управлять и делать много minutia для Вас.

  • Это сделает автоматическую установку и переустановку, и если Ваши компьютеры могут загрузиться через PXE, начальная установка будет состоять из PXE начальная загрузка Ваших узлов. Если у Вас есть большое количество вычислять-узлов, они используют bittorrent внутренне для распределительных пакетов, который удаляет значительное узкое место для (ре), устанавливающего всю вещь.
  • Это даст Вам очень гомогенную вычислительную среду по умолчанию.
  • По умолчанию это будет настраивать и использовать NFS внутренне, и существуют опции для использования PVFS2 (который я не попробовал).
  • Что касается систем организации очередей/пакета, это должно настроить и управлять этим для Вас, по умолчанию я думаю, что это использует SGE, существует также список (их программное обеспечение, связывающее формат) для крутящего момента.
  • Это гарантирует непротиворечивость в пользователях/группах/и т.д. через Ваш кластер
  • Это изобразит использование ресурса в виде графика через ганглии

Если я должен был вскопать оборотные стороны

  • Программное обеспечение Adding/removing от вычислять-узлов включает переустановку их (хотя, это действительно гарантирует однородность).
  • Программное обеспечение Adding/removing включает любое добавление списка (их способ связать rpms/appliances) или редактировать XML-файлы. Однако это довольно хорошо документируется поэтому, если Вы готовы приложить некоторые усилия к чтению документации, необходимо быть в порядке. Плюс существует список рассылки, если Вы застреваете.
  • Это основано на CentOS/RHEL, который находится немного позади "новейшего"
  • Это (главным образом) вынудит Вас сделать вещи "их путь", незначительные изменения, Вам могло бы сойти с рук, возможно, изменение некоторых xml-файлов-конфигурации, существенные изменения, возможно, придется реализовать посредством создания, добавления или изменения списков (их коротковолновый/дополнительный формат)

27
21.02.2012, 01:22
4 ответа

Некоторые исторические оболочки реализовали очень простой синтаксический анализатор, который мог запутаться вещами как [ -n = "" ] где первый операнд к = похож на оператор и проанализировал бы это как [ -n = ] или вызовите синтаксическую ошибку. В [ "x$1" = x"" ], x префикс гарантирует это x"$1" не может возможно быть похожим на оператор, и таким образом, единственный способ, которым оболочка может проанализировать этот тест, путем обработки = как бинарный оператор.

Все современные оболочки и даже большинство более старых оболочек все еще в операции, следуют правилам POSIX, которые передают под мандат это все проверяемые выражения до 4 слов быть проанализированными правильно. Так [ -z "$1" ] надлежащий способ протестировать если $1 пусто, и [ "$x" = "$y" ] надлежащий путь состоит в том, чтобы протестировать равенство двух переменных.

Даже некоторые текущие оболочки могут запутаться с более длительными выражениями, и несколько выражений на самом деле неоднозначны, поэтому избегайте использования -a и -o операторы, чтобы создать более длинные булевы тесты и вместо этого использовать отдельные вызовы для [ и собственная оболочка && и || булевы операторы.

17
27.01.2020, 19:39
  • 1
    Это не только исторические оболочки. Некоторый ksh88 базирующимся shs на некоторых коммерческих Нельдах все еще имеют проблему. Посмотрите здесь для деталей. –  Stéphane Chazelas 27.11.2012, 23:00
  • 2
    Этот оператор является неправильным: [ -z "$1" ] надлежащий способ протестировать если $1 пусто. sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]' - оба возврата 0, но во втором случае $1 не может быть пустым, потому что это не существует. –  mikeserv 29.07.2014, 18:58

Согласно http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html, -z тест небезопасен в некоторых реализациях, по-видимому, когда "интересные" строки как "-o a=a" тестируются.

5
27.01.2020, 19:39

Вышеупомянутые тесты также вызовут ошибку, если Вы будете работать с "набором-u", или "устанавливает-o nounset"

Более стабильный способ проверить на пустую переменную состоял бы в том, чтобы использовать расширение параметра:

$ MYVAR= {MYVAR:-"плохо оценивают"}

Этот метод работает на традиционную оболочку Bourne, а также ksh и удар.

3
27.01.2020, 19:39
  • 1
    я верю этому, записан как->, $ M= {M:-"Плохо Оценивают"} –  Gyan 23.12.2016, 21:15
    function isBlank {
 valueNoSpaces=$(echo "$@" | tr -d ' ')

 if [  "$valueNoSpaces" == null ] || [ -z "$valueNoSpaces" ] 
 then
       echo true ;
 else
       echo ""  ;
 fi
}

#Test
if [ $(isBlank "      ") ] 
then
    echo "isBlank \"      \" : it's blank"
else
    echo " isBlank \"      \": it is not blank"
fi

if [ $(isBlank "abc") ] 

then
    echo "isBlank \"abc\" : it's blank"
else
    echo "isBlank \"abc\" :it is not blank"
fi

if [ $(isBlank null) ] 
then
      echo "isBlank null : it's blank"
else
    echo "isBlank null : it is not blank"
fi

if [ $(isBlank "") ] 
then
    echo "isBlank \"\" : it's blank"
else
    echo "isBlank \"\" : it is not blank"
fi

#Result
isBlank "      " : it's blank

isBlank "abc" :it is not blank

isBlank null : it's blank

isBlank "" : it's blank
0
27.01.2020, 19:39

Теги

Похожие вопросы