Я пишу script, где мне нужно использовать вывод теста файла в нескольких местах, в том числе внутри оболочки. Я хотел бы присвоить существование файла переменной оболочки, например: file_exists=[ -f $myfile ]
.
Просто чтобы убедиться, что у меня есть мои базы, я начинаю с касания файла и тестирования его существования:
file='a'
touch $file
if [ -f $file ]
then
echo "1 -- '$file' exists"
fi
Вывод:
1 -- 'a' exists
Файл был создан успешно - никаких сюрпризов, но, по крайней мере, я знаю, что я не имею никаких проблем с разрешениями или что-то еще.
Далее я проверяю, чтобы я мог хранить логическое выражение в переменной:
mytest=/bin/true
if $mytest
then
echo "2 -- \$mytest is true"
fi
Вывод:
2 -- $mytest is true
Итак, у меня есть основные понятия - условные выражения должны выдавать тот же результат, что и /bin/true
или /bin/false
... но это не то, что я вижу:
mytest=[ -f $file ]
if $mytest
then
echo "3 -- \$mytest is true [expect true]"
else
echo "3 -- \$mytest is false [expect true]"
fi
Это не выполняется со следующей ошибкой:
-f: command not found
Я получаю то же сообщение об ошибке, если я использую test -f $file
, а не [ -f $file ]
.
Если я поместил пробел перед [
, ошибка исчезнет...
mytest= [ -f $file ]
if $mytest
then
echo "4 -- \$mytest is true [expect true]"
else
echo "4 -- \$mytest is false [expect true]"
fi
Выход кажется правильным:
4 -- $mytest is true [expect true]
... но если я удалю файл, я должен получить противоположный результат:
rm $file
mytest= [ -f $file ]
if $mytest
then
echo "5 -- \$mytest is true [expect false]"
else
echo "5 -- \$mytest is false [expect false]"
fi
... и я не делаю:
5 -- $mytest is true [expect false]
Чтобы быть справедливым, я ожидал, что пространство испортится с истинным значением:
mytest= /bin/false
if $mytest
then
echo "6 -- \$mytest is true [expect false]"
else
echo "6 -- \$mytest is false [expect false]"
fi
Выходы:
6 -- $mytest is true [expect false]
Итак, как я могу сохранить вывод из test
встроенного в переменную оболочки?