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 

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

2 Solutions collect form web for “bourne shell, если”

Оболочка Борна – это нечто античное. Версия 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 ... и он работает.

  • `test` и` [`- разные бинарные файлы, любая разница?
  • Что означает '-size +0' в команде 'test'
  • Правильное литье типов в сценарии оболочки для использования с циклом while и модулем
  • Некоторые ошибки возникли, когда я установил lucene, модуль perl!
  • Как использовать отрицание команды в цикле while с grep в сценарии оболочки?
  • Если условие не работает в скрипте над ssh
  • Использование -n и -z в тестировании встроено - Bash
  • Как сравнить строки в ksh
  • Interesting Posts

    убить / остановить все процессы Google Chrome

    Multi заявление, если условие в bash

    Что такое конфигурация iptables для моего рабочего стола?

    Есть ли способ получить контроль над терминалом с помощью ssh без экрана (дубликат)

    Возможно ли воспроизводить звук с двух серверов X в двух TTY одновременно?

    Звезда печатается для пустого каталога после запуска скрипта для отображения подпапки

    Как узнать, существует ли каталог?

    Почему мой промежуток между буквами уменьшается при отключении дисплея и входа в / dev / tty?

    Игра с ярлыками и размерами окон с потрясающим WM

    Как разместить эмпатию в панели сообщений Gnome 3?

    Как извлечь конкретный текст из файла журнала с помощью linux-терминала?

    Обрабатывать сообщения об ошибке команды сжатия в AIX

    URL-адрес Bash Shell, построенный с переменными, отсутствует после вставки позади http: //

    Связь между планировщиком IO и планировщиком процессора / процесса?

    Содержимое Rsync tar с удаленным сервером

    Linux и Unix - лучшая ОС в мире.