В вашем скрипте 2 ошибки
z
не инициализирована if(out_ar)
во втором фрагменте кода не подходит для массивов Чтобы решить первую проблему, вам нужно назначить элемент массива (наподобие z[1]=1
), так как в awk нет объявления массива. (Вы не можете использовать подобный оператор, например declare -A
, как в bash ).
Вторую проблему можно решить, если вы используете GNU awk, с функцией isarray()
или typeof()
.
Таким образом, ваш код должен выглядеть так:
function add_one(in_ar, out_ar, each) {
if (isarray(out_ar)) {
for (each in in_ar) {
out_ar[each] = in_ar[each] + 1
}
}
else {
for (each in in_ar) {
in_ar[each]++
}
}
}
BEGIN {
split("1 2 3 4 5", q)
z[1]=1
add_one(q, z)
print z[3]
}
Рекомендую посмотреть эту страницу и эту страницу .
Хорошо, только что понял, что происходит. Оказывается, программа выполняла задачу exec()
в фоновом режиме, а более ранняя команда все еще выполнялась и работала с файлом, когда выполнялась рассматриваемая задача mv
или rm
.
Так вот что происходило:
mv
или rm
, которая удаляла файл как обычно. Поскольку программа была разработана для перезаписи файла, над которым она работала, она не предоставляла никаких разрешений, когда открывала файл для записи, ожидая повторного использования существующих разрешений. Но поскольку файл был удален в середине этого процесса, был создан новый файл со случайным числом, оказавшимся в памяти для неиспользуемого параметра, определяющего права доступа к файлу.
Изменение процесса таким образом, чтобы вторая команда не запускалась до завершения первой, устранило проблему.