Разница между использованием двойных кавычек, одинарных кавычек или отсутствием кавычек с grep

sudo tee -a /etc/ansible/hosts <myfile.txt >/dev/null

Или, если вы хотите использоватьcat:

cat myfile.txt | sudo tee -a /etc/ansible/hosts >/dev/null

Любой из них должен работать. Непонятно, как вы «добавили» /dev/nullпри попытке, но это перенаправляет стандартный вывод teeна /dev/null.

0
09.02.2020, 19:06
2 ответа

На самом деле вы привели плохой пример с \и поместили ^вне кавычек.

Поведение кавычек (или их отсутствие )определяется оболочкой, которую вы используете (Я предполагаю bash), а не grep. По общему правилу:

"  double quotes      Shell variables between the quotes are expanded
'  single quote       Shell variables do not get expanded
   no quotes          you can only use a single word, unless you escape the spaces.

Итак, имейте в виду, что оболочка сначала делает некоторую интерпретацию, а затем передает аргументы в grep.

Теперь несколько примеров:

cat >afile <<EOF
a
aa
aaa
EOF
cat > abfile <<EOF
a
b
ab
aba
EOF
avar=a

Мы создаем два файла afileи abfileи переменную оболочки avar.

grep 'a' afileдаст:

a
aa
aaa

grep "a" afileдаст:

a
aa
aaa

(то же ). grep "$avar" afileрасширит переменную avarдо a, поэтому результат будет

a
aa
aaa

Однако grep '$avar' afileне расширяет переменную avar, и поэтому результатом является:

(пустой)

Абфайл создан для примера без кавычек. Теперь вы должны понять, почему:

avar='a abfile'
grep $avar

дает:

a
ab
aba

Конечно, если вы хотите найти одинарные кавычки, вы должны grep "'"и наоборот -.

1
28.04.2021, 23:23

Любое «слово» оболочки, состоящее из строк в кавычках, соединенных вместе, по-прежнему является одним аргументом. Таким образом, вы можете составлять аргументы из частей с разными правилами.

Paul--) Q='One Two'
Paul--) J=A'${Q}'B"${Q}"C
Paul--) echo ::"${J}"::
::A${Q}BOne TwoC::
Paul--) echo ::${J}{Foo,Bar}::
::A${Q}BOne TwoCFoo:: ::A${Q}BOne TwoCBar::
Paul--) echo ::"${J}{Foo,Bar}"::
::A${Q}BOne TwoC{Foo,Bar}::
0
28.04.2021, 23:23

Теги

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