Я хочу проверить, существует ли файл ~/tost1, используя переменную $ i, которая равна ~/tost1. Если оператор не работает с переменной. Есть ли способ исправить это?
i=~/tost1
$ echo $i
~/tost1
$ if [ -e ${i} ]; then echo "file exists"; fi
$ if [ -e ~/tost1 ]; then echo "file exists"; fi
file exists
Это работает для меня в 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 вместо тильды, особенно если вы намеревайтесь сделать shellscript с помощью команд, которые вы тестируете в интерактивном режиме, поэтому начните с
$ i="$HOME"/tost1
$ touch ~/tost1
$ if [ -e "${i}" ]; then echo "file exists";else echo "file does not exist";fi
file exists
. Хорошая привычка к двойным кавычкам переменных, если вы хотите избежать неприятных сюрпризов. (Есть несколько исключений.)
Это работает для меня в 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 вместо тильды, особенно если вы намеревайтесь сделать shellscript с помощью команд, которые вы тестируете в интерактивном режиме, поэтому начните с
$ i="$HOME"/tost1
$ touch ~/tost1
$ if [ -e "${i}" ]; then echo "file exists";else echo "file does not exist";fi
file exists
. Хорошая привычка к двойным кавычкам переменных, если вы хотите избежать неприятных сюрпризов. (Есть несколько исключений.)
Это работает для меня в 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 вместо тильды, особенно если вы намеревайтесь сделать shellscript с помощью команд, которые вы тестируете в интерактивном режиме, поэтому начните с
$ i="$HOME"/tost1
$ touch ~/tost1
$ if [ -e "${i}" ]; then echo "file exists";else echo "file does not exist";fi
file exists
. Хорошая привычка к двойным кавычкам переменных, если вы хотите избежать неприятных сюрпризов. (Есть несколько исключений.)
ПРИМЕЧАНИЕ: OP заявлен в комментариях «Я использую bash временно в приложении termux. Кажется, он ведет себя по-другому, чем« регулярный »bash». Это объясняет необычное поведение.
Согласно руководству bash 4.3, используемому в Ubuntu 16.04:
Каждое присваивание переменной проверяется для некотируемых тильд-префиксов, следующих сразу после a: или first =. В этих случаях также выполняется разметка тильды.В вашем конкретном случае тильда рассматривается как буквальный символ, а ваш [ ищет файл в каталоге, который буквально предполагается называть ~. Вот почему это терпит неудачу.
Вместо этого используйте переменную среды $HOME, то есть $HOME/tost1.
ПРИМЕЧАНИЕ: OP заявлен в комментариях «Я использую bash временно в приложении termux. Кажется, он ведет себя по-другому, чем« регулярный »bash». Это объясняет необычное поведение.
Согласно руководству bash 4.3, используемому в Ubuntu 16.04:
Каждое присваивание переменной проверяется для некотируемых тильд-префиксов, следующих сразу после a: или first =. В этих случаях также выполняется разметка тильды.В вашем конкретном случае тильда рассматривается как буквальный символ, а ваш [ ищет файл в каталоге, который буквально предполагается называть ~. Вот почему это терпит неудачу.
Вместо этого используйте переменную среды $HOME, то есть $HOME/tost1.
ПРИМЕЧАНИЕ: OP заявлен в комментариях «Я использую bash временно в приложении termux. Кажется, он ведет себя по-другому, чем« регулярный »bash». Это объясняет необычное поведение.
Согласно руководству bash 4.3, используемому в Ubuntu 16.04:
Каждое присваивание переменной проверяется для некотируемых тильд-префиксов, следующих сразу после a: или first =. В этих случаях также выполняется разметка тильды.В вашем конкретном случае тильда рассматривается как буквальный символ, а ваш [ ищет файл в каталоге, который буквально предполагается называть ~. Вот почему это терпит неудачу.
Вместо этого используйте переменную среды $HOME, то есть $HOME/tost1.