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

#!/bin/sh

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

当前回答

Linux=`cat /etc/os-release | grep "ID" | head -1 | awk -F= '{ print $2 }'`

echo $Linux
Output:
"amzn"

从变量中删除双引号的最简单方法是

Linux=`echo "$Linux" | tr -d '"'` 
Linux=$(eval echo $Linux)
Linux=`echo ${Linux//\"/}`
Linux=`echo $Linux | xargs`

All提供不带双引号的输出:

echo $ Linux

amzn

其他回答

如果您试图删除引号,因为Makefile保留了它们,请尝试以下方法:

$(subst $\",,$(YOUR_VARIABLE))

基于另一个答案:https://stackoverflow.com/a/10430975/10452175

更新

仅使用bash /标准Linux命令剥离字符串中的单引号和双引号的简单而优雅的答案:

BAR=$(eval echo $BAR)从BAR中删除引用。

=============================================================

根据hueybois的答案,经过反复试验,我得出了这个函数:

function stripStartAndEndQuotes {
    cmd="temp=\${$1%\\\"}"
    eval echo $cmd
    temp="${temp#\"}"
    eval echo "$1=$temp"
}

如果你不希望输出任何东西,你可以将计算结果输出到/dev/null 2>&1。

用法:

$ BAR="FOO BAR"
$ echo BAR
"FOO BAR"
$ stripStartAndEndQuotes "BAR"
$ echo BAR
FOO BAR

我的版本

strip_quotes() {
    while [[ $# -gt 0 ]]; do
        local value=${!1}
        local len=${#value}
        [[ ${value:0:1} == \" && ${value:$len-1:1} == \" ]] && declare -g $1="${value:1:$len-2}"
        shift
    done
}

该函数接受变量名并去掉引号。它只删除一对匹配的开头和结尾引号。它不检查末尾的引号是否转义(前面有\,但\本身没有转义)。

根据我的经验,像这样的通用字符串实用函数(我有一个库)在直接操作字符串时是最有效的,不使用任何模式匹配,特别是不创建任何子shell,或调用任何外部工具,如sed、awk或grep。

var1="\"test \\ \" end \""
var2=test
var3=\"test
var4=test\"
echo before:
for i in var{1,2,3,4}; do
    echo $i="${!i}"
done
strip_quotes var{1,2,3,4}
echo
echo after:
for i in var{1,2,3,4}; do
    echo $i="${!i}"
done

还有另一种方法。如:

echo ${opt:1:-1}

Bash中最简单的解决方案:

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

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