Переменные в тестах if в bash [closed]

Я хочу проверить, ~ / Файл tost1 существует с использованием переменной $ i, которая равна ~ / tost1 . Оператор If не работает с переменной. Есть ли способ исправить это?

i=~/tost1
$ echo $i
~/tost1
$ if [ -e ${i} ]; then echo "file exists"; fi

$ if [ -e ~/tost1 ]; then echo "file exists"; fi
file exists
-2
задан 6 November 2017 в 11:42

2 ответа

Это работает на меня в 16.04 LTS, когда выполнено из командной строки в окне терминала,

$ i=~/tost1
$ echo "$i"
/home/sudodus/tost1

$ touch ~/tost1
$ if [ -e ${i} ]; then echo "file exists";else echo "file does not exist";fi
file exists

Но это - хорошая идея использовать $HOME вместо тильды особенно, если Вы намереваетесь сделать сценарий оболочки с командами, которые Вы тестируете в интерактивном режиме, поэтому запустите с

$ i="$HOME"/tost1
$ touch ~/tost1
$ if [ -e "${i}" ]; then echo "file exists";else echo "file does not exist";fi
file exists

Это - хорошая привычка к переменным двойной кавычки, если Вы хотите избежать неприятных неожиданностей. (Существует несколько исключений.)

2
ответ дан 1 November 2019 в 06:37

Примечание: OP заявила в комментариях, "я использую удар временно в termux приложении. Это, кажется, ведет себя по-другому, чем 'регулярный' удар". Это объясняет необычное поведение.

Согласно bash 4.3 руководство использовало в Ubuntu 16.04:

Каждое переменное присвоение проверяется на неупомянутые префиксы тильды сразу после a: или первое =. В этих случаях также выполняется тильда expanion.

В Вашем конкретном случае тильду рассматривают как буквенный символ и Ваш [ ищет файл в каталоге, который, как буквально предполагается, называют ~. Вот почему это перестало работать.

Переменная условий применения $HOME вместо этого, т.е. $HOME/tost1.

3
ответ дан 1 November 2019 в 06:37

Другие вопросы по тегам:

Похожие вопросы: