【问题标题】:Shell scripting extra parentheses displayed [closed]显示外壳脚本额外的括号[关闭]
【发布时间】:2013-11-05 15:57:39
【问题描述】:

我是 shell 脚本的初学者

echo $ip  "node$i" >> /etc/hosts

将上面的内容写在shell中会导致

192.168.1.2 {
192.168.1.4 node2
192.168.1.2 }

我不想要 { 和 } 。我该怎么办?

完整的程序

read total 
number=virsh list --all |  wc -l
$number=$number+1
for i in {$number $total }
do 
virt-clone --connect=qemu:///system -o vm2 -n vm$i -f /vm$i.qcow2

ip=$(arp -an |grep "virbr0" |egrep -Eo '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\. [[:digit:]]   {1,3}\.[[:digit:]]{1,3}'|tail --lines=1)
echo $ip  "node$i" >> /etc/hosts
done

我正在尝试克隆一个虚拟机并更改主机文件中的条目

【问题讨论】:

  • 请发布完整的代码 - 它可以重现行为。 $ip$i 是什么?
  • 它们只是两个变量..
  • 真的吗?我永远不会猜到...
  • 编辑您的问题,不要将更新(尤其是代码)放入 cmets。
  • 好的,我已经编辑过了。

标签: bash shell scripting nfs kvm


【解决方案1】:

你的语法是错误的。假设number=1total=3。那么

for i in {$number $total }
do 

将迭代 3 次。变量i 将连续设置为值

  • {1
  • 3
  • }

您似乎正在尝试使用大括号扩展将 i 设置为 1,然后是 2,然后是 3。您可能一直在尝试使用

for i in {$number..$total}
do

但这也不起作用,因为在bash 中,大括号扩展发生在参数扩展之前。 (请注意,这适用于zsh,因为它的评估过程更复杂。)对于由变量定义的范围,您需要使用seq 命令

for i in $(seq $number $total)
do

或 C 风格的循环

for (( i=$number; i<=$total; i++ ))
do

【讨论】:

  • 否则是一个很好的答案——但seq 是非标准的,我会回避推荐它。如果您想提出一些符合 POSIX 的建议,while [ $(( ( i += 1 ) &lt;= 10 )) -ne 0 ]; do ...
  • seq 正在运行 $total 次,而不是我想要的从 $number 到 $total
  • 我不明白; seq 3 6 应该产生3 4 5 6
【解决方案2】:

for 循环遍历所有单词,例如:

for i in {1 3 }; do echo $i; done
{1
3
}

所以它永远不会起作用。使用其他方法循环,​​例如seq 1 3.

【讨论】:

  • for i in {1..3} 会工作。但根据 OP 的代码(刚刚更新),需要类似 for i in $(seq $number $total)
  • seq $number $total 运行循环 $total 次,而不是从 $number 到 $total。我试过了
  • 当然,但我不喜欢发布完整的解决方案...
  • 我已经尝试了很多。请帮助。谢谢
  • @user2467973:我猜你想说相反的意思。另外:我们不知道您最初想要做什么(我不知道“total”是什么意思),所以我不能给您一个完整的解决方案......注意:echo $i 是一个很好的起点。
猜你喜欢
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多