Чи є спосіб уникнути одноцитат в оболонці?


11

E. g. я хочу сказати

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

Чи є менш незручний спосіб це зробити, наприклад, уникнути одинарних цитат?

Так, я знаю, що вмію писати

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

Але це питання стосується цитування в оболонці, а не в Perl.

Я зацікавлений , як зробити це в bashі cshв першу чергу.

Відповіді:


9

Денніс вказує на звичайні альтернативи у своїй відповіді (один-у-подвійний, подвійний-в-одиночному, одноцитувані рядки, поєднані з уникнутими цитатами; ви вже згадали про налаштовані операторами котирування Перла), але, можливо, це пряма відповідь, яку ви шукали для.

У Борн-подібних оболонках (ш, кш, попел, тире, баш, зш тощо) окремі цитовані рядки є абсолютно буквальними. Це полегшує включення символів, до яких оболонка в іншому випадку поводитиметься спеціально, не уникаючи їх, але це означає, що сам символ цитати сам не може бути включений до рядків, що цитуються окремо.

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


Дякую. "Це неможливо" - це відповідь, яку я очікував :) Хоча я завжди сподівався, що саме тут документи присвячені відігравати цю роль.
кодеголік

На відміну від Perl, оболонка, подібна до Борна, тут документи корисні лише для введення даних через stdin. Ви, звичайно, можете ставити в них поодинокі цитати. Ви також можете включити "буквальний режим" документа тут, цитуючи слово: (наприклад) blah <<\EOF … EOF. Ви також можете використовувати <<'EOF'і <<"EOF. Всі вони означають тут буквальні документи (на відміну від Perl). Якщо ви насправді визначилися, ви могли б зробити це blah "$(cat<<\EOF … EOF )" other args(використовуючи нові рядки, де я записав пробіли в підстановці команд; ksh і zsh можуть обійтися без кота , іншим це потрібно). Але чи справді це варто було б?
Кріс Джонсен

Хочеться лише зазначити, що одиночні цитати zsh не зовсім буквальні. Zsh спробує інтерпретувати "\ U" в будь-якому місці в одній котируваній рядку як код символу, наприклад echo '\U0000068\U000069'відлуння "привіт". Не впевнений, чому хоч, якщо не помилка в оболонці.
Метью

1
@Matthew: Інтерпретація \Uцього випадку виконується за допомогою вбудованої команди echo (цю поведінку можна контролювати за -Eдопомогою параметра BSD_ECHO та -e). Ви можете бачити, що буквальний рядок передається (а іншим чином не інтерпретується) в інших командах; напр printf %s\\n '\U0000068\U000069'.
Кріс Джонсен

@ChrisJohnsen Спасибі, я новачок у zsh і не усвідомлював цього, але ти маєш рацію. Сторінка man сказала мені -e за замовчуванням, але zsh має це перекрити.
Метью

5

Для мене всі ваші приклади створюють:

Привіт Світ!

І так це робить:

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

Не впевнений, чи з’явиться моя редакція попередньої відповіді:

Вставте те саме, що і нову відповідь:

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

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

Але я взяв відповідь на ваше рішення і спробував таке:

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

ASCII значення 'дорівнює 39.

Мені знадобилося це, щоб зробити вбудовану редагування, щоб купувати файли, щоб додати "в цікавому місці.


1

Ось документ найкращий спосіб не турбуватися про втечу:

$ 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

0

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

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

Я абсолютно не маю уявлення, як це зробити в csh.


-1

Ви можете використовувати \ 'і \ ", щоб уникнути лапок з perl, якщо вони використовуються внутрішньо як частина сценарію perl. Я не впевнений, чи не прийме це командний рядок. Ви можете спробувати його і побачити, чи працює він.


3
Якби це було так просто, я б не питав. Ви можете спробувати і перевірити, чи працює він, перш ніж публікувати відповідь.
кодеголік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.