2015-10-29 2 views
3

Попытка разбить цикл for, если переменная $ DEVP не существует.Перерыв для цикла, если переменная ложна

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 

ответ

2

Распад работает отлично

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 

Взгляните here

+0

Я попробовал -z, но потом понял, что это должно быть -d вместо этого. Я только что запустил цикл if, но он возвращает false, когда я ищу каталог. Кажется, он не знает каталоги, которые существуют? – Phil

+0

Вы уверены, что это каталог? Вам нужно -b для блочного устройства –

+0

Я только что запустил ls и заметил, что это блок-устройство. Я не знал, что вы можете использовать -b. Спасибо, Роман. Легенда! – Phil

0

Первый ремонт синтаксис: Положите вещи в кавычках в, если заявление.

EDIT: Я думал, вам нужно обратиться к var 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 линии, так что вы можете проверить, не делая то, что вы не хотите ,

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 
+0

'' 'необязательно в индексе массива в Bash. – tripleee

+0

@tripleee Спасибо, я обычно стараюсь избегать массивов в bash. Без '' 'код выглядит более чистым! –

+0

До сих пор нет способа для '' $ {nme [i]} $ {DEVP [i]} "' быть буквально нулевой строкой, так что части логики понадобится еще один раунд мышления. Я предполагаю, что цель состояла в том, чтобы принять ветку 'if', если либо (или оба?) Не установлены, но это действительно просто чистая догадка. Вопрос просто не очень ясен. – tripleee

0

Ваше сравнение выглядит так, как будто вы ожидаете, что две строки будут содержать единственное число, равное нулю. Они никогда не будут. Если они пусты, они будут содержать пустую строку. (Но даже тогда, когда два аргумента строки слева от оператора сравнения являются синтаксической ошибкой.)

В любом случае, если фактическая проблема, которую вы пытаетесь решить, заключается в том, что вы не знаете, сколько элементов содержится в этих массивах, Просто спроси.

for((i=0; i<${#DEVP[@]}; ++i)); do 

Конечно, если массивы содержат разное количество аргументов, вы все еще можете оказаться в ситуации, когда ${nme[i]} не определен.

${nme[i]+:} break 

Это довольно туманно - она ​​будет расширяться в пустую строку перед break (и, таким образом, выйти из цикла), если значение не задано; если он установлен, это всего лишь : noop.

Смежные вопросы