Как выполнить несколько команд в состоянии while l oop? - PullRequest
2 голосов
/ 20 февраля 2020

Я хочу создавать каталог с увеличивающимися числами каждый раз, когда я запускаю скрипт. Мое текущее решение:

COUNTER=1
while mkdir $COUNTER; (( $? != 0 ))
do
     COUNTER=$((COUNTER + 1)) 
done

Является ли разделение команд в состоянии while с ; (точка с запятой) лучшей практикой?

Ответы [ 2 ]

3 голосов
/ 20 февраля 2020

Самой целью из while и другими управляющими операторами оболочки является запуск команды и проверка ее кода выхода. Вы можете использовать ! для отмены кода выхода.

while ! mkdir "$COUNTER"
do
     COUNTER=$((COUNTER + 1)) 
done

Обратите внимание также на цитирование ; см. далее Почему тестирование "$?" чтобы увидеть, была ли команда выполнена успешно или нет, анти-шаблон?

Таким образом, если вы хотите, чтобы две команды выполнялись и заботились только о коде выхода из второй, точка с запятой является правильным разделителем , Часто вы хотите, чтобы обе команды были успешными; тогда && - правильный разделитель для использования.

2 голосов
/ 20 февраля 2020

Вам не нужно проверять состояние выхода, просто проверьте, существует ли каталог, и увеличьте его. Вот один из способов

#!/usr/bin/env bash

counter=1
while [[ -e $counter ]]; do
  ((counter++))
done


if ! mkdir "$counter"; then  ##: mkdir failed
  echo failed                ##: execute this code
fi

POSIX sh shell.

#!/usr/bin/env sh

counter=1
while [ -e "$counter" ]; do
  counter=$((counter+1))
done

if ! mkdir "$counter"; then  ##: If mkdir failed
  echo failed                ##: Execute this code
fi
  • Взрыв ! отменяет состояние выхода mkdir.

  • См. help test | grep '^[[:blank:]]*!'

Что ж, если вы просто собираетесь отменить статус выхода mkdir в то время как l oop, тогда вы можете также используйте until, который противоположен while

counter=1
until mkdir "$COUNTER"; do
  :
  COUNTER=$((COUNTER + 1))
done
...