如何通过$ @将包含空格的sed命令传递给Bash函数

时间:2016-04-07 11:43:27

标签: linux bash shell sed

我需要在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的方法。我试图使用双引号而不是单引号并使用反斜杠等来转义空格。我真的很想知道正确的方法是什么。

1 个答案:

答案 0 :(得分:4)

define(["jquery", "knockout", "pouchdb", "materialize" ], function($, ko, PouchDB) {...

在没有引号的情况下编写logrun() { CMD=("$@") "${CMD[@]}" } 将所有参数组合成一个以空格分隔的字符串。带引号的$@将每个参数分开并保留空格。

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

然后,要展开数组,请使用与CMD=("$@")PARAMS相同的语法。引号和两组括号都是必需的。不要把它们中的任何一个留下来。

顺便说一句,如果你不需要"${CMD[@]}"变量,那么它可能会更加冗长:

CMD