Bash:在变量中使用单引号

时间:2012-04-15 20:31:35

标签: linux bash curl sed wget

我有以下脚本(从外部服务获取当前的IP):

#!/bin/bash
####################################################################
# Gets the public IP address of current server
####################################################################

cmd='curl -s'
#cmd='wget -q -O'
#cmd='lynx -dump'

ipservice=checkip.dyndns.org

pipecmd="sed -e 's/.*Current IP Address: //' -e 's/<.*\$//'"

# Run command
echo $($cmd $ipservice | $pipecmd)

但是sed命令抱怨:

sed: -e expression #1, char 1: unknown command: `''

我一直在谷歌搜索如何在变量中使用单引号但没有成功。

谢谢!

2 个答案:

答案 0 :(得分:5)

该命令分为单词sed-e's/.*CurrentIPAddress://'等,所以第一个sed程序中的命令确实以'开头,sed不是有效的cmd=(curl -s) pipecmd=(sed -e 's/.*Current IP Address: //' -e 's/<.*$//') "${cmd[@]}" "$ipservice" | "${pipecmd[@]}" 命令。使用数组并引用:

echo "$(command)"

请注意,command相当于{{1}}。通常,请确保始终引用所有变量(但有一些例外)。

答案 1 :(得分:3)

您需要使用eval来获取shell来解释变量的内容

echo $($cmd $ipservice | eval $pipecmd)

由于额外的评估,您可能需要额外的逃避,尽管在这种特殊情况下我认为它是可以的。