Різниця між $ '$ foo' і $ "$ foo"


9

У мене виникають труднощі з'ясувати деякі нюанси між одинарними та подвійними цитатами у змінному контексті

Я визначаю:

foo=pwd

потім запустіть ці:

echo $'$foo'

Яке відлуння $foo(тобто перше $в моїй команді ехо випало)

echo $"$foo"

Це відлуння pwd(це означає, що баш розширює $fooмою змінну до його значення)

echo $`$foo`

Нарешті це лунає $~/scripts(я очікував, що він надрукує, ~/scriptsа не $~/scripts)

може хтось допоможе мені з'ясувати ці відмінності?

Відповіді:


11

Зрештою, остання друкується $~/scriptsчерез те $`foo`, що це комбінація буквалу з $подальшим підстановкою команд; тому ведучий $трактується як буквальний, $а трейлінг - `$foo`як заміна команд.


Я видалив кодові теги та замінив просто символи `` `` `` `` тощо. Не соромтесь відкатати, якщо ви віддаєте перевагу кодові теги
Тім

@Tim Дякую, не впевнений, що я точно зробив, але чомусь після того, як ви відредагували, публікація виявилася такою ж розбитою, як і в моїй першій редакції, тому я повернув її назад ... І тепер я бачу, що це виглядає нормально в редакції. Не впевнений, що сталося, я перевіряю це у пісочниці форматування перед тим, як повернутись до вашої версії, оскільки я боюся, що я можу порушити цю публікацію знову. Незалежно, дякую за старання.
kos

звичайно, жодних питань. Шахта використовує пробіли нульової ширини, тому будьте обережні під час редагування.
Тім

2

Перший випадок:

echo $'$foo'

Яке відлуння $foo(тобто перше $в моїй команді ехо випало)

Перший $запускається як команда. Ехо не потребує пробілів між аргументами, воно просто займає їх.

Таким чином, echo $'$foo'розширюється для запуску команди $(яка не є командою, тому вона ігнорує), а потім echo '$foo'. Все '', що приймається, береться за номінал - він не розширює його чи нічого. Ви можете покласти те, що вам хочеться, і нічого не вийде.

Якщо замінити $з $$ним вторить ідентифікатор процесу.


Друге:

echo $"$foo"

Це відлуння pwd(це означає, що баш розширює $fooмою змінну до його значення)

Це тому, ""що не запобігає його розширенню. ""зазвичай використовується для того, щоб переконатися, що є значення для порівняння.

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


Нарешті, номер 3. Це цікаво.

echo $`$foo`

Це відлуння $~/scripts(я очікував, що він надрукує, ~/scriptsа не $~/scripts)

Це тому, що (в даному випадку) ехо $спочатку друкує персонажа. Якщо щось вставити в беккетки, це призводить до того, що значення змінної запускається як команда (кращий спосіб зробити це в останніх версіях bash $(command))

Тож спочатку воно відлунюється, $потім воно розширюється, ​`$foo`​до ​`pwd`​якого запускається і повертається ~/Scripts. Але ми мали $друк раніше - тому весь вихід є $~/Scripts.


Приємна робота над дуже складним форматуванням!
Arronical

1
@Arronical Спасибі :) Ви цього не можете бачити, але в останньому реченні є пробіли нульової ширини. Те, що я роблю для уявних точок інтернету ...!
Тім

1
+1 Хороша відповідь. Я просто додам, що цитування змінних повинно бути типовим, якщо у вас немає конкретної причини - не просто обробляти можливі нульові значення. Дивіться unix.stackexchange.com/questions/171346/… більше, ніж ви коли-небудь хотіли знати про це. ;)
Джо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.