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


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.