【问题标题】:Shell scripting. Command substitution issue in my script外壳脚本。我的脚本中的命令替换问题
【发布时间】:2009-07-13 10:00:15
【问题描述】:

在我的 Cygwin 和我的 Linux 机器 (Debian) 上,我都遇到了同样的问题:

我正在使用某种格式的 id 编写一个 shell 脚本,我想在斜杠出现 (/) 之前添加一个反斜杠 ()。

我的 sed 脚本在我的终端上运行良好:

# export someid="314-12345/08"
# echo "${someid}" | sed 's/\//\\\//'

输出:

314-12345\/08

但如果我运行command substitution,效果就不一样了:

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'`
sed: -e expression #1, char 9: unknown option to `s'

我在这里缺少什么?

提前谢谢你。

【问题讨论】:

    标签: linux bash shell scripting cygwin


    【解决方案1】:

    没有义务使用 / 作为 sed 的分隔符。

    s/a/c/
    

    可能变成

    s#a#c#
    

    所以在你的情况下:

    someidformatted=`echo "${someid}" | sed 's#\/#\\\/#'`
    

    会做的。

    我只能猜测问题是由于缺少/转义引起的。

    【讨论】:

    • 谢谢,您的解决方案有效。在这种情况下使用 # 代替 / 非常清楚。
    【解决方案2】:

    这就是正在发生的事情。在 bash(1) 手册页中,强调我的:

    当使用旧式反引号形式的替换时,反斜杠保留其字面含义除非后面跟着 $、' 或 \。 前面没有反斜杠的第一个反引号终止命令替换。使用 $(command) 形式时,括号之间的所有字符组成命令;没有人受到特殊对待。

    因此,与普通命令相比,命令替换很可能需要更多的反斜杠。 你可以通过设置set -x来调试这个:

    # someidformatted=`echo "${someid}" | sed 's/\//\\\//'`
    ++ echo 314-12345/08
    ++ sed 's/\//\\//'
    sed: 1: "s/\//\\//": bad flag in substitute command: '/'
    + someidformatted=
    # someidformatted=$(echo "${someid}" | sed 's/\//\\\//')
    ++ echo 314-12345/08
    ++ sed 's/\//\\\//'
    + someidformatted='314-12345\/08'
    

    因此,您可以看到\\ 的出现变成了\。添加更多反斜杠可以,但我更喜欢$(command) 形式:

    # someidformatted=$(echo "${someid}" | sed 's/\//\\\//')
    

    【讨论】:

    • 感谢您的回复。 +1 对于接受一个并“设置 -x”的其他解决方案。
    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 2010-11-29
    • 2017-09-04
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多