Bash 引用行为和 sed

krs*_*rs1 4 regex linux bash sed

我编写了一个简短的 bash 脚本,该脚本应该从字符串中删除前导制表符/空格:

#!/bin/bash
RGX='s/^[ \t]*//'
SED="sed '$RGX'"
echo "       string" | $SED
Run Code Online (Sandbox Code Playgroud)

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

sed: -e expression #1, char 1: unknown command: `''
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*son 5

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

1)除非确实需要,否则不要这样做。说真的,除非您有充分的理由首先将命令放入变量中,否则只需执行它即可,不要处理这种混乱。

eval2)除非你真的真的需要 , 否则不要使用。作为令人讨厌和晦涩的错误来源而享有盛誉。如果您足够了解它们并采取必要的预防措施来避免它们,那么它们是可以避免的,但这实际上应该是最后的手段。eval

3) 如果您确实必须在某一时刻定义一个命令并稍后使用它,请将其定义为函数或数组。以下是如何使用函数来完成此操作:

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

这是数组版本:

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

该习惯用法"${SEDCMD[@]}"允许您扩展数组,使每个元素保持一个单独的单词,而不会遇到任何问题。