2017-01-28 3 views
0

Я пытаюсь написать сценарий bash, который выполняет поиск и заменяет пользовательский ввод , сохраненный в config.sh, используя sed. Это работает; однако он работает только частично, как показано ниже.Заменить переменную в файле bash с помощью sed-output lags

config.sh

#!/bin/bash 
# 
#UserName to be deleted 
delUserName="" 
#Source 
delUserSrc=/Users/"$delUserName" 
#Destination 
delUserDest=/Users/John/BackUp/"$delUserName"/"$delUserName".zip 

main.sh

#!/bin/bash 
# 
source scripts/config.sh 

echo -e "\nEnter user you wish to delete: \c" 
read -r UserName 
sed -i '' -e "s/delUserName=.*/delUserName=$UserName/g" scripts/config.sh 
echo -e "delUserName: $delUserName" 
echo -e "delUserSrc: $delUserSrc" 
echo -e "delUserDest: $delUserDest" 

выход1:

Enter user you wish to delete: Test 
delUserName: 
delUserSrc:/Users/ 
delUserDest:/Users/John/BackUp//.zip 

выход2:

Enter user you wish to delete: Test1 
delUserName:Test 
delUserSrc:/Users/Test 
delUserDest:/Users/John/BackUp/Test/Test.zip 

output3:

Enter user you wish to delete: Test1 
delUserName:Test1 
delUserSrc:/Users/Test1 
delUserDest:/Users/John/BackUp/Test1/Test1.zip 

ожидается output1:

Enter user you wish to delete: Test 
delUserName:Test 
delUserSrc:/Users/Test 
delUserDest:/Users/John/BackUp/Test/Test.zip 

ожидается output2:

Enter user you wish to delete: Test1 
delUserName:Test1 
delUserSrc:/Users/Test1 
delUserDest:/Users/John/BackUp/Test1/Test1.zip 

Сценарий запаздывает. sed мгновенно изменил значение для $ delUserName BUT. Собственные значения для $ delUserName, $ delUserSrc и $ delUserDest только эхо во втором прогоне. Сценарии работают хорошо, когда все переменные находятся в main.sh, за исключением того, что я должен делать это таким образом. Сохраните ввод пользователя в $ UserName. Любая идея, почему значения не отображаются при запуске в первый раз? Thanks

+1

Якорь поиска 'sed -i" s/^ delUserName =. */DelUserName = $ UserName/g "scripts/config.sh', ** note: **' '^ ''. Вы только заботитесь об изменении назначения, замены будут следовать автоматически. –

+0

@ DavidC.Rankin это не сработало. – user3112318

+0

'sed -i" s/^ delUserName =. * $/DelUserName = \ "\ $ UserName \"/"config.sh' Я упускал из виду удаление' 'g'' и экранирование' '$ ''. –

ответ

1

Вот что я думаю, что происходит.

Команда sed заменяет текст в файлах. Он не изменяет значения переменных в памяти. Эти значения присваиваются при source config.sh.

Так сразу после sed линии, вы должны поставить эту строку:

source scripts/config.sh 

Это та же линия, как описано выше в сценарии. Это необходимо также для того, чтобы ваши новые значения были загружены в переменные, чтобы вы могли их отображать. Как только новые значения будут загружены в память, операторы echo смогут расширять переменные до этого нового значения.

+0

это не сработало. Даже попробовали эти: http://stackoverflow.com/questions/5171901/sed-command-find-and-replace-in-file-and-overwrite-file-doesnt-work-it-empties – user3112318

+0

Знаете ли вы, как/когда вызывается ваш скрипт 'config.sh'? – Fred

+0

@ user3112318 Вы пытались включить точку '.' для действительно поиска файла? Пожалуйста, покажите свой полный код, включая 'source config.sh', в обновлении вашего вопроса. –

 Смежные вопросы

  • Нет связанных вопросов^_^