Я использую 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.
Это лучший способ доступа к переменным. Проверьте этот.