如果变量为假,退出for循环。

3

尝试在变量$DEVP不存在时中断for循环。

nme=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
DEVP=(/dev/disk2 /dev/disk3 /dev/disk4 /dev/disk5 /dev/disk6 /dev/disk7 /dev/disk8)

for ((i = 0; i < 7; i++)) ; do 
    if [ ${nme[i]} ${DEVP[i]} = 0 ] ; then
        diskutil eraseDisk FAT32 ${nme[i]} ${DEVP[i]}
    else
        echo “Formatted USBs” ; break
    fi
done
3个回答

2

这个 break 命令运行良好。

for ((i = 0; i < 7; i++)) ; do
    if [ $i -lt 3 ] ; then
       echo $i
    else            
        echo “Formatted USBs” ; break
    fi
done

输出结果为:

0
1
2
“Formatted USBs”

然而,关于你的if语句,我不确定,你可能应该使用-z

 if [ -z ${DEVP[i]} ] ; then

Have a look here


我尝试了-z,但后来意识到应该使用-d。我刚刚运行了if循环,但当我搜索目录时它返回false。它似乎无法识别存在的目录? - Phil
你确定这是一个目录吗?你需要使用-b选项来指定块设备。 - Roman Pustylnikov
我刚刚运行了ls命令并注意到它是一个块设备。我不知道你可以使用-b选项。谢谢你,Roman。传奇! - Phil

1
你的比较似乎认为这两个字符串包含单个数字零。它们永远不会有。如果它们是空的,它们将包含空字符串。(但即使如此,在比较运算符左侧有两个字符串参数也是语法错误。)
无论如何,如果你试图解决的实际问题是你不知道这些数组包含多少元素,那就问一下。
for((i=0; i<${#DEVP[@]}; ++i)); do

当然,如果数组包含不同数量的参数,你仍然可能会遇到${nme[i]}未定义的情况。
    ${nme[i]+:} break

这段代码非常晦涩 -- 如果该值未设置,它将扩展为空字符串,然后在 break 前中断循环;如果已设置,这只是一个 : 的无操作。

0

首先修复语法:在if语句中将事物放入引号中。

编辑:我以为你需要使用$i来引用变量i,但是@tripleee向我展示了,在bash数组中这是可选的。我删除了额外的$字符。

nme=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
DEVP=(/dev/disk2 /dev/disk3 /dev/disk4 /dev/disk5 /dev/disk6 /dev/disk7 /dev/disk8)
for ((i = 0; i < 7; i++)) ; do
        if [ "${nme[i]} ${DEVP[i]}" = 0 ] ; then
                echo "diskutil eraseDisk FAT32 ${nme[i]} ${DEVP[i]}"
        else
                echo “Formatted USBs” ; break
        fi
done

如果你想检查变量是否为空,在循环8次之前引入一个错误。
我已经在diskutil命令前加了echo,这样你就可以测试而不会做出不想要的操作。
for ((i = 0; i < 8; i++)) ; do
        if [ -z "${nme[i]}" ]; then
           echo "loop $i: \${nme[i]} is empty";
           break;
        fi
        if [ -z "${DEVP[i]}" ]; then
           echo "loop $i: \${DEVP[i]} is empty";
           break;
        fi
        echo "diskutil eraseDisk FAT32 ${nme[i]} ${DEVP[i]}"
done

在Bash中,数组下标中的$是可选的。 - tripleee
@tripleee 谢谢,我通常尽量避免在bash中使用数组。没有 $ 符号,代码看起来更简洁! - Walter A
仍然没有办法使"${nme[i]} ${DEVP[i]}"成为字面上的零,因此该逻辑的这一部分需要再思考一轮。我的猜测是,意图是在任一(或两者都)未设置时进入if分支,但这实际上只是纯粹的猜测。问题并不是非常清晰明了。 - tripleee
抱歉,应该是 if [ -b ${DEVP[i]} ] ; then${nme[i]} 不应该在里面。@Roman 已经明白了。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接