Сценарий Bash, похоже, игнорирует первую переменную - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь создать простой скрипт для переключения между моим сервером и основным компьютером для компиляции nginx, но каждый раз, когда я запускаю скрипт, он игнорирует первую переменную в $ nginxsrc, которая является $ code.Я убрал материал для сборки, потому что он не имеет отношения к вопросу.

#!/bin/bash
home="/home/michael"
code="/src/nginx"
NGINX="nginx-1.13.11"
nginxsrc="$code/$NGINX"
echo "$code"
echo "$NGINX"
echo "$nginxsrc"

Вот что происходит, когда он запускается:

$ sudo bash /usr/local/bin/build-nginx
/src/nginx
nginx-1.13.11
/nginx-1.13.11

Я пытался поместить их в {} какИтак: nginxsrc = "$ {code} / $ {NGINX}"

Я пробовал с и без кавычек: nginxsrc = $ code / $ NGINX

Мой сервер работает под управлением Ubuntu 16.04.4LTS 64-bit со всеми последними обновлениями.

Версия Bash - 4.3.48

Очевидно, ожидаемый результат:

/src/nginx
nginx-1.13.11
/src/nginx/nginx-1.13.11

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Это произойдет, если у вас есть возврат каретки в вашем файле - ваш файл был сохранен с окончанием строки в стиле DOS:

Отобразите такой файл:

$ cat -e cr.sh
code="/src/nginx"^M$
NGINX="nginx-1.13.11"^M$
nginxsrc="$code/$NGINX"^M$
echo "$code"^M$
echo "$NGINX"^M$
echo "$nginxsrc"^M$

и запустите егос трассировкой на

$ bash -x cr.sh
+ code=$'/src/nginx\r'
+ NGINX=$'nginx-1.13.11\r'
+ nginxsrc=$'/src/nginx\r/nginx-1.13.11\r\r'
+ echo $'/src/nginx\r\r'
/src/nginx
+ echo $'nginx-1.13.11\r\r'
nginx-1.13.11
+ echo $'/src/nginx\r/nginx-1.13.11\r\r\r'
/nginx-1.13.11

Отредактируйте ваши файлы в редакторе, где вы можете установить «unix» окончания строк, или исправить это с помощью dos2unix или
sed -i 's/\r$//'

0 голосов
/ 20 мая 2018

Не уверен, насколько это будет полезно, но на моем Ubuntu это на самом деле работает, как и ожидалось:

jhartman@wieloryb:~$ bash /tmp/xxx
/src/nginx
nginx-1.13.11
/src/nginx/nginx-1.13.11

Это звучит так невероятно, что в Bash есть какие-то ошибки вокруг переменных.

Как вы писали, размещенный вами фрагмент - всего лишь отрывок.Возможно, где-то во фрагменте, не размещенном здесь, есть операция с вашей переменной $ code.

Все, что я могу предложить, это запустить ее в режиме отладки, используя bash -x <script>, например:

jhartman@wieloryb:~$   bash -x /tmp/xxx
+ home=/home/michael
+ code=/src/nginx
+ NGINX=nginx-1.13.11
+ nginxsrc=/src/nginx/nginx-1.13.11
+ echo /src/nginx
/src/nginx
+ echo nginx-1.13.11
nginx-1.13.11
+ echo /src/nginx/nginx-1.13.11
/src/nginx/nginx-1.13.11

Этодолжен помочь вам сузить, что происходит.

Удачи и наилучшие пожелания, Jarek

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...