微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我已将问题简化为测试脚本,其中使用sed将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的方法.我尝试使用双引号而不是单引号,并使用反斜杠等来转义空格.我真的很想知道执行此操作的正确方法是什么.

解决方法:

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

写$@不带引号会将所有参数合并为一个以空格分隔的字符串.带引号的“ $@”使每个参数分开并保留空格.

只写CMD =“ $@”将创建一个简单的字符串变量. CMD =(“ $@”)创建一个数组.

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

顺便说一句,如果您不需要CMD变量,则它的详细程度可能会少很多:

logrun() {
    "$@"
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐