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

В моем сценарии 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 пуст, это приведет к ошибке «Ошибка устройства или ресурса».

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

  • Как я могу получить доступ к столбцу строки из строки?
  • bash script: более элегантный способ получить самую последнюю версию go?
  • Grep строка из файла
  • Сравнение полей с разделителями
  • Помощь с 64-битными целыми числами в скриптах?
  • Почему я не получаю сообщение, которое не соответствует, когда я запускаю этот скрипт?
  • Какой интерпретатор оболочки запускает скрипт без shebang?
  • Проверить IP-адрес в диапазоне белого списка
  • Очистить содержимое файла
  • Как именно `if $ cmd; затем $ cmd; fi` отличаются от `$ cmd && $ cmd`?
  • Получение полной командной строки, вызвавшей ERR, в то время как ловушка
  • Interesting Posts

    запустить сценарий при выключении в Debain

    Псевдоним для перемещения файлов и последующего их назначения

    Чтение нескольких строк из текстовых файлов в bash

    Как отключить пароль блокировки экрана, но сохранить экран блокировки?

    Как установить vncserver с паролем?

    Xubuntu 14.04 не приостанавливается; вместо этого он замерзает и закрывает экран

    ctrl + alt + f7 не может переключиться

    Что означает двоеточие (':') в синтаксисе разрешения переменной bash?

    Выполнение команд оболочки в Python

    Удаление ярлыков для переключения виртуальных терминалов в Linux

    Является ли мой процессор перегрева моего процессора (Dual Core i5) или графическим процессором (Nvidia 320M), и могу ли я исправить его в Linux Mint?

    Почему мой загрузочный раздел Pandaboard должен быть vfat, а rootfs должен быть ext3 или ext4?

    Как разделить файл размером 6 или 7 ГБ на несколько файлов под-2 ГБ без разделения записи?

    Как бороться с разрывом в Gentoo на NVIDIA?

    Установка Kali 2.0 на виртуальной коробке

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