在shell脚本中打破循环

时间:2015-02-16 00:45:48

标签: linux shell unix

用户输入必须计算单词数的句子。如果数字大于3,则应将句子视为 Long 。如果是三个或更少,那么

我知道怎么做,但剩下的任务说制作一个循环,这样用户就可以输入句子,直到他输入" n"。问题是当我输入" n"这是重要的,但那" n"不应该被计算在内。 (它应该是一个break语句。)如何在计算字母之前打破这个循环" n"?

#!/bin/bash
recenica=0
while [ $recenica != "n" ]
do
    echo Unesite recenicu:
    read recenica
    if [ $recenica = "n" ]; then # ->>>>> this doesn't work
        break
    fi  
    echo $recenica > datoteka
    br=$(wc -l datoteka | cut -c1-2)
    echo recenica ima $br rijeci
    if [ $br -gt 3 ] 
    then
        echo $recenica > Duge.Recenice.IB
    elif [ $br -le 3 ] 
    then
        echo $recenica > Kratke.Recenice.IB
    else
        echo Molimo unijeti nešto
    fi  
done

2 个答案:

答案 0 :(得分:0)

你需要在扩展到多个单词(包含空格)的符号周围使用引号......这有效:

#!/bin/bash
recenica=0
while [ "$recenica" != "n" ] # koristiti dvostruke navodnike ovdje
do
    echo Unesite recenicu:
    read recenica
    if [ "$recenica" = "n" ]; then # koristiti dvostruke navodnike ovdje
        break
    fi  
    echo $recenica > datoteka
    br=$(wc -l datoteka | cut -c1-2)
    echo recenica ima $br rijeci
    if [ $br -gt 3 ] 
    then
        echo $recenica > Duge.Recenice.IB
    elif [ $br -le 3 ] 
    then
        echo $recenica > Kratke.Recenice.IB
    else
        echo Molimo unijeti nešto
    fi  
done

答案 1 :(得分:0)

read的问题在于它会读取整行并将内容放在recenica中。用一个词来说这对测试来说很好:

while [ $recenica != "n" ]

但是,如果您已阅读多个单词,那么由于[: too many arguments(由amdn在其引用的答案中指出),测试将失败

当您输入n时,您只关心第一个字,因此请使用parameter expansion/substring extraction相应地限制您的测试:

while [ ${recenica%% *} != "n" ]; do

这允许您让while循环控制break逻辑,将代码的整个结构减少为:

#!/bin/bash
recenica=0
while [ ${recenica%% *} != "n" ]
do
    echo Unesite recenicu:
    read recenica

    echo $recenica > datoteka
    br=$(wc -l datoteka | cut -c1-2)
    echo recenica ima $br rijeci

    if [ $br -gt 3 ] 
    then
        echo $recenica > Duge.Recenice.IB
    elif [ $br -le 3 ] 
    then
        echo $recenica > Kratke.Recenice.IB
    else
        echo Molimo unijeti nešto
    fi  
done

有很多方法可以做到这一点,但这种方法很好。