【问题标题】:Bash: not evaluating variable correctlyBash:没有正确评估变量
【发布时间】:2015-05-08 09:59:58
【问题描述】:

我有一个简单的 bash 函数,它包括一个循环来捕获主机名 x 次(在 $number_of_hosts 中定义):

number_of_hosts="3"

for i in $(seq 1 $number_of_hosts); do 
    read -ep "enter hostname" host$i
done

如果我单独回显每个变量,它们就会起作用。例如

echo $host1
echo $host2
echo $host3

但是,如果我尝试围绕它添加另一个 for 循环(在以后的函数中使用),我似乎无法让它工作。我正在使用

for i in $(seq 1 $number_of_hosts); do 
    echo $host$i
done

如何成功回显之前“读取”捕获的值?

提前感谢您的帮助。

【问题讨论】:

  • 你不能使用这样的变量。您是否还在 number_of_hosts 的声明中使用了 $ ?第二位也只有一个done,但我认为这是故意的:)
  • 是的,对不起,我把我的一些代码放在那里了。更新删除。你知道我怎样才能正确使用那个变量吗?有可能吗?

标签: bash loops variables


【解决方案1】:

有一些肮脏的方式可以使用“变量”,但我不推荐它们。为什么不直接使用数组?

#!/bin/bash

number_of_hosts=3
for i in $(seq 1 "$number_of_hosts"); do 
    read -ep "enter hostname" 'host[i]'
done

echo "${host[1]}"
echo "${host[2]}"
echo "${host[3]}"

如果你想避免调用seq,你也可以改变你的循环:

for (( i = 1; i <= number_of_hosts; ++i )); do
    read -ep "enter hostname" 'host[i]'
done

【讨论】:

  • 是的,效果很好,谢谢!我在下一个 for 循环中使用了变量 echo "${host[$i]}"
  • 更进一步,有没有办法从另一个 bash 文件中读取这些变量,该文件的变量定义为相同的名称......即host1="abc" host2="def"......然后将其加载显示功能for i in $(seq 1 $number_of_hosts); do echo -en "${host[$i]}" done 可以吗?我尝试在循环之前获取文件,但没有成功。
  • 我不完全确定您的意思,是有几个文件还是只有一个?似乎这正在成为一个单独的问题 - 而不是改变这个问题的范围或污染 cmets,也许值得提出一个新问题,以便您提供更多详细信息。
【解决方案2】:

我会这样做:

#!/bin/bash

 number_of_hosts="3"

 for i in $(seq 1 $number_of_hosts); do
         read -e -p "enter hostname: " host[$i]
 done

 for item in ${host[@]}; do
         echo $item
 done

重点是,host 在这种情况下是一个数组,完全符合您的需求。下一个重要的事情是变量number_of_hosts——当你在 Bash 中声明变量时,你只写它的名字。美元符号仅在您想获取其值时才写入。

【讨论】:

    猜你喜欢
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多