shell脚本,如何转义变量?
shell script, how to escape variables?
我正在编写一个 shell 脚本,我在其中输入了一个值并希望将该值用于其他一些命令。我的问题是我想转义这个值。
比如我在下面的脚本中输入http://example.com
echo "Input a value for my_value"
read my_value
echo $my_value
它将导致 http://example.com
但我希望的结果是http\:\/\/example\.com
如何实现?
我正在尝试 运行 的命令是
sed -i s/url/$my_value/g somefile.html
没有转义就变成了sed -i s/url/http://example.com/g somefile.html
,这显然是一个语法错误..
变量中不需要转义/
,可以在sed
:
中使用备用正则表达式分隔符
sed -i "s~url~$my_value~g" somefile.html
您可以使用其他字符来拆分 s
参数。我喜欢 ,
sed -i 's,url,http://example.com,g'
。如果你真的想要它,你可以在执行
之前使用 sed 替换参数中的 /
url=$(echo "http://example.com"|sed 's,/,\/,g')
sed -i 's/url/'"$url"'/g' input
要在任何非字母数字字符前添加斜杠:
$ my_value=http://example.com
$ my_value=$(sed 's/[^[:alnum:]]/\&/g' <<<"$my_value")
$ echo "$my_value"
http\:\/\/example\.com
但是,如果您想在 sed 命令中使用它,则需要加倍反斜杠
$ echo this is the url here | sed "s#url#$my_value#g"
this is the http://example.com here
$ echo this is the url here | sed "s#url#${my_value//\/\\}#g"
this is the http\:\/\/example\.com here
您遇到的问题是您只想用不同的文字字符串替换一个文字字符串,但 sed 无法对字符串进行操作。请参阅 了解 sed 解决方法,但您最好使用可以处理字符串的工具,例如awk:
awk -v old='original string' -v new='replacement string' '
s=index([=10=],old) { [=10=] = substr([=10=],1,s-1) new substr([=10=],s+length(old)) }
{ print }
' file
我正在编写一个 shell 脚本,我在其中输入了一个值并希望将该值用于其他一些命令。我的问题是我想转义这个值。
比如我在下面的脚本中输入http://example.com
echo "Input a value for my_value"
read my_value
echo $my_value
它将导致 http://example.com
但我希望的结果是http\:\/\/example\.com
如何实现?
我正在尝试 运行 的命令是
sed -i s/url/$my_value/g somefile.html
没有转义就变成了sed -i s/url/http://example.com/g somefile.html
,这显然是一个语法错误..
变量中不需要转义/
,可以在sed
:
sed -i "s~url~$my_value~g" somefile.html
您可以使用其他字符来拆分 s
参数。我喜欢 ,
sed -i 's,url,http://example.com,g'
。如果你真的想要它,你可以在执行
之前使用 sed 替换参数中的/
url=$(echo "http://example.com"|sed 's,/,\/,g')
sed -i 's/url/'"$url"'/g' input
要在任何非字母数字字符前添加斜杠:
$ my_value=http://example.com
$ my_value=$(sed 's/[^[:alnum:]]/\&/g' <<<"$my_value")
$ echo "$my_value"
http\:\/\/example\.com
但是,如果您想在 sed 命令中使用它,则需要加倍反斜杠
$ echo this is the url here | sed "s#url#$my_value#g"
this is the http://example.com here
$ echo this is the url here | sed "s#url#${my_value//\/\\}#g"
this is the http\:\/\/example\.com here
您遇到的问题是您只想用不同的文字字符串替换一个文字字符串,但 sed 无法对字符串进行操作。请参阅
awk -v old='original string' -v new='replacement string' '
s=index([=10=],old) { [=10=] = substr([=10=],1,s-1) new substr([=10=],s+length(old)) }
{ print }
' file