Заставить KVM / libvirt ждать сетевого монтирования перед запуском гостей

Вау. С чего начать?

  • Вам нужно научиться отлаживать. Как отлаживать сценарий bash? - это справочник по Stack Exchange по этой теме, получивший большое количество голосов, при участии нескольких наших самых активных участников. Вы можете найти другую информацию на этом сайте и многое другое в Интернете. Например,
    • Упростить.
      • Избавьтесь от folderday , foldermonth и назначения `date…` ; просто создайте outputdirday с постоянными значениями.
      • Избегайте до степени смешения схожих имен переменных. Например, outdir равно outputdirday , , но outputdir отличается.
      • Удалите datetime , logdatetime и outputdir , , которые даже не используются в скрипте.
      • Устранение избыточности. Вы показываете две команды awk , которые идентичны , за исключением тривиальной разницы. Один из них работает, а один не работает? Они терпят неудачу по-разному? Я так не думаю. Тогда не показывай их обоих.
      • Не используйте длинные восьмиуровневые пути (например, ~ / sboper / StandAlone / input / $ foldermonth / GLMS_Daily / $ folderday / Customer_Create_Records.dat ) {{1 }} если вам действительно действительно не нужно.
    • В целях презентации (т. Е. При представлении вашей проблемы другим) избегайте путаницы в соглашениях об именах, например, называйте выходной каталог … / input /… .
    • В целях презентации старайтесь избегать строк, которые шире экрана (поэтому людям приходится прокручивать их, чтобы прочитать их полностью). В большинстве систем есть способы, позволяющие разделять команды и программы на несколько строк.
    • У вас действительно есть два каталога: один называется Standalone , а второй - StandAlone - в вашем ~ / sboper ] каталог?
    • Если конечный результат не тот, который вам нужен, узнайте, что происходит в середине процесса. Отображение промежуточных значений. Например,
      • выходной день .Когда я запускаю ваш скрипт и выполняю echo "$ outputdirday" перед awk , я получаю
         ~ / sboper / StandAlone / input / June_2016 / GLMS_Daily / 08 
        Т.е., поскольку ~ был в кавычках, он не был расширен до моего домашнего каталога. Мне пришлось изменить назначение на
         outputdirday = "$ HOME / sboper / StandAlone / input / $ foldermonth / GLMS_Daily / $ folderday" 
        {{ 1}} , чтобы заставить его работать.
      • outdir . Вы говорите, что он настроен неправильно, но вы пытались его распечатать? Когда я это делаю, я получаю то же значение, что и для outputdirday .
      • имя файла . Это , где (частично) проблема; см. ниже.
  • Когда вы просите о помощи, вам следует
    • упростить проблему, как описано выше.
    • Опишите, что должна делать ваша команда.
    • Покажите, как выглядит ваш входной файл.
    • Покажите, как вы ожидаете, что будет выглядеть ваш результат.
    • Укажите версии программного обеспечения, которое вы используете. Хотя я считаю, что понимаю, что не так с вашим скриптом, я не могу точно воспроизвести ваши ошибки (так что, похоже, я использую другую версию awk ). Это, вероятно, не действительно важно, но вы даже не говорите, в какой операционной системе вы работаете.


Вот важная часть:

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

  • Если, как я предложил выше, {{1 }} если вы разбили основной блок действия в своем awk скрипте на более короткие строки, вы могли понять, что он эквивалентен
     {
    if ($ 12 == "A") 
    filename = "outdir / Customer_Create_Records.dat "
    print >> filename 
    close (filename) 
    } 
    Как указал Майкл Верс в его ответ , это устанавливает filename условно , и затем записывает каждую входную строку в filename безоговорочно . Как он предлагает, вам нужно сделать что-то вроде
     {
    if ($ 12 == "A ") {
    filename =" outdir / Customer_Create_Records.dat "
    print >> filename 
    close (filename) 
    } 
    } 
  • Если, как я предложил выше, вы напечатали значение filename после его установки, вы бы увидели, что это было {{1} }
     outdir / Customer_Create_Records.dat 
    , потому что "outdir" (в кавычках) означает строку o u t d i r , а не ] значение переменной outdir . Вам нужно сделать {{ 1}}
     filename = outdir "/Customer_Create_Records.dat" 

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

Почти так же важно:

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

  • Вы всегда должны указывать ссылки на переменные оболочки (например, "$ outputdirday" , "$ inputdir" и "$ sourcefile" ) , если у вас нет веской причины не делать этого, {{1} } и вы уверены, что знаете, что делаете. Это не похоже на причину данной проблемы, , но в конечном итоге это доставит вам неприятности.
  • Для ясности вы можете изменить `…` на $ (…) - см. this , это и это .

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

  • Хотя вы всегда должны указывать ссылки на переменные оболочки , если у вас нет веской причины не делать этого, { {1}} то же самое не относится к обратной косой черте. Вы должны использовать их только тогда, когда у вас есть причина для этого. Например, дата +% Y% m% d и дата +% B_% Y и т. Д. Работают нормально.
  • Как я уже предлагал ранее, для того, что вы делаете, вам не нужны два вызова awk . Все это можно сделать с помощью

     awk -v outdir = "$ outputdirday" '
    НАЧАТЬ {FS = "~" 
    filenameA = outdir "/Customer_Create_Records.dat "
    filenameM = outdir" /Customer_Modify_Records.dat"
    } 
     {
    if ($ 12 == "A") print >> filenameA 
    if ($ 12 == "M") print >> filenameM 
    } 
     '"$ inputdir / $ sourcefile" 
     

    или

     awk -v outdir = " $ outputdirday "'
    BEGIN {FS =" ~ "
    filenameA = outdir" /Customer_Create_Records.dat"
    filenameM = outdir "/Customer_Modify_Records.dat"
    } 
     $ 12 == "A" {print >> filenameA} 
     $ 12 == "M" {print >> filenameM} 
     '"$ inputdir / $ sourcefile" {{1 }} 

    Насколько я могу судить, вам вообще не нужно закрывать файл (ы); файлы обычно закрываются автоматически при выходе из программы.

2
07.09.2016, 13:02
0 ответов

Теги

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