Цикличное выполнение по папке вводит так или иначе цикл

Для Ubuntu-Debian можно использовать Partprobe (http://www.cyberciti.biz/tips/re-read-the-partition-table-without-rebooting-linux-system.html), но если Вы хотите к обнаруженному весь LUN (также программное обеспечение RAID), я предпочитаю scsitools пакет (команда: sudo rescan-scsi-bus).

3
29.07.2013, 20:01
2 ответа

Подстановочный шаблон, который не соответствует никакому файлу, оставляют нерасширенным. Намерение состоит в том, чтобы позволить вводить аргумент команде, которая содержит подстановочные символы, но не предназначается, чтобы быть шаблоном. Это делает некоторую капельку смысла на командной строке, где это позволяет сохранять два символа кавычки иногда. В сценарии это является очень раздражающим. К сожалению, нет никакого способа изменить это поведение в традиционном sh. Можно проверить, оставили ли шаблон нерасширенным.

for f in "../$package/${package}Setup"/*/*/*.msi; do
  if [ "$f" = "../$package/${package}Setup"/*/*/*.msi" ]; then
    # No match
    break
  fi
  …
done

Bash может быть проинструктирован для расширения подстановочного шаблона несоответствия до пустого списка. Измените свою строку хижины на #!/bin/bash, и можно сделать это:

shopt -s nullglob
for f in "../$package/${package}Setup"/*/*/*.msi; do
  …

В Вашем сценарии существуют другие проблемы. Путем Вы используете searchPath переменная повредится, если будут пробелы или подстановочные символы (включая обратные косые черты) в $package. Не уезжайте $searchPath подстановки переменных закрыли кавычки. Всегда используйте двойные кавычки вокруг подстановок переменных, если Вы не хотите, чтобы они рассматривались как разделенный от пробела список шаблонов, который не имеет место здесь — $package строка (требующий двойных кавычек) в то время как очевидное * сделайте партию подстановочным шаблоном. Поместите шаблон непосредственно в for цикл, как выше.

Для входа, вместо них echo команды (которые испытывают недостаток в двойных кавычках вокруг подстановок переменных, таким образом, аргументы будут искажены), используют set -x отображать каждую команду на stderr, поскольку это выполняется.

В какой-то момент в сценарии, Вы устанавливаете IFS=#, но Вы никогда не делаете никакого разделения на #. Не устанавливать IFS если Вы не собираетесь использовать его.

Существует несколько проблем с mode=$(echo $file | sed -e 's:.*/.*/\(.*\)/.*\.msi:\1:'). Как объяснено выше, это испытывает недостаток в двойных кавычках вокруг "$file". Кроме того, вызов дополнительного sed чтобы каждый файл обработал, является медленным (выполнение внешних процессов является медленным на Cygwin) и чрезмерно сложным. Оболочка имеет строковые конструкции обработки; в то время как они примитивны, они достаточны здесь. Ваш

dir="${file%/*}"
mode="${dir##*/}"
dir="${dir%/*}"
version="${dir##*/}"
7
27.01.2020, 21:09
  • 1
    причина, почему я использовал IFS, состоит в том, что targetPath содержит пространство, и передающий в конце $file$newFile CP закончился по ошибке, потому что $newFile рассмотрели, пространство разделило список файлов вместо этого что единственный файл. Также можно ли показать мне, как $package должен быть заключен в кавычки в searchPath присвоении? –  Edmondo1984 30.07.2013, 11:24
  • 2
    btw я получил Ваше предложение. все работает правильно. Помимо mkdir-p под cygwin, по-видимому –  Edmondo1984 30.07.2013, 12:31

Этот сценарий имеет набор проблем, но поведение, о котором Вы спрашиваете, почему цикл выполняется, является этим:

В конструкции оболочки

for f in <expr>; do <commands>; done

шаблон файла часто используется для "expr", который затем заменяется именем файла оболочки globbing, и именно это Вы сделали. Но Ваше выражение ничему не соответствует, таким образом, globbing не разворачивает его в список путей к файлам. Но это также не нулевая длина (пустой) список как на многих других языках, а скорее является выражением пути со звездочками, которые Вы повторяете чуть выше цикла. Таким образом, цикл выполняется однажды с набором $f, равным нерасширенной строке, заканчивающейся в *.msi. Вы видите это, где Вы повторяете его перед циклом. Мы знаем, что это ничему не соответствует, потому что Вы также используете его с ls, и именно поэтому Вы не получаете "Такой файл или каталог" ошибка.

(Обратите внимание также использование $file в цикле, и я думаю, что Вы означаете использовать $f там.

5
27.01.2020, 21:09

Теги

Похожие вопросы