Обнаруживать, если переменная пуста

В моем сценарии Bash у меня есть эта строка:

mv -f $HOME_DIR/$dir $HOME_SAVE/BACKUP 

Проблема в том, что если $dir пуст (нет директории $dir ), команда mv переместила каталог $HOME_DIR . Мы хотим только переместить директории $dir .

Как я могу избежать этого случая?

Я могу использовать это:

 ls $HOME_DIR | wc -l # and verify if the number is -gt 1 

Но это не изящное решение.

4 Solutions collect form web for “Обнаруживать, если переменная пуста”

Вы должны использовать:

 mv -f -- "$HOME_DIR/${dir:?}" "$HOME_SAVE/BACKUP/" 

Расширение не удастся, сценарий завершен, и сообщение об ошибке будет отправлено в stderr, если значение $dir пусто.

Вы даже можете указать напечатанное сообщение:

 mv -f -- "$HOME_DIR/${dir:?\$dir is UNSET or NULL!}" "$HOME_SAVE/BACKUP/" 

Альтернативно – и в меньшей степени – вы можете указать значения по умолчанию и / или подставлять значения для $dir которые будут применяться, только если это :- unset или null или :+ set и not null, используя аналогичную форму. Все эти примеры – выше и ниже – являются репрезентативными для нескольких из нескольких стандартных форматов расширения POSIX.

В приведенном ниже примере, когда $dir установлен, а не null, первая часть оценивает ваш исходный каталог, иначе ничего не происходит, а вторая часть оценивает его значение, если оно есть, но если оно не указало вместо этого в ваш целевой каталог. mv указывается сбой, когда его первый и второй аргументы называют один и тот же путь, и поэтому ничего не перемещается вообще.

 mv -f -- "${dir:+$HOME_DIR/}${dir:-$HOME_SAVE/BACKUP/}" "$HOME_SAVE/BACKUP/" 2>/dev/null 

Вероятно, это слишком сложно, хотя я полагаю:

 mv -f -- "$HOME_DIR/$dir" ${dir:+"$HOME_SAVE/BACKUP/"} 2>/dev/null 

… должен делать то же самое – mv ничего не может двинуть. Обратите внимание, что в оболочке, совместимой с POSIX, кавычки, даже внутри {} завитушек, служат для защиты расширения, потому что в этом случае значение не превышает $dir но вместо этого увеличивается значение слова ${dir:+word} . Вставка их в фигурные скобки служит для того, чтобы оценить расширение до нуля – даже пустую строку – когда ${dir} не задан или равен нулю. Это, вероятно, не имеет значения – я уверен, что нулевое имя файла недопустимо почти везде, но я так обычно это делаю. Это небезопасно для ${dir:-"word"} однако в этом случае вы получите либо неупорядоченное расширение ${dir} либо указанное word .

Возможно, вы также можете вызвать параметр -i nteractive для mv только если $dir имеет значение null:

 mv "-i${dir:+f}" -- "$HOME_DIR/$dir" "$HOME_SAVE/BACKUP/" </dev/tty 

… и поэтому вы наверняка, по крайней мере, не должны случайно перезаписывать любые файлы в … / BACKUP, если кто-то сначала не нажимает y (или что-то еще) на терминале.

POSIXly:

 [ -n "$dir" ] && mv -f -- "$HOME_DIR/$dir" "$HOME_SAVE/BACKUP" 

или:

 [ -d "${dir:+$HOME_DIR/$dir}" ] && ... 

Проверьте, нет ли переменной dir ( [[ -z $dir ]] ):

 [[ -z $dir ]] || mv -t "$HOME_SAVE/BACKUP" "$HOME_DIR/$dir" 

Вы можете использовать это:

 mv -f -- "$HOME_DIR/./$dir" "$HOME_SAVE/BACKUP/" 

Если $dir пуст, это приведет к ошибке «Ошибка устройства или ресурса».

Однако это немного взломать.

  • Вопрос AIX по команде cp
  • как определить, завершилось ли выполнение команды в оболочке?
  • наблюдение за выполнением скрипта с помощью скрипта monit, похоже, игнорирует каналы
  • Как поместить команду EOF в одну строку для выполнения нескольких команд оболочки
  • Выполнить стандартный вывод с функцией
  • Сортировка файлов по наивысшему числу в имени файла
  • Пауза (с чтением или аналогичным) в xargs
  • как войти с помощью ssh с паролем?
  • Может ли сценарий bash рассказать, какой каталог пользователь, когда он запускает скрипт?
  • Bash итерация по парам файлов
  • perl one liner + как соответствовать IP-адресу, который находится в поле файла first / sec
  • Interesting Posts

    Где я могу найти хорошую документацию для bash printf?

    BASH не нравится мое регулярное выражение

    Список доступных шрифтов с образцами

    Как заставить «yum search» использовать локальные метаданные / кеш?

    Почему на Mint 17.1 не работают клавиши emacs keybindings?

    Что произойдет, если я использую vi для больших файлов?

    Построение 32-битного в 64-битной системе

    Маршрутизация для нескольких восходящих линий / поставщиков

    Можно ли удаленно видеть, какой физический дисплей отображается на Linux-машине без X?

    Ошибка Xt: не удается открыть дисплей!

    Какая служба выполняет настройку часов реального времени

    Определения аргументов демона и сервера

    Как использовать MEncoder для кодирования всех png-файлов (в текущем каталоге) в качестве файла avi в порядке изменения даты?

    Как остановить Fedora от уведомления меня об обновлениях nodejs?

    Windows Recovery от Grub перепутала мой компьютер?

    Linux и Unix - лучшая ОС в мире.