Несколько моих переменных в функции не выражаются в виде псевдонимов. Я думаю, что мой синтаксис неверен

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

$3 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ {
        $3="(" substr($3, 1, 3) ") " substr($3, 4, 3) "-" substr($3, 7, 4)
}

$3 ~ /^[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
        $3="(" substr($3, 1, 3) ") " substr($3, 5, 3) "-" substr($3, 9, 4)
}

$3 ~ /^\+1 \([0-9][0-9][0-9]\) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
        $3="(" substr($3, 5, 3) ") " substr($3, 10, 3) "-" substr($3, 14, 4)
}

1

Сохраните это в файл, например phone.awk, затем вызовите его с помощью:awk -F $'\t' -f phone.awk < input.

1
05.05.2020, 19:46
1 ответ

Я не понимаю, как вы могли получить этот вывод при запускеa:вы опубликовали вывод из другой версии? Но в любом случае я вижу, что не так с кодом.

Первая проблема заключается в том, что local $1=…не делает того, что вы думаете. Он устанавливает переменную, имя которой является первым параметром, но не устанавливает первый параметр. Например, если вы вызываете функцию как a foo, первая строка устанавливает для локальной переменной fooзначение foo. Если вы вызовете aбез аргументов, вы получите

bash: local: `=3600': not a valid identifier

(и другие ошибки ), потому что то, что слева от =, является пустой строкой, а пустая строка не является допустимым именем для переменной.

Вы не можете использовать синтаксис присваивания для установки пронумерованных параметров.:local 1=…также не работает. Вам нужно либо дать переменной имя, либо использовать встроенную функцию set, чтобы установить сразу все пронумерованные параметры.

a () {
    local delay="${1:-3600}"
    local first_command_to_split_and_glob="${2:-paa}"
    local second_command_to_split_and_glob="${3:-alarm}"
    sleep "$delay" && $first_command_to_split_and_glob && $second_command_to_split_and_glob
}

Вторая проблема заключается в том, что псевдонимы раскрываются только тогда, когда они явно появляются в начале команды. Они не расширяются из результата какого-либо другого расширения, такого как получение значения переменной.

В вызове $first_command_to_split_and_globесть еще одна проблема, заключающаяся в том, что он работает только в простых случаях. Он разбивает значение переменной (, т. е. аргумент, переданный функции )в пробеле, затем интерпретирует каждую часть как шаблон подстановки, который расширяется, если шаблон соответствует хотя бы одному имени файла. Например, a 2 'cat "file name with spaces"'пытается отобразить содержимое файлов с именами "file, name, withи spaces". Расширение переменной вне кавычек применяет операцию «split+glob» :, она не возвращает значение переменной и не выполняет вычисление значения, а выполняет нечто промежуточное, что редко бывает полезно. См. Почему мой сценарий оболочки забивается пробелами или другими специальными символами? для более подробной информации.

Чтобы устранить эти две проблемы, используйте evalв строке.Обратите внимание на двойные кавычки вокруг "$first_command"и "$second_command", чтобы избежать разделения и подстановки.

a () {
    local delay="${1:-3600}"
    local first_command="${2:-paa}"
    local second_command="${3:-alarm}"
    sleep "$delay" && eval "$first_command" && eval "$second_command"
}

Наконец, чтобы передать пустой аргумент, используйте кавычки для разделения пустой строки. Например:

a '' pah

ждет 3600 секунд, затем запускается pah, а затем запускается alarm.

2
28.04.2021, 23:16

Теги

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