【问题标题】:Assign output to variable in Bash [duplicate]将输出分配给Bash中的变量[重复]
【发布时间】:2012-02-02 23:46:02
【问题描述】:

我正在尝试将 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 我不能确切地说出原因是什么,只是当你给它一个多行字符串作为参数时,这就是 echo 的行为。

标签: bash curl


【解决方案1】:

在 shell 中,您不会在要分配的变量前面加上 $。只有在引用变量时才使用 $IP。

#!/bin/bash

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

echo "$IP"

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

【讨论】:

  • 有没有办法抑制curl的输出和进度条?添加-silent 使$IP 为空...
  • @Dror, curl 将其嘈杂的输出发送到 stderr,因此在这样的脚本的情况下应该忽略进度条。尽管如此,--silent-s 工作得很好。有问题请ask a question.
  • 使用curl -s 禁用进度条和错误消息。
  • 你可以随时重定向stderr:IP=$(curl <url> 2>/dev/null)
  • 使用 $() 语法查找我无法使用环境变量,例如而不是硬编码电子邮件,我想使用 $2, $3 作为变量。关于为什么这些不会呈现的任何想法?
【解决方案2】:

与更复杂的东西相同...从实例中获取 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-get install jq!
  • 如何在 Windows 上做到这一点?如果我用os.system 替换$,则INSTANCE_REGION 没有输出的值。
  • 如何制作多行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 2018-12-18
  • 2014-01-08
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多