将输出分配给Bash中的变量


164

我正在尝试将cURL的输出分配给这样的变量:

#!/bin/sh
$IP=`curl automation.whatismyip.com/n09230945.asp`
echo $IP
sed s/IP/$IP/ nsupdate.txt | nsupdate

但是,当我运行脚本时,会发生以下情况:

./update.sh: 3: =[my ip address]: not found

如何$IP正确输出?


可接受的答案是正确的,但是该示例与此处的内容之间还有另一个细微的区别:如果传递给echo的$ IP var没有用双引号引起来,它将仅输出捕获的curl输出的最后一行。
克里斯托弗·亨特

谢谢@ChristopherHunter,我来这里只是为了寻找。为什么为什么这样呢?
Amey

@Amey我不能确切地说出原因是什么,只是当您给它多行字符串作为参数时,这就是echo的行为。
Christopher Hunter

Answers:


287

在shell中,您不必在要分配的变量前放置$。仅在引用变量时使用$ IP。

#!/bin/bash

IP=$(curl automation.whatismyip.com/n09230945.asp)

echo "$IP"

sed "s/IP/$IP/" nsupdate.txt | nsupdate

2
有没有办法抑制输出和进度条curl?正在添加-silent叶子为$IP空...
Dror

4
@Dror,curl将其嘈杂的输出发送到stderr,因此在类似这样的脚本的情况下,进度栏应被忽略。不过,--silent还是-s可以的。如果您有麻烦,请提出问题
ghoti 2014年

使用curl -s禁用进度条和错误消息。
Searene '18年

您随时可以重定向 stderrIP=$(curl <url> 2>/dev/null)
BallpointBen

用$()语法查找时,我无法使用环境变量,例如,不是硬编码电子邮件,我想使用$ 2,$ 3作为变量。关于这些为什么不会呈现的任何想法?
伊万·伯比奇

27

与更复杂的事情相同...从实例内部获取ec2实例区域。

INSTANCE_REGION=$(curl -s 'http://169.254.169.254/latest/dynamic/instance-identity/document' | python -c "import sys, json; print json.load(sys.stdin)['region']")

echo $INSTANCE_REGION

这正是我在bash脚本中所做的事情,并且您使我免于不得不安装apt的麻烦!
Nungster

如何在Windows上完成此操作?如果我代替$os.system,INSTANCE_REGION不具备输出的值。
Heinz

如何制作多行?
Khalil Gharbaoui
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.