Назад | Перейти на главную страницу

Семантика теста условий сценария Red Hat Shell

Я использую Redhat Enterprise 5.3, и у меня есть небольшой скрипт, который читает имя каталога и сравнивает его с переменной. Кажется, что-то заставляет его думать, что я пытаюсь заставить его запустить имя каталога как команду, и он также неправильно оценивает имя каталога по строке ... (имя каталога - "ll_bkup"):

СЦЕНАРИЙ:

#!/bin/bash
# Changes backup folder to standard name after LogLogic System Stores a session number in t$
#TCJ 6/1/09

declare RESULT
cd /home/storegrid/scripts/test/backup
RESULT=$('ls')
TEST="ll_bkup"

if ["${RESULT}" = "${TEST}"]; then
        echo "it's ll_bkup"
else
        echo $RESULT
fi

exit 0

РЕЗУЛЬТАТ:

[root@NB-BACKUP-01 backup]# sh /home/storegrid/scripts/test/nb-script-changellbackup.sh
/home/storegrid/scripts/test/nb-script-changellbackup.sh: line 10: [ll_bkup: command not found
ll_bkup

$ {foo} - это синтаксис для разыменование элементов массива в bash. Другие ответы указывают на его общее использование при оценке переменных, но здесь оно вам не нужно. Вы, наверное, хотите просто сравнить

[ $RESULT = $TEST ]

Вы ищете каталог под названием ll_bkup? Ты мог бы сделать

[ -d ll_bkup ]

для "ll_bkup существует и является каталогом". Используйте -f, если это файл.

Если вы ищете, чтобы содержимое только ll_bkup, вы также можете провести тест на

[ $(ls | wc -l) == 1 ]

Посмотрите на "man test" синтаксис, который вы можете использовать.

Может быть более лаконичный способ сделать это, но изучение частей по очереди дает вам хорошее понимание частей, и вы можете продвигаться к более интересным тестам с помощью таких утилит, как найти.

Во втором примере вам нужен пробел после '['и перед']'символы.

То есть:

if [$RESULT = $TEST]; then

Должно быть:

if [ $RESULT = $TEST ]; then

Это потому что [ на самом деле команда, а не какой-то синтаксис в bash (хотя я считаю, что есть встроенный bash [ слишком!!).

Например. если вы запустите в своей оболочке следующее:

# ls -l /usr/bin/[

он должен показать исполняемый файл, например:

-rwxr-xr-x 1 root root 43648 2008-10-13 19:20 /usr/bin/[

Итак, ваш скрипт не пытается запустить ll_bkup, скорее он пытается запустить команду с именем [ll_bkup - чего, конечно, не существует.

Что ты действительно хочешь запустить [ с аргументами "$RESULT = $TEST ]"

(без кавычек, но с пробелом перед $ RESULT)

Имеет ли это смысл?

Сравнение строк с оболочкой сложно. Все хотят использовать «если» и «тест», но есть другая структура, которая действительно хорошо работает для сопоставления строк.

Структура if на самом деле просто проверяет статус выхода последнего, что выполняется после if. «[» На самом деле является программой «test», которая может сравнивать строки, но может также делать другие вещи, например проверять, является ли запись каталога ссылкой, каталогом или файлом.

Также - структура variable = $ (ls) потенциально может делать плохие вещи, если у вас есть более одной записи в этом каталоге или если у вас есть имя с пробелом в нем. Безопаснее позволить оболочке делать глобусы за вас с помощью чего-то вроде цикла for.

Сложите все вместе с:

#!/bin/sh
default_name=ll_bkup

if
  cd /home/storegrid/scripts/test/backup
then
  for result in *
  do
    case "$result"
    in
      "$default_name")
          if 
            test -d "$result"
          then
            echo "the default directory exists"
          else
            echo "the default directory exists but is not a directory!!"
            exit 33
          fi
         ;;
       *)
         if
           test -d "$result"
         then
           echo "non-standard directory $result exists"
         else
           echo "file named $result exists in directory $(pwd)"
         fi
        ;;
    esac
  done
else
  echo "directory doesn't exist or permission problem!"
  exit 40
fi
Still get the same results with that syntax:

if [$RESULT = $TEST]; then
        echo "it's ll_bkup"
else
        echo $RESULT
fi

exit 0

РЕЗУЛЬТАТ:

[root@NB-BACKUP-01 backup]# sh /home/storegrid/scripts/test/nb-script-changellbackup.sh
/home/storegrid/scripts/test/nb-script-changellbackup.sh: line 10: [ll_bkup: command not found
ll_bkup

Как говорит Джейсон, пробелы - это то, что вам нужно.

if [ $RESULT = $TEST ]; then
    ^ space here    ^ and here

{} Не должно иметь значения в вашем случае. $ {foo} - это не просто синтаксис для разыменования элементов массива в bash.

Это лучший способ доступа к переменным. Проверьте этот.