下面是一个大脚本中的shell脚本片段。它从变量持有的字符串中删除引号。我正在使用sed,但它是有效的吗?如果不是,那么什么是有效的方法?

#!/bin/sh

opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp

当前回答

在Bash中,你可以使用下面的一行代码:

[[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"

这将从存储在var中的字符串中删除周围的引号(单引号和双引号),同时保持字符串中的引号字符完整。同样,如果只有一个前引号或只有一个后引号,或者在开始/结束处有混合引号字符,这将不起任何作用。


包装在函数中:

#!/usr/bin/env bash

# Strip surrounding quotes from string [$1: variable name]
function strip_quotes() {
    local -n var="$1"
    [[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"
}

str="'hello world'"
echo "Before: ${str}"
strip_quotes str
echo "After: ${str}"

其他回答

使用tr删除“:

 echo "$opt" | tr -d '"'

注意:这并没有完全回答问题,删除了所有双引号,而不仅仅是开头和结尾。请看下面的其他答案。

还有另一种方法。如:

echo ${opt:1:-1}

在Bash中,你可以使用下面的一行代码:

[[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"

这将从存储在var中的字符串中删除周围的引号(单引号和双引号),同时保持字符串中的引号字符完整。同样,如果只有一个前引号或只有一个后引号,或者在开始/结束处有混合引号字符,这将不起任何作用。


包装在函数中:

#!/usr/bin/env bash

# Strip surrounding quotes from string [$1: variable name]
function strip_quotes() {
    local -n var="$1"
    [[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"
}

str="'hello world'"
echo "Before: ${str}"
strip_quotes str
echo "After: ${str}"

捷径——试试:

echo $opt | sed "s/\"//g"

它实际上从opt中删除了所有的“s(双引号)(除了开头和结尾之外,真的会有更多的双引号吗?所以这实际上是一样的事情,更简短;-))

Bash中最简单的解决方案:

$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc

这被称为子字符串展开(参见Gnu Bash手册并搜索${parameter:offset:length})。在这个例子中,它从s获取子字符串,从位置1开始,到最后第二个位置结束。这是因为,如果length为负值,则它将被解释为从参数末尾开始的向后运行偏移。