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



Hello Stackoverflow community,

为了使我的代码尽可能减少"复制粘贴",我正在尝试提出一种更智能的方法来使其更紧凑。

有没有办法在你的脚本中创建一个"条件 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"
}

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

我想实现的目标 - 但由于语法而不起作用:

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)

提前谢谢你,

伊凡

使用默认值运算符。

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

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

最新更新