Есть ли способ избежать одиночных кавычек в оболочке?
Например я хочу сказать
perl -e 'print '"'"'Hello, world!'"'"', "\n";'
Есть ли менее неловкий способ сделать это, например, избежать одиночных кавычек?
Да я знаю что могу написать
perl -e 'print q[Hello, world!], "\n"'
perl -e 'print "Hello, world!\n"'
Но этот вопрос касается цитирования в оболочке, а не в Perl.
Мне интересно, как это сделать в bash
а также csh
на первом месте.
6 ответов
Деннис указывает на обычные альтернативы в своем ответе (строки с одинарными, двойными, двойными и одинарными кавычками, объединенные с экранированными одинарными кавычками; вы уже упоминали настраиваемые операторы кавычек Perl), но, возможно, это прямой ответ, который вы искали за.
В оболочках типа Bourne (sh, ksh, ash, dash, bash, zsh и т. Д.) Строки в одинарных кавычках полностью буквальны. Это облегчает включение символов, которые в противном случае оболочка обрабатывает специально, без необходимости экранирования, но это означает, что сам символ одинарных кавычек не может быть включен в строки в одинарных кавычках.
Я отказываюсь даже думать о оболочках csh-типа, так как они совершенно сломаны в других отношениях (см. Программирование Csh считается опасным).
Для меня все ваши примеры дают:
Привет, мир!
И так же это:
perl -e 'print "Hello, world!", "\n";'
И это:
perl -e 'print '\''Hello, world!'\'', "\n";'
Можете ли вы уточнить, что вы пытаетесь сделать?
В оболочке, такой как Bash, если вы хотите печатать кавычки как часть строки, один тип кавычек избегает другого.
$ echo '"Hello, world!"'
"Hello, world!"
$ echo "'Hello, world!'"
'Hello, world!'
Редактировать:
Вот еще один способ:
$ perl -e 'print "\047Hello, world!\047", "\n";'
'Hello, world!'
$ echo -e "\047Hello, world! \047"
'Hello, world! '
Пробел после восклицательного знака позволяет избежать ошибки расширения истории. Я мог бы сделать set +H
вместо.
Здесь документ - лучший способ не заботиться о побеге:
$ cat <<EOF
my $var = "Hello";
print $text, ', world!', "\n";'
EOF
Вы можете полностью заблокировать все расширения, используя приведенный здесь документ:
$ cat <<'EOF'
my $var = "Hello";
print $text, ', world!', "\n";'
EOF
Если вы хотите передать его в качестве аргумента вместо ввода, вы можете использовать xargs:
$ xargs -0 <<'EOF' perl -e
my $var = "Hello";
print $text, ', world!', "\n";'
EOF
Не уверен, что мое изменение к предыдущему ответу будет отображаться:
Вставить так же, как новый ответ:
Альтернативный подход:
Когда я попробовал ваше решение, я все еще не смог распечатать.
Но я воспользовался вашим решением и попробовал следующее:
$ perl -e '$foo = chr(39); print "${foo}Hello, world ${foo}", "\n";'
'Hello, world '
Значение ASCII 'составляет 39.
Мне нужно было это сделать встроенное редактирование группы файлов, чтобы добавить их в интересующем месте.
Я не знаю, есть ли возможность сделать это в Bash, но с Zsh вы можете использовать ''
после включения RC_QUOTES
вариант. (Я бы рекомендовал попробовать zsh; он в основном совместим с bash и может эмулировать bash для еще большей совместимости.)
С Bash (и до сих пор большую часть времени с Zsh), я просто использую '\''
потому что это легче читать, чем '"'"'
,
Я понятия не имею, как это сделать в csh.
Вы можете использовать \'и \"для экранирования кавычек с perl, если они используются внутри как часть скрипта perl. Я не уверен, что командная строка примет это, хотя. Вы можете попробовать и посмотреть, работает ли он.