我有以下脚本(从外部服务获取当前的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: `''
我一直在谷歌搜索如何在变量中使用单引号但没有成功。
谢谢!
答案 0 :(得分:5)
该命令分为单词sed
,-e
,'s/.*Current
,IP
,Address:
,//'
等,所以第一个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)
由于额外的评估,您可能需要额外的逃避,尽管在这种特殊情况下我认为它是可以的。