Intereting Posts

bourne shell, если

Я смотрю включительно. Я даже проверил руководство для bash и попытался в режиме cli.

#!/bin/sh CONFIG_DIR="/var/opt/SUNWldm/" read option if [ $option -eq 9 ]; then ret=1 elif [ -e ${CONFIG_DIR}file.xml.${option} ]; then echo "TRUE" fi 

У меня есть код выше в цикле while, чтобы представить список параметров. К сожалению, у меня возникают проблемы с заявлением elfi .

From: IF for Beginners -e возвращает true, если файл существует.

Я дважды проверял синтаксис и даже запускал сценарий в режиме отладки (я положил set -x в начале этого скрипта и мог видеть, что замена в if выполняется правильно, как показано inline:

 + [ 201301271355 -eq 9 ] + [ -e /var/opt/SUNWldm/file.xml.201301271355 ] ./ldm_recover.sh: test: argument expected 

Я искал до сих пор и не нашел причины для провала, какие-то идеи, что я делаю неправильно?

Оболочка Борна – это нечто античное. Версия Solaris не имеет оператора -e для test (aka [ ) builtin, который был введен несколько позже в жизни оболочки Bourne¹ и закреплен POSIX.

В качестве обходного пути вы можете использовать -f для проверки существования обычного файла или -r если вас не интересуют нечитаемые файлы.

Лучше измените #!/bin/sh #!/usr/xpg4/bin/sh #!/bin/sh на #!/usr/xpg4/bin/sh или #!/bin/ksh #!/usr/xpg4/bin/sh #!/bin/ksh чтобы получить оболочку POSIX.

Помните, что [ $option -eq 9 ] , вероятно, не прав: -eq – это оператор численного сравнения, но $option не является действительно числовым – это дата. На 32-битной машине, когда 201301271355 интерпретируется как число, принимается по модулю 2 32 . Так получилось, что никакая дата в 21 веке не очень близка к 0 по модулю 2 32 , но полагаться на это очень хрупко. Сделайте это [ "$option" = 9 ] .

В качестве общего принципа программирования оболочки всегда ставьте двойные кавычки вокруг переменных и подстановок команд : "$foo" , "$(foo)" . Если вы этого не сделаете, оболочка разбивает результат на каждый символ пробела и обрабатывает каждое результирующее слово как шаблон подстановочного имени файла. Таким образом, незащищенный $foo безопасен, если значение foo не содержит пробелов или \[?* . Играйте в нее безопасно и всегда используйте двойные кавычки (если только вы не намерены выполнять расщепление и сопоставление шаблонов).

¹ Или это было добавление ksh, которое никогда не переносилось в Борн? Я не уверен.

Ну, это было легче, чем я:

Кажется, что оператор -e для if не определен в bourne shell (sh), но только в bourne снова shell (bash).

Я заменил if [ -e ... на if [ -r ... и он работает.