BASH脚本中部分变量初始阶段无法echo输出的原因排查求助
解决Bash脚本变量无法正常echo输出的问题
嘿,我看了你的脚本,发现几个很容易踩的坑,这应该就是变量输出异常的原因,咱们一个个来捋:
1. Shebang行格式错误(最关键的问题)
你把#!/bin/bash和wget命令写在同一行了!Shebang必须单独占第一行,后面只能跟着解释器的路径,不然系统会把/bin/bash wget当成一个不存在的程序来执行,脚本根本没按Bash解释器跑,变量自然没法正常赋值和输出。
正确的第一行应该是:
#!/bin/bash
然后下一行再写wget命令。
2. 未检查wget下载是否成功
如果网络问题导致/tmp/crex24.txt没下载下来,后面所有基于这个文件的变量赋值都会是空值,自然echo不出来。建议给wget加个成功判断:
if ! wget -O /tmp/crex24.txt --no-check-certificate "https://api.crex24.com/CryptoExchangeService/BotPublic/ReturnTicker?request=[NamePairs=BTC_LTC,BTC_ETH,BTC_XMR]"; then echo "下载crex24数据失败" exit 1 fi
3. 变量引用未加双引号,空值会导致语法错误
比如你的while循环条件[ $count -le $number_of_pairs ],如果number_of_pairs是空值(比如文件里没找到PairId),这行就会变成[ 1 -le ],直接报错中断脚本。所有变量引用都应该用双引号括起来:
while [ "$count" -le "$number_of_pairs" ]
4. 优化变量提取的命令(避免空值)
你提取pairname的命令可以简化,而且可以先确认文件里有没有对应的内容。比如先检查grep "PairName" /tmp/crex24.txt有没有输出,如果没有,那变量肯定是空的。另外,用awk可以一次性完成提取,比多次管道更高效也更可靠:
pairname=$(awk -F: '/PairName/ {gsub(/[" ,]/,"",$2); print substr($2,1,10)}' /tmp/crex24.txt | sed -n "${count}p")
修正后的完整脚本示例
#!/bin/bash # 下载数据并检查是否成功 if ! wget -O /tmp/crex24.txt --no-check-certificate "https://api.crex24.com/CryptoExchangeService/BotPublic/ReturnTicker?request=[NamePairs=BTC_LTC,BTC_ETH,BTC_XMR]"; then echo "下载crex24数据失败" exit 1 fi echo "++++++++++++++++ CREX 24 ++++++++++++++++" # 获取交易对数量 number_of_pairs=$(grep -c "PairId" /tmp/crex24.txt) count=1 while [ "$count" -le "$number_of_pairs" ] do # 提取交易对名称 pairname=$(awk -F: '/PairName/ {gsub(/[" ,]/,"",$2); print substr($2,1,10)}' /tmp/crex24.txt | sed -n "${count}p") # 提取最高价(补全你没写完的部分,用类似的方式) highprice=$(awk -F: '/High/ {gsub(/[" ,]/,"",$2); print $2}' /tmp/crex24.txt | sed -n "${count}p") # 测试输出变量 echo "第$count个交易对:$pairname,最高价:$highprice" count=$((count + 1)) done
你可以先运行修正后的脚本,看看变量能不能正常输出。如果还是有问题,可以单独执行变量提取的命令,看看是不是API返回的格式变了,导致提取不到内容。
内容的提问来源于stack exchange,提问作者huz_akh
相关产品推荐
相关产品推荐

