Что делать

Что делать

Когда я использую !в качестве разделителя полей eg, awk -F!он выдает сообщение об ошибке bash: !: event not found. Почему? Он принимает awk -F"\!". Bash версии 3.2.25

решение1

!является триггерным символом для Bash'аистория расширение. Если это включено, то что-то вроде !fooв командной строке расширяется до последней команды, которая начинается с foo. Или, если такой командной строки нет, оболочка выдает ошибку, как здесь.

Хотя это не должно ничего делать как последний символ слова. Это на самом деле работает так, как вы и предполагали, во всех версиях Bash, которые я пробовал:

$ echo 'aa!bb' | awk -F! '{print $1}' 
aa

В более поздних версиях !также не должно выполняться никаких действий перед закрывающей двойной кавычкой, поэтому -F"!"работает в более поздних версиях, но не в 3.2.

Обратная косая черта или одинарные кавычки будут работать, чтобы избежать этого, т. е. ни то, \!fooни другое не '!foo'будет расширяться. Конечно, вы также можете остановить это, полностью отключив расширение истории, с помощью set +H.

С двойными кавычками все страннее. В них обратная косая черта отключает расширение истории, но сама обратная косая черта остается на месте:

$ printf '%s\n' "\!foo"
\!foo

В данном случае awk -F"\!"это работает, поскольку awk сам удаляет обратную косую черту.

решение2

Это не awkто, что делает это. Это оболочка. !— это специальный символ в оболочке.

Что делать

Всегда цитируйте свои аргументы. Например:

awk -F'!'

Связанный контент