
У меня есть это выражение if [ ! - f "$i" -o "$i"x = "$MTR"x]
, и мне интересно, что оно делает. Я понимаю, что первая часть проверяет, i
не является ли переменная файлом, но не могу понять, что такое вторая часть после -o
(которая, как я думаю, обозначает логическое ИЛИ). Любая помощь будет очень полезна.
решение1
Правильно, -o обозначает логическое ИЛИ.
Сравнивает "$i"x = "$MTR"x
содержимое переменных с $i
и $MTR
.
Я думаю, что x
добавляется к обеим переменным, чтобы избежать проблем, если какая-либо из двух переменных не установлена или не инициализирована.
решение2
Предполагая, что утверждение
if [ ! -f "$i" -o "$i"x = "$MTR"x ]
Проверяет , соответствует -f "$i"
ли значение $i
обычному файлу (или символической ссылке на обычный файл). Затем этот тест отрицается с помощью !
. -o
Это устаревший и вышедший из употребления способ сказать «логическое ИЛИ».
Тесты "$i"x = "$MTR"x
, выполненные несколько неуклюжим способом, который мог быть необходим в очень старых реализациях оболочки sh
, проверяют, являются ли $i
и $MTR
одной и той же строкой.
В (текущей) стандартной sh
оболочке оператор будет записан следующим образом:
if [ ! -f "$i" ] || [ "$i" = "$MTR" ]
или, применив немного логики,
if [ "$i" = "$MTR" ] && [ -f "$i" ] || [ ! -f "$i" ]
Проще говоря: утверждение истинно, если $i
является той же строкой, что $MTR
и и ссылается на существующий обычный файл (или символическую ссылку на таковой), или если $i
не является именем файла.
Возможно, будет интереснее рассмотреть, что означает это утверждение.ЛОЖЬ. Это всегда ложно только если $i
и$MTR
не являются одной и той же строкой.и $i
ссылается на существующий файл.