Bash脚本中的while循环?

10

我不习惯编写Bash脚本,在Google上也找不到解决这个脚本问题的方法:

#!/bin/bash
while read myline
do
done

echo "Hello"
while read line
do
done

exit 0
我得到的输出是:
./basic.agi: line 4: syntax error near unexpected token 'done'
./basic.agi: line 4: 'done'

我的bash版本是:

GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)

谢谢。


编辑:当 while 循环不为空时,该脚本可以正常工作。

顺便说一下,我期望在用户什么都没输入的情况下退出循环,也就是只是按了回车键,但 Bash 一直在循环。如何退出循环?

while read myline
do
        echo ${myline}
done

echo "Hello"
while read line
do
        true
done

exit 0

1
这个简单的读取循环会一直运行,直到“文件结束”。您可以通过键入Control-D来指定文件结束。 - Paŭlo Ebermann
6个回答

17

你不能有一个空的循环。如果你想要一个占位符,只需使用true

#!/bin/bash
while read myline
do
    true
done
或者更有可能的是,对输入执行一些有用的操作:
#!/bin/bash
while read myline
do
    echo "You entered [$line]"
done

至于您的第二个问题,即如何在用户仅按下 ENTER 键而没有其他输入时退出循环,您可以这样做:

#!/bin/bash
read line
while [[ "$line" != "" ]] ; do
    echo "You entered [$line]"
    read line
done

再次感谢。下次我会发布一个新的问题。 - Gulbahar
当 :; 为 (:true 的同义词) 时,执行循环。 - Fixee

1
这是一种在Bash中模拟dowhile循环的方法,它总是执行一次并在最后进行测试。
while
    read -r line
    [[ $line ]]
do
    :
done

当输入空行时,循环退出。此时变量将为空,但如果需要保留它的值,可以将其值设置为另一个变量。

while
    save=$line
    read -r line
    [[ $line ]]
do
    :
done

Dennis,你是不是打算用除了 '' 以外的东西来初始化 line?在我看来,循环永远不会开始。我的理解是,until 只是 while 的负条件版本,它不能保证至少执行一次迭代。我可能错了,但是 bash manpage 似乎也表明了这一点。 - paxdiablo
@paxdiablo:你是正确的。其他语言有一个带有测试结尾的适当的“do”循环,但Bash没有。我的答案在这里展示了如何在Bash中模拟一个“do while”循环。我已经更新了这个答案以匹配那个。 - Dennis Williamson

1

当你在 while 循环中使用 read 命令时,它需要输入:

echo "Hello" | while read line ; do echo $line ; done

或者使用多行:

echo "Hello" | while read line
    do
    echo $line
done

0
如果您想要创建一个带有选项的菜单,使其成为一个无限循环(并且具有退出选项),那么请参考以下内容。
PS3='Please enter your choice: '
options=("hello" "date" "quit")
select opt in "${options[@]}"
do
    case $opt in
        "hello") echo "world";;
        "date") echo $(date);;
        "quit")
            break;;
        *) echo "invalid option";;
    esac
done

在这里描述了PS3


0
你在尝试做什么?从外观上看,似乎你在尝试读取一个变量?
这可以通过简单地陈述“读取”,然后在$符号内找到该值来完成。
例如:
read myvar

echo $myvar

就像其他人所说的那样,循环的问题在于它是空的,这是不被允许的。


-1
如果你在bash中输入help while,你将得到该命令的解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接