如何在Bash中建立条件while语句?

时间:2018-08-07 12:24:22

标签: linux bash if-statement while-loop

Hello Stackoverflow社区,

为了使我的代码尽可能少“ copy-paste-ey”,我正在尝试提出一种更聪明的方法来使其更紧凑。

有什么方法可以在脚本中创建“有条件的while”语句(如果有的话),而不必重复所有操作?基本上,我具有相同的核心功能,但应根据变量是否存在来触发不同的while语句。

请参阅下面的原始脚本:

messenger() {
msg1=$1
count=0
echo " "
while [[ $count -ne ${#1} ]]
do
    echo -n "*"
    ((count += 1))
done
echo -e "\n$1"
while [[ $count -ne 0 ]]
do
    echo -n "*"
    ((count -= 1))
done
echo -e "\n"
}

这是我的核心功能,但我不希望计数$ 1的长度,而是希望计数等于提供的变量$ val的可能性,但前提是提供了该变量。

我想实现的目标-但由于语法的原因无法正常工作

messenger() {
msg1=$1
val=$2
count=0
echo " "
if [[ -z $val ]]
then
   while [[ $count -ne ${#1} ]]
else
   while [[ $count -ne $val ]]
fi
do
    echo -n "*"
    ((count += 1))
done
echo -e "\n$1"
while [[ $count -ne 0 ]]
do
    echo -n "*"
    ((count -= 1))
done
echo -e "\n"
}

我设法实现的唯一方法是重用大部分核心,基本上是复制粘贴操作。我想提出一种更好的方法来实现这一目标:

messenger() {
msg1=$1
val=$2
count=0
echo " "
if [[ -z $val ]]
  then
        while [[ $count -ne ${#1} ]]
        do
            echo -n "*"
            ((count += 1))
        done
        echo -e "\n$1"
        while [[ $count -ne 0 ]]
        do
            echo -n "*"
            ((count -= 1))
        done
        echo -e "\n"
else
        while [[ $count -ne $val ]]
        do
            echo -n "*"
            ((count += 1))
        done
        echo -e "\n$1"
        while [[ $count -ne 0 ]]
        do
            echo -n "*"
            ((count -= 1))
        done
        echo -e "\n"
fi
}

我相信这个例子可以完美地总结我想要达到的目标。如果您能指出我的方向,我将不胜感激。

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

先谢谢您

伊凡

1 个答案:

答案 0 :(得分:3)

使用默认值运算符。

while [[ $count -ne ${val:-${#1}} ]]

如果val不为空,则将使用该值。否则,它将使用${#1}