LINUX.ORG.RU
решено ФорумAdmin

что проверяет этот if, и что делает x в сравнение переменной JAVA_HOME?

 , ,


0

1

if [ «x${JAVA}» = «x» ]; then if [ «x${JAVA_HOME}» != «x» ]; then if [ ! -d «${JAVA_HOME}» ]; then die «JAVA_HOME is not valid: ${JAVA_HOME}» fi JAVA=«${JAVA_HOME}/bin/java» else warn «JAVA_HOME not set; results may vary»



Последнее исправление: w1rox (всего исправлений: 5)

Кастует к строке же. Не всегда ифы в шелле корректно работали с пустыми строками, сейчас вроде уже можно так не делать но мало ли.

ya-betmen ★★★★★
()

Этот if проверяет, пустая ли переменная или нет.

Kron4ek ★★★★★
()

не понял к сожалению как правильно форматировать код на лоре в сообщение

ссылка на pastebin

https://pastebin.com/f7Pza9jV

w1rox
() автор топика

Подумай, что будет, если значение переменной будет начинаться со знака минус.
И будет равно, например, "-n" или "-f".
Оно может быть спутано с опцией, например с -n или -f.

bigbit ★★★★★
()
Ответ на: комментарий от bigbit

В какой системе оно может быть спутано с опцией? В современном линуксе не может:

$ /usr/bin/test -z = -z && echo yes || echo no
yes
$ /usr/bin/test -z = && echo yes || echo no
no
Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 4)

Всем спасибо!

Очень признателен за оперативную помощь!

w1rox
() автор топика
Ответ на: комментарий от Legioner

А ты не через test проверяй, а через '['
(здесь предполагается что $A и $B не заданы)

pinkbyte@mini-router ~ $ [ $A = $B ] && echo yes || echo no
yes
pinkbyte@mini-router ~ $ [ x$A = x$B ] && echo yes || echo no
yes
pinkbyte@mini-router ~ $ [ $A = x$B ] && echo yes || echo no
bash: [: =: unary operator expected
no
pinkbyte@mini-router ~ $ [ x$A = $B ] && echo yes || echo no
bash: [: x: unary operator expected
no

То есть когда оба аргумента пустые - это окей. Когда один - выдается ошибка.

В баше для этого есть свой оператор(но тогда с совместимостью с другими шеллами придется попрощаться):

[[ $A = x$B ]] && echo yes || echo no
no

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 2)

Проверяет задана ли java в переменной и если нет смотрит JAVA_HOME и если оно каталог, то ставит JAVA как JAVA_HOME/bin/java. А x тут просто любой символ. Если ставишь кавычки, то без него можно. По сути проверка на пустоту.

turtle_bazon ★★★★★
()
Ответ на: комментарий от Pinkbyte

Кавычки добавь и всё у тебя будет хорошо. Не $A а "$A"

test и [ тут не при чём.

Имитировать кавычки таким префиксом может и прикольно, но у топикстартера не это, у него с кавычками всё хорошо.

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

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 3)
Ответ на: комментарий от Legioner

PS твой вариант просто не работает, если в A пробелы. Поэтому без кавычек обойтись не получится в общем случае.

Legioner ★★★★★
()
Ответ на: комментарий от turtle_bazon

восклицательный знак-инвентирование

я полагаю скорее всего проверка что JAVA_HOME - НЕ директория тк есть восклицательный знак, верно?

anonymous
()
Ответ на: восклицательный знак-инвентирование от anonymous

проверка что JAVA_HOME - НЕ директория

Да. Если не директория, то вываливается с ошибкой там. То есть по факту проверка на то, что JAVA_HOME указывает на существующую директорию.

turtle_bazon ★★★★★
()
Ответ на: комментарий от anonymous

восклицательный знак это

Восклицательный знак это просто отрицание следующего выражения.

turtle_bazon ★★★★★
()
Ответ на: комментарий от Kroz

Потому, что в sh (не bash) по-другому работать не будет в случае если переменная пустая.

Можно подумать, что в bash одинарные квадратные скобки работают как-то иначе...

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.