我需要在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的方法。我试图使用双引号而不是单引号并使用反斜杠等来转义空格。我真的很想知道正确的方法是什么。
答案 0 :(得分:4)
define(["jquery", "knockout", "pouchdb", "materialize" ], function($, ko, PouchDB) {...
在没有引号的情况下编写logrun() {
CMD=("$@")
"${CMD[@]}"
}
将所有参数组合成一个以空格分隔的字符串。带引号的$@
将每个参数分开并保留空格。
只写"$@"
会创建一个简单的字符串变量。 CMD="$@"
创建一个数组。
然后,要展开数组,请使用与CMD=("$@")
:PARAMS
相同的语法。引号和两组括号都是必需的。不要把它们中的任何一个留下来。
顺便说一句,如果你不需要"${CMD[@]}"
变量,那么它可能会更加冗长:
CMD