【问题标题】:How to pass sed command with spaces in expression to Bash function through $@如何通过 $@ 将表达式中带有空格的 sed 命令传递给 Bash 函数
【发布时间】:2016-07-28 06:37:26
【问题描述】:

我需要用 bash 脚本中的文件中的另一个字符串替换具有空格的字符串,在该脚本中,所有调用都应通过将命令写入日志文件然后运行命令的函数来完成。 logrun 函数使用特殊字符$@ 来读取命令。我正在尝试使用 sed 进行替换,但是当表达式参数中包含空格的 sed 命令通过 $@ 时,我找不到转义空格的方法。

我已简化问题以测试我使用 sed 将 a c 替换为 a b c 的脚本。

test1.sh 效果很好:

#!/bin/bash

TESTFILE=/tmp/test.txt
echo "a c" > $TESTFILE
sed -i -e 's/a c/a b c/' $TESTFILE

test2.sh 失败:

#!/bin/bash

function logrun() {
    CMD=$@
    $CMD
}

TESTFILE=/tmp/test.txt
echo "a c" > $TESTFILE
logrun sed -i -e 's/a c/a b c/' $TESTFILE

结果:

sed: -e expression #1, char 3: unterminated `s' command

错误的原因是 -e 表达式中的空格。我还没有找到通过该函数调用 sed 的方法。我尝试使用双引号而不是单引号并用反斜杠等转义空格。我真的很想知道正确的方法是什么。

【问题讨论】:

  • @Barmar 您已经关闭了几个与stackoverflow.com/questions/13365553/… 重复的问题。找到一个更规范的副本会很好。这个问题有点难以解析,特别是对于那些询问$@ 的人来说,在那篇文章中根本没有提到。
  • 有一次你说过,自从被删除后,“注意:我不应该修改logrun函数。”那么修改函数可以吗?
  • @user3439894 不修改函数可以吗?我想知道这是否可能。
  • 我不相信它可以按照你的方式完成,它需要修改才能工作。我问的原因是我想投票赞成约翰·库格曼的答案,因为它确实有效,而且是一个很好的答案。就是说,如果不允许函数修改,那么与该答案一样好,如果您的问题仍然受到您之前所做但已删除的陈述的限制,则它不会回答问题。

标签: linux bash shell sed


【解决方案1】:
logrun() {
    CMD=("$@")
    "${CMD[@]}"
}

不带引号的$@ 会将所有参数组合成一个以空格分隔的字符串。 "$@" 带引号将每个参数分开并保留空格。

只写CMD="$@" 会创建一个简单的字符串变量。 CMD=("$@") 创建一个数组。

然后,要扩展数组,请使用与 PARAMS 相同的语法:"${CMD[@]}"。引号和两组大括号都是必需的。不要遗漏任何一个。

顺便说一句,如果您不需要 CMD 变量,它可能会少很多:

logrun() {
    "$@"
}

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 1970-01-01
    • 2018-06-24
    • 2018-02-13
    • 2017-06-25
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多