Что означает переменная подчеркивания с последующим диапазоном в bash: $ _ {0..10} - PullRequest
1 голос
/ 09 ноября 2019

Согласно tldp.org переменная подчеркивания bash:

Переменная подчеркивания устанавливается при запуске оболочки и содержит абсолютное имя файла исполняемой оболочки или скриптакак передано в списке аргументов. Впоследствии после раскрытия он расширяется до последнего аргумента предыдущей команды. Также устанавливается полный путь к каждой выполненной команде и помещается в среду, экспортированную в эту команду. При проверке почты этот параметр содержит имя почтового файла.


Но это ответ на Как мне повторить символ в Bash? странно использует это:

# exactly the same as perl -E 'say "=" x 100'.
echo -e ''$_{1..100}'\b='

Играя с этой переменной, я ничего не могу сделать из ее семантики, поэтому вопрос в том, что делает

  • Строка.
  • С последующим $_.
  • С последующим расширением диапазона.
  • С последующей другой строкой

означает в bash?

Образец:

$ echo $_{0..10}         ; echo $_{0..10} | wc

      1       0       1


$ echo ''$_{0..10}''     ; echo ''$_{0..10}'' | wc

      1       0      11


$ echo ''$_{0..10}'x'    ; echo ''$_{0..10}'x' | wc
x x x x x x x x x x x
      1      11      22


$ echo 'x'$_{0..10}''    ; echo 'x'$_{0..10}'' | wc
x x x x x x x x x x x
      1      11      22


$ echo 'ab'$_{0..10}'cd' ; echo 'ab'$_{0..10}'cd' | wc
abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd
      1      11      55

Ответы [ 2 ]

1 голос
/ 09 ноября 2019
echo $_{0..10}

Скобки расширены до:

echo $_0 $_1 $_2 $_3 $_4 $_5 $_6 $_7 $_8 $_9 $_10

Он печатает значения одиннадцати странных переменных с именами _0, _1, _2,и так далее. Они не установлены - вот почему вы ничего не видите - но если бы они были, вы бы:

$ _0=zero _1=one _2=two _3=three _4=four _5=five _6=six _7=seven _8=eight _9=nine _10=ten
$ echo $_{0..10}
zero one two three four five six seven eight nine ten

$ echo ''$_{0..10}'x'

То же самое, но сейчасесть x после каждого имени переменной. Это не часть имени переменной. Это отдельный, буквальный символ x, как если бы вы написали:

echo ${_0}x ${_1}x ${_2}x ${_3}x ${_4}x ${_5}x ${_6}x ${_7}x ${_8}x ${_9}x ${_10}x

Теперь вывод, когда переменные имеют значения:

$ _0=zero _1=one _2=two _3=three _4=four _5=five _6=six _7=seven _8=eight _9=nine _10=ten
$ echo ''$_{0..10}'x'
zerox onex twox threex fourx fivex sixx sevenx eightx ninex tenx

Это должнодостаточно, чтобы понять другие примеры в вашем вопросе.

Это также показывает, что связанный ответ - плохой способ повторить строку. Это полагается на то, что эти переменные не установлены. Не рекомендуется.

0 голосов
/ 09 ноября 2019

Это расширение скобки.

Чтение

info bash -n "Brace Expansion"

Это расширяет последнюю команду, сохраненную в $_, с указанными числами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...