繁体   English   中英

Bash引用行为和sed

[英]Bash quote behavior and sed

我写了一个简短的bash脚本,它应该从字符串中去掉前导标签/空格:

#!/bin/bash
RGX='s/^[ \t]*//'
SED="sed '$RGX'"
echo "       string" | $SED

它可以从命令行运行,但脚本会收到此错误:

sed: -e expression #1, char 1: unknown command: `''

我的猜测是引号有问题,但我不确定是什么。

确实如此。 尝试:

#!/bin/bash
RGX='s/^[ \t]*//'
#SED='$RGX'
echo "       string" | sed "$RGX"

这有效。

你遇到的问题是引号和空格。 双引号字符串作为单个参数传递。

set -x添加到脚本中。 您将看到单引号内的变量未展开。

将命令放入变量并将它们完整地取出是很困难的,因为引用不按预期方式工作(参见BashFAQ#050,“我试图将命令放在变量中,但复杂的情况总是失败!” )。 有几种方法可以解决这个问题:

1)除非你真的需要,否则不要这样做。 说真的,除非你有充分的理由将命令放在变量中,否则执行它并不处理这种混乱。

2)除非你真的 真的需要,否则不要使用eval eval作为令人讨厌和模糊的错误的来源享有当之无愧的声誉。 如果你足够了解它们并采取必要的预防措施来避免它们,就可以避免它们,但这应该是最后的手段。

3)如果你真的必须在一个点定义一个命令并在以后使用它,要么将它定义为函数或数组。 以下是使用函数执行此操作的方法:

RGX='s/^[ \t]*//'
SEDCMD() { sed "$RGX"; }
echo "       string" | SEDCMD

这是阵列版本:

RGX='s/^[ \t]*//'
SEDCMD=(sed "$RGX")
echo "       string" | "${SEDCMD[@]}"

成语"${SEDCMD[@]}"允许您扩展数组,将每个元素保持为单独的单词,而不会出现任何问题。

+要扩展我上面的评论:

#!/bin/bash
RGX='s/^[[:space:]]+//'
SED="sed -r '$RGX'"
eval "printf \" \tstring\n\" | $SED"

请注意,这也使得你的正则表达式是一个扩展的,没有特别的原因。 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM