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 ... и он работает.

  • Некоторые ошибки возникли, когда я установил lucene, модуль perl!
  • Если условие не работает в скрипте над ssh
  • Как использовать отрицание команды в цикле while с grep в сценарии оболочки?
  • Модернизирован, чтобы проверить ветвь по ошибке в debian ... как я могу вернуться к стабильной?
  • Как сравнить строки в ksh
  • Множественный оператор, который включает специальные символы, используя при возникновении ошибок
  • Как я могу использовать команды bash, если тесты и найти команды вместе?
  • чтобы проверить, действительно ли ввод действителен для ввода программ C
  • Interesting Posts

    Как найти скрытый раздел USB в Linux

    less: переход к концу как можно большего количества буфера, а не фактического конца буфера

    pam_unix (sudo: auth): auth не смог идентифицировать пароль для

    Какой формат дает photorec для файлов?

    VirtualBox дает мне только 32-битный вариант для системной установки, но у меня 64-битный процессор

    Интерактивный поиск в стиле Ctrl-R в пользовательском файле

    Как изменить значения в файле XML

    Раздел Windows не появляется при установке Linux Mint

    Проблема при настройке пути по умолчанию в BASH

    Как использовать feh для открытия веб-изображения с самозаверяющим сертификатом

    Измените размер раздела btrfs внутри логического тома LVM

    Как «cat / etc / shadow» на HMC?

    Получение vim для перехода на первую строку и вход в режим вставки при написании электронной почты с помощью mutt

    Сохранение текущего стиля командной строки после использования 'su?'

    Можно ли добавить правило политики SELinux, чтобы ограничить приложение диапазоном адресов памяти?

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