在bash命令中使用变量并在变量中收集输出不起作用

时间:2016-10-14 07:25:57

标签: linux bash

我有以下命令,如果使用硬编码IP解雇,则可以正常工作 -

ad_request_output="$(/usr/local/nagios/libexec/check_http -w 0.18 -c 0.25 -H <Some private IP> -u 'http://<Some private IP>/fam/postGetAd.php?site_id=76986&partner_id=27de34b6f8b03d81&banner_id=183517&timeout=5000&version=1.5.1&language=jsp&format=wap&phone_headers=REMOTE_ADDR=>166.137.8.134||REMOTE_HOST=>http://localhost||HTTP_USER_AGENT=>Mozilla/5.0')"

echo $ad_request_output给出了预期的输出 -

HTTP OK: HTTP/1.1 200 OK - 217 bytes in 0.055 second response time |time=0.054961s;0.180000;0.250000;0.000000 size=217B;;;0

但是,使用变量IP会产生不同的输出 -

private_ip=<Some private IP>
ad_request_output=$(/usr/local/nagios/libexec/check_http -w 0.18 -c 0.25 -H $private_ip -u 'http://$private_ip/fam/postGetAd.php?site_id=76986&partner_id=27de34b6f8b03d81&banner_id=183517&timeout=5000&version=1.5.1&language=jsp&format=wap&phone_headers=REMOTE_ADDR=>166.137.8.134||REMOTE_HOST=>http://localhost||HTTP_USER_AGENT=>Mozilla/5.0')

echo $ad_request_output给出 -

HTTP WARNING: HTTP/1.1 400 Bad Request - 311 bytes in 0.001 second response time |time=0.000703s;0.180000;0.250000;0.000000 size=311B;;;0

尝试使用这种格式放置变量${private_ip},但输出相同 -

 ad_request_output=`/usr/local/nagios/libexec/check_http -w 0.18 -c 0.25 -H ${private_ip} -u 'http://${private_ip}/fam/postGetAd.php?site_id=76986&partner_id=27de34b6f8b03d81&banner_id=183517&timeout=5000&version=1.5.1&language=jsp&format=wap&phone_headers=REMOTE_ADDR=>166.137.8.134||REMOTE_HOST=>http://localhost||HTTP_USER_AGENT=>Mozilla/5.0'`

我检查了一些相关问题Bash - Using variable inside command not working,但不知道我做错了什么。

我有一个工作代码在命令中使用变量 -

php /var/cake_1.2.0.6311-beta/beforeInstall.php ${OUTPUT}

但是,当需要在变量中收集输出时,不知道该怎么做。

3 个答案:

答案 0 :(得分:1)

如果使用单引号,Page_Load()变量不会展开。你应该使用双引号:

private_ip

答案 1 :(得分:1)

bash'内的所有字符都会被保留。这意味着$<variable>未展开。见:

$ something=value
$ echo $something
value
$ echo "$something"
value
$ echo '$something'
$something

在您的具体情况下,$private_ip不会扩展为private_ip的值。 man bash的相关部分:

  

用单引号括起字符可保留字面值   引号中的每个字符。单引号可能不会发生   单引号之间,即使前面有反斜杠。

答案 2 :(得分:1)

Oliv已正确回答了您的问题。但我想补充一些帮助,以便您将来可以自己找到答案。

给出你的脚本开头(我简化了命令):

#!/bin/bash
private_ip=127.0.0.1
ad_request_output=$(check_http -H $private_ip -u 'http://$private_ip/fam/postGetAd.php')
echo $ad_request_output;

您可以使用参数-x调用bash,该参数在执行之前打印每个命令

bash -x test.sh

输出:

adiesner@local /tmp> bash -x test.sh 
+ private_ip=127.0.0.1
++ check_http -H 127.0.0.1 -u 'http://$private_ip/fam/postGetAd.php'
t.sh: Line 4: check_http: Command not found
[...]

你可以清楚地看到$ private_ip被替换了一次,但不是第二次。

另一种方法是通过放置&#34; echo&#34;简单地输出命令。在它面前。

#!/bin/bash
private_ip=127.0.0.1
ad_request_output=$(echo check_http -H $private_ip -u 'http://$private_ip/fam/postGetAd.php')
echo $ad_request_output;

输出:

adiesner@local /tmp> ./test.sh
check_http -H 127.0.0.1 -u http://$private_ip/fam/postGetAd.php

只要你知道发生了什么,就应该很容易输入正确的搜索词。