Сценарий bash работает, но выдает ошибки: «[: слишком много аргументов» и «8197: команда не найдена» [дубликат]

Попробуйте это, где находится текстовый файл:

awk -- '{for (i = 1; i <= NF; i++) wc[$i] += 1}; END {for (w in wc) print w, wc[w]}' <file> | sort

Изменить: Извините, я сделал это в спешке и не объяснил. По умолчанию awk разбивает каждую строку ввода на пробелы, создавая поля $ 1, $ 2, ..., вплоть до NF, что обеспечивает подсчет количества полей ввода. Он также неявно перебирает все входные строки. Тег END дает блок кода, который должен быть выполнен после обработки всех строк. Переменные не объявляются, и квадратные скобки используются для ссылки на ассоциативные массивы.

Эта awk-программа берет каждое слово из каждой строки, использует это слово в качестве индекса в wc [] и добавляет к счетчику (который обрабатывается как ноль, если еще не определен). Таким образом, цикл for и неявный внешний цикл по всем строкам подсчитывают все уникальные слова (пунктуация приведет к тому, что оно будет считаться другим словом, но при желании это легко исправить). Блок END затем распечатывает все слова и их количество.

Я использовал конвейер для сортировки, чтобы упорядочить слова, вместо того, чтобы усложнять awk-программу. Я также просто удалил «-u», который у меня был ранее, так как каждая строка будет уникальной.

1
30.05.2017, 19:51
2 ответа

Чтобы избавиться от ошибки [: слишком много аргументов, я предлагаю заключить любую переменную в этой строке в двойные кавычки, заставив ее быть ограниченной одной строкой. .

Строка 39:

export pid=$PIDFILE

попробуйте изменить ее на:

export pid="$PIDFILE"
0
27.01.2020, 23:24
export kibana_exec="nohup /data/kibana-main/bin/kibana > /data/logs/kibana/kibana.log 2>&1 "
if [ ! -f $kibana_exec ]; then

Это похоже на то, что приведет к ошибке [: слишком много аргументов: $kibana_exec расширяется до нескольких слов (пять, в заданном значении выше), которые не образуют осмысленного теста, поэтому [ выдает ошибку. Это не имеет особого смысла даже с [ ! -f "$kibana_exec" , поскольку значение в переменной также не похоже на имя файла. Кроме того, если вы хотите использовать подстановку команд для запуска программы и захвата того, что она напечатает, вы должны использовать kibana_exec=$(command ...), но здесь это тоже не сработает, так как вы перенаправляете весь вывод в лог-файл.

Однако я не могу сопоставить номер строки (39) в сообщении об ошибке со сценарием. Насколько я могу судить, строка 39 — это export pid=$PIDFILE, который, похоже, не должен выдавать ошибку.

Я не совсем уверен, что вы пытаетесь здесь сделать, должен ли kibana_exec содержать только имя исполняемого файла (/data/kibana-main/bin/kibana)? И если это так, возможно, вам следует использовать [-x "$kibana_exec"].


В функции stop() kibana_exec выглядит неустановленным, поэтому [ ! -f $kibana_exec ] будет просто [ ! -f ] проверяет, пусто ли -f. Это не так, поэтому условная часть никогда не выполняется.

export PIDFILE="`(ps -eaf | grep kibana | awk '{print $2}')`"
export pid=$PIDFILE

Здесь grep, вероятно, соответствует нескольким строкам в выводе ps, а именно kibana и самому grep, поэтому окончательный вывод имеет два PID в две строки. Для них устанавливается pid, и когда вы запускаете su -c "... $pid", оболочка, запущенная su, видит две строки с второй только со вторым PID. Он пытается запустить это как команду, но не находит, и вы получаете что-то вроде 8197: команда не найдена. строка 1, упомянутая в сообщении об ошибке, очевидно, не является первой строкой полного скрипта, так что это также работает как подсказка, что она из другой оболочки, созданной внутри скрипта.

Что-то вроде pid=$(pgrep kibana) может быть лучше (pgrep не будет соответствовать самому себе) или pid=$(pgrep -d' ' kibana ), чтобы разделить пространство PID, на случай, если их больше одного (так что su -c "kill $pid" убьет их всех).

3
27.01.2020, 23:24

Теги

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