【问题标题】:Replace variable in bash file using sed - output lags使用 sed 替换 bash 文件中的变量 - 输出滞后
【发布时间】:2017-01-28 04:07:42
【问题描述】:

我正在尝试编写一个 bash 脚本来搜索和替换特定的 使用 sed 保存在 config.sh 中的用户输入。这确实有效;然而它 如下所示,仅部分起作用。

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

输出3:

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

预期输出1:

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

预期输出2:

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

脚本滞后。 sed 立即更改了 $delUserName 的值,但 $delUserName、$delUserSrc 和 $delUserDest 的正确值仅在第二次运行时回显。当所有变量都在 main.sh 中时,脚本运行良好,除非我必须这样做。将用户输入保存到 $UserName。知道为什么第一次运行时值不显示吗? 谢谢

【问题讨论】:

  • 锚定您的搜索 sed -i "s/^delUserName=.*/delUserName=$UserName/g" scripts/config.sh注意: '^'。您只关心更改分配,替换将自动进行。
  • @DavidC.Rankin 没用。
  • sed -i "s/^delUserName=.*$/delUserName=\"\$UserName\"/" config.sh 我忽略了删除'g' 并转义'$'

标签: linux bash shell sed


【解决方案1】:

这就是我认为正在发生的事情。

sed 命令替换文件中的文本。它不会修改内存中变量的值。这些值是在您source config.sh 时分配的。

所以在你的sed 行之后,你需要把这行:

source scripts/config.sh

它与您脚本中的上述行相同。这也是必需的,以便您新替换的值将加载到变量中,以便您可以显示它们。一旦新值加载到内存中,echo 语句将能够将变量扩展为该新值。

【讨论】:

  • 它没有用。甚至尝试过这些:stackoverflow.com/questions/5171901/…
  • 您知道如何/何时调用您的config.sh 脚​​本吗?
  • @user3112318 您是否尝试包含点 . 以真正获取文件?请在更新您的问题时显示您的完整代码,包括source config.sh..
  • 问题和我猜想的一模一样,替换后需要source你的config.sh脚本。请查看我更新的分析器。
  • 请反复阅读我的答案,直到它有意义为止。当您运行sed 命令时,您正在替换文件中的文本,这根本不会影响分配给内存中变量的所有值。您需要重新获取配置文件,以便重新分配变量,并且它们的内存值(这是执行 echo 语句时使用的值)将是您刚刚放入文件中的值.
猜你喜欢
  • 2014-09-08
  • 2011-12-02
  • 2021-11-20
  • 1970-01-01
  • 2014-06-08
  • 2015-11-10
  • 2017-12-03
  • 2012-04-23
  • 1970-01-01
相关资源
最近更新 更多