linux - Bash while if 函数

标签 linux bash shell

我正在尝试运行这个 bash 脚本。

#!/bin/sh

MAX=5

j=1 

while [ $((1+$j)) -le $MAX ] do 

input=$j

if [ $input -le $j ] then 
echo "input=$j,$j,$((j+1)),$((j+2)),$((j+3)),$((j+4))" 
else 
echo "$input" 
fi j=$((j+1))

done

我正在编写一个 bash 脚本并尝试检查 shell 值的参数中提供的顺序列表。输出内容为:

 input=1,1,2,3,4,5 
 input=2,2,3,4,5,6 
 input=3,3,4,5,6,7 
 input=4,4,5,6,7,8

正如我所期望的,它应该在每一行按递增顺序给出列表,但我正在寻找的结果是:

 input=1,2,3,4,5 
 input=2,1,3,4,5 
 input=3,1,2,4,5 
 input=4,1,2,3,5
 input=5,1,2,3,4

请帮助我,谢谢。

最佳答案

在您的脚本中,当您迭代变量 j 时,只有 while 循环会跟踪范围 {1 .. MAX}。因此,如果您在循环中处于 j=5 位置,则在 $j,$((j+1)),$((j+2)),$((j+3)),$((j+4)) 上运行 echo 分别会产生 5,6,7,8,9,这不是您想要的结果。

解决方案的一种方法是,给定数字 i,创建一个范围 {1 .. MAX},并删除 i。例如,给定 i=2,创建列表 1,3,4,...,MAX。然后可以将其连接到最终输出格式,如 echo "input=$i,$list"

以下range例程创建这样一个列表:

# range() outputs a range of numbers 1 to MAX, but with
#    the number 'num' removed from the range.
# Usage: range num MAX
# Example: [ input: range 2 5 ] [ output: 1,3,4,5 ]
range() {
    num="$1"
    MAX="$2"
    for i in $(eval echo {1..$MAX}); do
        if [ "$num" -eq "$MAX" ]; then
            if [ "$i" -eq $((MAX-1)) ]; then
                printf "$i"
                break
            else
                printf "$i,"
            fi
        elif [ "$i" -eq "$MAX" ]; then
            printf "$i"
        elif [ "$i" -eq "$num" ]; then
            continue
        else
            printf "$i,"
        fi
    done
    printf "\n"
}

然后你的 while 循环就变成了,

j=1
MAX=5

while [ "$j" -le "$MAX" ]; do
    list=$(range "$j" "$MAX")
    echo "input=$j,$list"
    j=$((j+1))
done

其中 list 变量被分配使用 range "$j""$MAX" 创建的范围的值,然后 list 连接到最终输出。

<小时/>

测试:假设上述脚本名为permute

# when j=1 and MAX=5
$ ./permute
input=1,2,3,4,5
input=2,1,3,4,5
input=3,1,2,4,5
input=4,1,2,3,5
input=5,1,2,3,4

# when j=1 and MAX=10
$ ./permute
input=1,2,3,4,5,6,7,8,9,10
input=2,1,3,4,5,6,7,8,9,10
input=3,1,2,4,5,6,7,8,9,10
input=4,1,2,3,5,6,7,8,9,10
input=5,1,2,3,4,6,7,8,9,10
input=6,1,2,3,4,5,7,8,9,10
input=7,1,2,3,4,5,6,8,9,10
input=8,1,2,3,4,5,6,7,9,10
input=9,1,2,3,4,5,6,7,8,10
input=10,1,2,3,4,5,6,7,8,9

关于linux - Bash while if 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35993628/

相关文章:

linux - 在 linux 中重命名具有不同模式的文件

linux - 使用 sed linux 命令

linux - 我正在尝试编写一个 shell 命令来查找并编译所有 C 程序

linux - Linux服务器var文件夹的默认权限是什么?

linux - 这个 docker 文件的解释?

linux - 如何使用 awk 命令验证文件的内容?

linux - 如何在 Linux 中创建一个可以使用 ROT13 解密和加密文件的菜单?

bash - 字符串比较不起作用

linux - 如何在特定字符linux之后在行中添加一个空格

bash - 从 Google Cloud VM (Ubuntu) 在预定时间运行脚本