Цикличное выполнение по записям каталога в ударе и сохраняющий к массиву

Похож на Вашу базу данных, не запускается. Подключение с

sqlplus / as sysdba

Затем выйдите startup команда.

Также удостоверьтесь, что слушатель в порядке с lsnrctl status (lsnrctl start если это не работает).

1
13.04.2017, 15:36
1 ответ

Если Вы хотите добавить вещи к массиву в цикле, можно использовать что-то как:

for x in */C/populate.sh; do
  myarr=(${myarr[@]} "${x%%/*}")
done

Посмотрите, что удар выстраивает документацию для большого количества материала, который можно сделать с ними.

С другой стороны, можно использовать += для добавления к массиву (см. здесь) как это:

  myarr+=("${x%%/*}")

Несколько комментариев:

Когда я прокомментировал его вопрос, x здесь соответствует шаблонам формы */C/populate.sh.

Это не то, как я объяснил бы это. */foo/bar шаблон шарика. Это расширено оболочкой до списка всех файлов/каталогов, которые соответствуют этому шаблону. (Попробуйте echo */C/populate.sh, Вы будете видеть все распечатанные соответствия.)
for цикл выполняет итерации по этому набору соответствий, с помощью $x как переменная цикла.

Кроме того, ${x%%/*} соответствует первой части строки, а именно, высокоуровневое имя каталога.

${x%%/*} ничему не "соответствует". Это - функция обработки строк, которая воздействует на $x. Из документов, ${var%%string} удаляет самое долгое соответствие string от конца $var. В этом случае это удаляет все сначала / вперед и "возвраты" (расширяется до), это.

Таким образом для повреждения вышеупомянутых трех строк кода вниз, что происходит:

  • оболочка генерирует список объектов (файлы или каталоги), которые соответствуют шарику */C/populate.sh.
  • для каждого из тех тело цикла выполняется с $x набор к тому объекту
  • ${myarr[@]} расширяется до списка каждого объекта в массиве
  • ${x%%/*} расширяется до $x минус все сначала / вперед
  • myarr затем восстановлен с его старым содержанием плюс новый, упрощенный объект.
4
27.01.2020, 23:21
  • 1
    Спасибо, который работает. Однако можно ли предложить более определенную ссылку или сломать ли ее немного? Я посмотрел на Вашу ссылку, но я не вижу его. myarr[@] некоторое волшебство for-each оператор, это кажется. –  Faheem Mitha 03.08.2012, 00:41
  • 2
    Нет ничего особенного для разрушения, добавление имеет форму array=(${array[@]} $appended_element). Поиск добавляет на той странице. См. также tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html ($ {массив} расширяется до всех элементов массива.) –  Mat 03.08.2012, 00:43
  • 3
    Для добавления элемента к массиву, можно использовать myarr+=("${x%%/*}") (обратите внимание, что круглые скобки необходимы в ударе). –  Gilles 'SO- stop being evil' 03.08.2012, 02:14
  • 4
    Спасибо, я не знал, что это было возможно. Намного более хороший синтаксис. –  Mat 04.08.2012, 11:53
  • 5
    @Mat: Спасибо за ответ, и жаль о медленном ответе. Я в конечном счете решил не использовать массивы в этом случае, в конце концов, но хорошо знать, как сделать так. Всего один последующий вопрос - делает */foo/bar будьте расширены каждый раз, когда цикл передает чрезмерно, или только в первый раз, когда он вводит цикл? –  Faheem Mitha 23.08.2012, 07:52

Теги

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