for f in *; do [ ! -w "$f" ] || rm -- "$f"; done
Или с &&
вместо ||
:
[ -w "$f" ] && rm -- "$f"
(Я предпочитаю ||
, поскольку я использую set -e
a много и голое, неудачное предложение &&
вызовет выход в этом режиме)
Если посмотреть на исходный код glibc , макрос, который пытается сопоставить строки вроде domain
и nameserver
, -
#define MATCH(line, name) \
(!strncmp(line, name, sizeof(name) - 1) && \
(line[sizeof(name) - 1] == ' ' || \
line[sizeof(name) - 1] == '\t'))
и строка, которая соответствует ключевое слово search
выглядит так:
if (MATCH(buf, "search")) {
strncmp ()
чувствительно к регистру, поэтому эта строка будет соответствовать только строчным поиску
(за которым следует либо пробел, либо вкладку). То же самое и с другими ключевыми словами.
Код синтаксического анализа игнорирует несовпадающие строки, поэтому вы не увидите ошибки, если случайно используете SEARCH
вместо search
: строка будет просто проигнорирована.