Intereting Posts
Ошибка при установке Bcache на centOS SSH Agent-Forwarding работает, но как насчет sudo -u username no shell / permissions? композитор Загрузка с raid'ed> дисков 2GB, btrfs, обработка раздела загрузки BIOS Обнаружение гнезда звука (динамика) с debian Какие шаги я должен выполнить для настройки сервера Ubuntu на рабочих станциях Mac и Windows? Создайте RPM для конкретной незначительной версии RH Сменить строки в текстовом файле только там, где содержатся строки с использованием sed или ed? Каковы затраты на увеличение значения `/ proc / sys / fs / inotify / max_user_watches`? Загрузка только что скомпилированного ядра Linux Как перечислить доступные словари для hunspell? Сохраните stdout и stderr в файле, затем заново создайте вывод позже Как предотвратить экранирование экрана? apt-get wait для блокировки wpa_supplicant дает ошибки rfkill при подключении? Почему в Linux существует несколько папок для исполняемых файлов?

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

В моем сценарии 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 

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

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

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

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