Проблема связана с тем, что тильда находится в двойных кавычках.
Чтобы ее расширить, вам нужно поставить тильду вне кавычек:
if [ -d ~/".git" ]; then # note tilde outside double quotes!
echo "Do stuff"
fi
Или, альтернативно, как указано в комментарии hek2mgl, используйте $HOME
вместо ~
:
if [ -d "$HOME/.git" ]
Из POSIX в Расширение Тильды :
«Тильда-префикс» состоит из некотируемого символа в начале слова, за которым следуют все символы, предшествующие первому, не указанному в слове, или все символы в слове, если их нет.
Из POSIX в Двойные кавычки :
Вложения символов в двойных кавычках ("") сохраняют буквальное значение всех символов в двойном -quotes, за исключением символов доллара, обратного кавычки и обратной косой черты, следующим образом:
Вы можете найти дополнительные объяснения в . Почему тильда (~) не расширяется внутри двойных кавычек? из Unix & amp; Linux Stack.
Согласно JLS : -
Тип условного выражения определяется следующим образом:
blockquote>
- Если второй и третьи операнды имеют один и тот же тип (который может быть нулевым типом), то это тип условного выражения.
- Если один из второго и третьего операндов имеет примитивный тип T, а тип другой - результат применения преобразования бокса (п. 5.1.7) в Т, тогда тип условного выражения равен T.
Так оно и должно работать. Тернарный оператор не означает эквивалент регулярного оператора if
. Телами if
и else
являются утверждения , а части, следующие за ?
и :
, являются выражениями , которые должны оцениваться одним и тем же типом .
Иными словами: a = b ? c : d
не должен быть эквивалентен if (b) a = c; else a = d;
. Вместо этого b ? c : d
является выражением само по себе, а присвоение его результата a
не повлияет на результат.
Проблема заключается в том, что:
Integer number = (condition) ? getNumber() : 0;
Заставляет распаковать и переустанавливать результат getNumber (). Это связано с тем, что ложная часть тройки (0) является целым числом, поэтому она пытается преобразовать результат getNumber () в int. В то время как следующее не делает:
Integer number = (condition) ? getNumber() : (Integer) 0;
Это не ошибка, просто то, как Java решила что-то делать.