Bash: вложить переменную в проблему с переменной - PullRequest
0 голосов
/ 13 июля 2020

Я работаю над началом сценария для перехода от home/user/ к home/user/public_html/domain

Поскольку существует довольно много разных доменов, я хочу создать сценарий, в котором первый шаг приводит меня правый каталог, прежде чем продолжить с другими командами.

Пока что у меня есть

$ cat executablefile.txt

domaincom=example.com 
domain=$(echo ${domaincom/.com})
step1=$(cd public_html/$domain) 
     
echo $step1

pwd 

, и я запускаю команду sed, чтобы заменить example.com моим доменом, но я все еще получить

home/user/

в качестве вывода.

Я пробовал не использовать echo в конце и добавлять ; в конце каждой строки для разделения переменных, но я знаю Я испортил вложение переменной $domain в $step1. Я пробовал использовать {``} около $domain, но все еще не могу заставить этот скрипт повернуть так, как я хочу. Мне нужны две верхние переменные для других команд позже в сценарии, где мне нужен или не нужен .com в конце, но я пробовал его также с domain=$(echo ${domaincom/???}) и все еще не могу понять это и, похоже, не могу найди ответ.

Я хочу, чтобы $step1 отвел меня к home/user/public_html/domain

Есть предложения, как я могу исправить свой синтаксис?

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

В этой строке кода есть две проблемы:

step1=$(cd public_html/$domain) 

Во-первых, cd не производит никакого вывода (кроме случаев, когда вызывается с - в качестве аргумента, но это не так). Соответственно, значение $step1 всегда будет пустой строкой.

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

Чтобы изменить текущий каталог оболочки, которая запускает сценарий, просто используйте cd обычно:

cd public_html/$domain

Если вы необходимо получить текущий каталог после того, как вы изменили его, вы можете запустить pwd и записать его вывод:

step1=$(pwd)

Extra

domain=$(echo ${domaincom/.com})

Нет необходимо echo значение только для захвата его вывода. Вы можете просто присвоить значение:

domain=${domaincom/.com}
0 голосов
/ 13 июля 2020

Здесь есть две проблемы:

  • вы не выполняете cd, вы оцениваете строку, которая начинается с cd. Ничего не делает. Измените команду на 'cd public_html / $ domain', чтобы фактически сменить каталог.
  • другая возможная проблема заключается в том, что после того, как скрипт успешно перейдет в каталог, который вы указали (и pwd отобразит этот каталог), после его завершения выполнение, вы все еще находитесь в текущем каталоге. Поскольку сценарий запускает новую оболочку, а cd выполняется в этой оболочке. Таким образом, вам нужно будет исходный ваш скрипт (выполнить его в текущей оболочке). В этом разница между myscript и. myscript. Не забудьте сделать это.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...