【问题标题】:How to pass a file name to sed|grep|awk command inside a variable assignment in unix如何在 unix 的变量赋值中将文件名传递给 sed|grep|awk 命令
【发布时间】:2019-07-17 20:16:57
【问题描述】:

我正在尝试执行以下脚本以从文件中获取当前路径字符串并将其传递给下一个命令中的查找和替换。直接在主机服务器中运行时它工作正常,但是当尝试从 jenkins 构建步骤执行时,我遇到了找不到文件的失败。

错误:sed:无法读取 test.txt:没有这样的文件或目录

预期的结果是在“currentPath”存在的地方用“newPath”更新“test.txt”文件

代码:

user="testuser"
host="remotehost"
newPath="/testpath/"
filetoUpdate="./test.txt" # this is a file 
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa ${user}@${host} "currentPath="$(sed -n '/^PATH='/p $filetoUpdate | cut -d'=' -f2)" ; echo  "currentPath was "$currentPath"" ; sed -n 's|$currentPath|$newPath|g' $filetoUpdate"

【问题讨论】:

  • "文件中的当前路径字符串" 那是什么?也许一个例子会有所帮助?您是否正在尝试重新实现 basenamedirname
  • filetoUpdate 的变量替换在本地主机上完成。所以它在本地而不是在远程主机上查找 ./test.txt。
  • @YuriGinsburg - 好的,关于如何让它在远程服务器上查找文件有什么建议吗?我可以在远程服务器上的当前目录上执行 ls,它完美地列出了我感兴趣的文件。
  • @UlrichEckhardt - 在文件 test.txt 中,我有一行“PATH=/path/tp/data/directory/”我需要找到此路径并替换为新路径。
  • 你有一堆代码,到底哪一部分不起作用?哪个部分起作用?请提供您从代码中提取的minimal reproducible example,它可以让任何人重现您的问题。特别是,解开 Jenkins 和 SSH 之间的关联之谜! edit你的问题来澄清这些事情。

标签: shell unix jenkins sed


【解决方案1】:

其中一个问题是本地定义的变量 newPath 和 filetoUpdate 在远程主机上运行的脚本中不可用。同样在此脚本中,仅 currentPath= 将在远程主机上执行,其余命令在本地运行。

我建议将脚本保存在单独的文件中。 test.sh:

newPath="/testpath/"
filetoUpdate="./test.txt" 
currentPath=`sed -n '/^PATH=/p' $filetoUpdate | cut -d= -f2`  
echo  "currentPath was "$currentPath""  
sed -i .bak "s|$currentPath|$newPath|g" $filetoUpdate

(我添加了 -i 用于现场编辑) 并使用命令运行它

ssh remotehost < t.sh

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-16
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多