У меня есть if
в моем скрипте bash, который должен проверить, существует ли ЛИБО из 2 файлов, если они не существуют, он должен совпадать.
Код у меня есть:
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
echo "match"
fi
Но это, похоже, не работает по какой-то причине.
Я на 110% уверен, что эти 2 файла не существуют. Я не получаю никаких ошибок, он просто не входит if
.
Я новичок в сценарии Bash, поэтому я не уверен, что может быть не так.
bash
shell-script
Peppercat101
источник
источник
[[ ! -f /etc/.../... ]]; echo $?
для каждого.[[ -f xxx ]]
возвращает true, если xxx существует и является обычным файлом (или символической ссылкой на обычный файл). Он вернет false, если он не существует, или если он не может сказать, существует ли он или нет, или если он существует, но не является обычным файлом (каталог, канал, устройство, сокет ...) или если это символическая ссылка к файлу, который не существует, или он не может определить, существует он или нет, или не является обычным файлом ...[[ -e $file ]] || [[ -L $file ]]
ближе к тесту на существование.ls -d -- "$file" > /dev/null 2>&1
еще ближе. И, как правило, этот вид испытаний приводит к условиям гонки. Может быть, есть другой способ.Ответы:
Если вы хотите , либо , то вы хотите
OR
, а неAND
.match
если оба не существуют.Но вы сказали:
Так что ваше утверждение противоречит само себе. По крайней мере, один из этих файлов должен существовать, если вы запускаете этот код.
Если вы хотите увидеть, как
if
оценивает ваше утверждение, запустите его с-x
.Тогда ты увидишь казнь.
источник
Разве это не должно быть так? А это файл или Б это файл, тогда блабла.
источник
Это также может работать на то, что вы пытаетесь сделать. Одиночные скобки обычно не используются сегодня с bash, но это все еще вариант. Использование '-o' фактически является операцией "ИЛИ", а "!" отрицает условие.
источник
[
вbash
. Кроме того, я не вижу, как это отвечает на вопрос.[ ! -f ${var} -a ! -f {var}.class ] && echo "match"
должен быть. Задание было: если они (оба) не существуют, это должно бытьecho match
.Ваш код удовлетворяет вашим требованиям: он будет печататься
match
при условии, что не может найти ни один файл.Поэтому причина
match
не печатается в другом месте. Вы должны подтвердить, что блок кода достигнут, что вы можете сделать, окружив его парой отладочных сообщений. Например, вот так:Обычно я предпочитаю, чтобы сообщения отладки отправлялись в stderr, чтобы не прерывать поток данных в stdout , но я избегал этого здесь, потому что вы сказали, что вы новичок. Вот один пример, показывающий, как вы можете написать в stdout :
источник