下面是一个大脚本中的shell脚本片段。它从变量持有的字符串中删除引号。我正在使用sed,但它是有效的吗?如果不是,那么什么是有效的方法?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
下面是一个大脚本中的shell脚本片段。它从变量持有的字符串中删除引号。我正在使用sed,但它是有效的吗?如果不是,那么什么是有效的方法?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
当前回答
更新
仅使用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
其他回答
你只需要调用一次sed就可以做到:
$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\
在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}"
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
使用xargs有一个简单的方法:
> echo '"quoted"' | xargs
quoted
如果没有提供命令,Xargs使用echo作为默认命令,并从输入中删除引号,参见这里的例子。但是请注意,这只在字符串不包含附加引号的情况下才有效。在这种情况下,它要么失败(引号数量不均匀),要么删除所有引号。
更新
仅使用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