Переменные в тестах «если» в bash [закрыты]

Я хочу проверить, существует ли файл ~/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
-2
задан 6 November 2017 в 22:42

6 ответов

Это работает для меня в 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

. Хорошая привычка к двойным кавычкам переменных, если вы хотите избежать неприятных сюрпризов. (Есть несколько исключений.)

2
ответ дан 22 May 2018 в 16:44
  • 1
    Sudodus. Сначала работал для меня, но только в CL, а не как сценарий оболочки. В CL результат был: «файл существует»; работает так же, как скрипт - «файл не существует». – Josef Klimuk 7 November 2017 в 09:30
  • 2
    Я использую bash временно в приложении termux. Кажется, он ведет себя иначе, чем «регулярный» баш. – Josef Klimuk 7 November 2017 в 09:41
  • 3
    Понимаю. Некоторые функции оболочки являются «более стандартными», а некоторые функции «менее стандартными». Я рад, что мы смогли узнать, почему у вас возникла эта проблема, и как ее можно решить :-) – sudodus 7 November 2017 в 10:47

Это работает для меня в 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

. Хорошая привычка к двойным кавычкам переменных, если вы хотите избежать неприятных сюрпризов. (Есть несколько исключений.)

2
ответ дан 18 July 2018 в 03:46

Это работает для меня в 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

. Хорошая привычка к двойным кавычкам переменных, если вы хотите избежать неприятных сюрпризов. (Есть несколько исключений.)

2
ответ дан 24 July 2018 в 17:55

ПРИМЕЧАНИЕ: OP заявлен в комментариях «Я использую bash временно в приложении termux. Кажется, он ведет себя по-другому, чем« регулярный »bash». Это объясняет необычное поведение.

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

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

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

Вместо этого используйте переменную среды $HOME, то есть $HOME/tost1.

3
ответ дан 22 May 2018 в 16:44
  • 1
    В качестве альтернативы используйте i=$(realpath ~/tost1) или i=$(readlink -m ~/tost1). Последний работает, даже если файл не существует. – dessert 6 November 2017 в 23:11
  • 2
    @dessert yep, ok подход, а также, или просто эхо вместо этого. – Sergiy Kolodyazhnyy 6 November 2017 в 23:13
  • 3
    Я поддержал это, а потом понял, подождите, назначение действительно работает для меня. i=~/tost1; echo "$i" возвращает /home/wja/tost1. – wjandrea 6 November 2017 в 23:35
  • 4
    @wjandrea да, ты прав. Я дважды проверил с руководством, это действительно выполнено в неуказанных назначениях, по-видимому. Таким образом, проблема связана с оболочкой OP. – Sergiy Kolodyazhnyy 6 November 2017 в 23:43

ПРИМЕЧАНИЕ: OP заявлен в комментариях «Я использую bash временно в приложении termux. Кажется, он ведет себя по-другому, чем« регулярный »bash». Это объясняет необычное поведение.

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

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

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

Вместо этого используйте переменную среды $HOME, то есть $HOME/tost1.

3
ответ дан 18 July 2018 в 03:46

ПРИМЕЧАНИЕ: OP заявлен в комментариях «Я использую bash временно в приложении termux. Кажется, он ведет себя по-другому, чем« регулярный »bash». Это объясняет необычное поведение.

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

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

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

Вместо этого используйте переменную среды $HOME, то есть $HOME/tost1.

3
ответ дан 24 July 2018 в 17:55
  • 1
    В качестве альтернативы используйте i=$(realpath ~/tost1) или i=$(readlink -m ~/tost1). Последний работает, даже если файл не существует. – dessert 6 November 2017 в 23:11
  • 2
    @dessert yep, ok подход, а также, или просто эхо вместо этого. – Sergiy Kolodyazhnyy 6 November 2017 в 23:13
  • 3
    Я поддержал это, а потом понял, подождите, назначение действительно работает для меня. i=~/tost1; echo "$i" возвращает /home/wja/tost1. – wjandrea 6 November 2017 в 23:35
  • 4
    @wjandrea да, ты прав. Я дважды проверил с руководством, это действительно выполнено в неуказанных назначениях, по-видимому. Таким образом, проблема связана с оболочкой OP. – Sergiy Kolodyazhnyy 6 November 2017 в 23:43

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

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