Есть ли способ избежать одиночных кавычек в оболочке?

21670
codeholic

Например я хочу сказать

perl -e 'print '"'"'Hello, world!'"'"', "\n";' 

Есть ли менее неловкий способ сделать это, например, избежать одиночных кавычек?

Да я знаю что могу написать

perl -e 'print q[Hello, world!], "\n"' perl -e 'print "Hello, world!\n"' 

Но этот вопрос касается цитирования в оболочке, а не в Perl.

Я заинтересован, как сделать это в bashи cshв первую очередь.

11

6 ответов на вопрос

9
Chris Johnsen

Деннис указывает на обычные альтернативы в своем ответе (строки с одинарными, двойными, двойными и одинарными кавычками, объединенные с экранированными одинарными кавычками; вы уже упоминали настраиваемые операторы кавычек Perl), но, возможно, это прямой ответ, который вы искали за.

В оболочках типа Bourne (sh, ksh, ash, dash, bash, zsh и т. Д.) Строки в одинарных кавычках полностью буквальны. Это облегчает включение символов, которые в противном случае оболочка обрабатывает специально, без необходимости экранирования, но это означает, что сам символ одинарной кавычки не может быть включен в строки в одинарных кавычках.

Я отказываюсь даже думать о оболочках csh-типа, так как они совершенно сломаны в других отношениях (см. Программирование Csh считается опасным ).

Спасибо. «Это невозможно» - это ответ, который я ожидал :) Хотя я всегда надеялся, что именно здесь документы посвящены этой роли. codeholic 14 лет назад 0
В отличие от Perl, подобная Bourne оболочка, документы здесь непосредственно полезны только для ввода через stdin. Конечно, вы можете поместить в них одинарные кавычки. Вы также можете включить «буквальный режим» документа здесь, заключив в кавычки слово: (например) `blah << \ EOF… EOF`. Вы также можете использовать `<< 'EOF'` и` << "EOF`. Все они означают буквальные здесь документы (в отличие от Perl). Если вы действительно были уверены, вы могли бы сделать` blah "$ (cat << \ EOF… EOF) "other args` (используя переводы строк, где я написал пробел в подстановке команд; ksh и zsh могут обходиться без * cat *, другим это нужно). Но стоит ли это того? Chris Johnsen 14 лет назад 0
Сразу хочу заметить, что одиночные кавычки zsh не совсем буквальны. Zsh будет пытаться интерпретировать '\ U' в любом месте строки в одинарных кавычках как код символа, например, `echo '\ U0000068 \ U000069'` повторяет' hi '. Не уверен, почему, хотя, если это не ошибка в оболочке. Matthew 11 лет назад 0
@Matthew: интерпретация `\ U` в этом случае выполняется встроенной командой * echo * (этим поведением можно управлять с помощью` -E` или опции BSD_ECHO и `-e`). Вы можете видеть, что литеральная строка передается (и не интерпретируется иначе) в других командах; например, `printf% s \\ n '\ U0000068 \ U000069'`. Chris Johnsen 11 лет назад 1
@ChrisJohnsen Спасибо, я новичок в Zsh и не понял этого, но вы правы. Страница man сказала мне -e по умолчанию, но zsh должен переопределить это. Matthew 11 лет назад 0
6
Dennis Williamson

Для меня все ваши примеры дают:

Привет, мир!

И так же это:

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вместо этого.

1
Kaushik B

Не уверен, что мое изменение к предыдущему ответу будет отображаться:

Вставить так же, как новый ответ:

Альтернативный подход:

Когда я попробовал ваше решение, я все еще не смог распечатать.

Но я воспользовался вашим решением и попробовал следующее:

$ perl -e '$foo = chr(39); print "$Hello, world $", "\n";' 'Hello, world ' 

ASCII значение 'составляет 39.

Мне нужно было это сделать встроенное редактирование группы файлов, чтобы добавить их в интересующем месте.

0
Jezz

Here document is the best way to not care about escaping:

$ cat <<EOF my $var = "Hello"; print $text, ', world!', "\n";' EOF 

You may completely inibit all expantion by using quoted here document:

$ cat <<'EOF' my $var = "Hello"; print $text, ', world!', "\n";' EOF 

If you want to pass it as argument instead of input, you can use xargs:

$ xargs -0 <<'EOF' perl -e my $var = "Hello"; print $text, ', world!', "\n";' EOF 
0
SilverWolf

Я не знаю, есть ли возможность сделать это в bash, но с zsh вы можете использовать ''после включения RC_QUOTESопции. (Я бы порекомендовал попробовать zsh; он в основном совместим с bash и может эмулировать bash для еще большей совместимости.)

С bash (и все еще большую часть времени с zsh) я просто использую, '\''потому что его легче читать, чем '"'"'.

Я абсолютно не знаю, как это сделать в csh.

-1
Micah

Вы можете использовать \ 'и \ "для экранирования кавычек с perl, если они используются внутри как часть скрипта perl. Я не уверен, что командная строка примет это, хотя. Вы можете попробовать и посмотреть, работает ли он.

Если бы это было так просто, я бы не спросил. Вы можете попробовать и посмотреть, работает ли он, прежде чем отправлять ответ. codeholic 14 лет назад 3

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