代码之家  ›  专栏  ›  技术社区  ›  sourcerebels

Shell脚本。脚本中的命令替换问题

  •  3
  • sourcerebels  · 技术社区  · 15 年前

    我的Cygwin和Linux box(Debian)都遇到了相同的问题:

    我在使用某种格式ID的shell脚本中工作,我想在斜杠出现(/)之前添加一个反斜杠()。

    # 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'
    

    我错过了什么?

    先谢谢你。

    2 回复  |  直到 15 年前
        1
  •  13
  •   Grzegorz Oledzki    15 年前

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

    s/a/c/
    

    可能成为

    s#a#c#
    

    因此,在你的情况下:

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

    我会做的。

    我只能猜测这个问题是由于缺乏安全感造成的。

        2
  •  8
  •   Ville Laurikari    15 年前

    下面是发生的事情。从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/\//\\\//')