2016-04-07 136 views
3

将表达式中的空格通过表达式中的空格传递给Bash函数我需要用bash脚本中的文件中的另一个字符串替换一个空格字符串,其中所有调用都应该通过写入命令的函数完成到一个日志文件,然后运行该命令。 logrun函数使用特殊字符[email protected]来读取命令。我正在尝试使用sed进行替换,但是当表达式参数中包含空格的sed命令经过[email protected]时,我无法找到逃避空格的方法。

我已经简化,以测试在哪里用sed用于与A B C替换一个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() { 
    [email protected] 
    $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 

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

+3

@Barmar您已经关闭了几个问题:HTTP的重复://计算器。 COM /问题/ 13365553 /设置-AN-参数与 - 庆典。找到更多规范的副本是很好的。这个问题有点难以解析,特别是对于有人询问'$ @'的问题,在这篇文章中根本没有提到。 –

+0

有一点你说过了,既然删除了,“**注意:**我不应该修改logrun函数”,那么修改函数是否可以? – user3439894

+0

@ user3439894您可以在不修改该功能的情况下执行此操作吗?我想知道这是否可能。 – talamaki

回答

4
logrun() { 
    CMD=("[email protected]") 
    "${CMD[@]}" 
} 

写入[email protected]不带引号将所有参数组合到一个空格分隔的字符串中。带引号的"[email protected]"使每个参数分开并保留空白。

只写CMD="[email protected]"会创建一个简单的字符串变量。 CMD=("[email protected]")创建一个数组。

然后,要扩展阵列,请使用与您使用PARAMS"${CMD[@]}"相同的语法。引号和两套大括号都是必要的。不要把他们中的任何一个留下。

顺便说一句,如果你不需要CMD变量,它可能是少了很多详细:

logrun() { 
    "[email protected]" 
}