Bash glob 扩展到多个参数

Bash glob 扩展到多个参数

我是 bash 脚本新手。我有一个脚本来 ping 多台“我”编写的机器:

for var in "$@"
do
        ping -c 1 -W 2 "$var" > /dev/null
        echo $var = $?
done

我想做的是允许一个 glob 作为输入来 ping 多台具有相似名称的机器。

例如:pingall machine[:01-06:]但我不知道如何实现这一点。

答案1

通配是另一个名字文件名生成或者路径名扩展

这就是将 shell 通配符转换为与其匹配的文件列表的过程。它只能用于现存的文件。

在这里,您可以使用大括号扩展来代替:

pingall machine{01..06}

shell 扩展为machine01, machine02...machine06单独的参数,无论当前目录中是否存在该名称的文件(不是通配)。

该语法来自 和的最新版本,zsh并且也受其支持。bashyash -o braceexpand

使用ksh93,您可以使用:

pingall machine{1..6%02d}

尽管在这种特殊情况下,您也可以使用:

pingall machine0{1..6}

使用 GNUseq命令,您还可以执行以下操作(假设默认值为$IFS):

pingall $(seq -f machine%02.0f 6)

答案2

仅当匹配文件名时模式才会扩展。也许你可以使用大括号扩展来代替?运行脚本

pingall machine0{1..6}

这将扩展到

pingall machine01 machine02 machine03 machine04 machine05 machine06

相关内容