Подтвердить что ты не робот

Разница между ${} и $() в Bash

У меня есть два вопроса, и я могу помочь им понять их.

  • В чем разница между ${} и $()? Я понимаю, что () означает запуск команды в отдельной оболочке и размещение $ означает передачу значение переменной. Может кто-нибудь помочь мне в понимании это? Пожалуйста, поправьте меня, если я ошибаюсь.

  • Если мы сможем использовать /bash$ for ((i=0;i<10;i++)); do echo $i; done, и он отлично работает, то почему я не могу использовать его как /bash$ while ((i=0;i<10;i++)); do echo $i; done? Какая разница в цикле выполнения для обоих?

4b9b3361

Ответ 1

Синтаксис - токен-уровень, поэтому значение знака доллара зависит от его токена. Выражение $(command) является современным синонимом для `command`, который означает замещение процесса; это значит, запустите command и поместите здесь свой вывод. Так

echo "Today is $(date). A fine day."

запустит команду date и включит ее вывод в аргумент echo. Скобки не связаны с синтаксисом для запуска команды в подоболочке, хотя они имеют что-то общее (подстановка команд также выполняется в отдельной подоболочке).

В отличие от этого, ${variable} является всего лишь механизмом устранения неоднозначности, поэтому вы можете сказать ${var}text, когда вы имеете в виду, содержимое переменной var, за которой следует text (в отличие от $vartext, что означает, содержимое переменной vartext).

Цикл while ожидает единственный аргумент, который должен оцениваться как true или false (или фактически несколько, где рассматривается последнее значение истины), благодаря тому, что Джонатан Леффлер указал на это); когда он false, цикл больше не выполняется. Цикл for выполняет итерацию по списку элементов и по очереди привязывает их к переменной цикла; синтаксис, на который вы ссылаетесь, является одним - скорее обобщенным - способом выражения цикла по диапазону арифметических значений.

A for Подобный цикл можно перефразировать как цикл while. Выражение

for ((init; check; step)); do
    body
done

эквивалентно

init
while check; do
    body
    step
done

Имеет смысл держать все элементы управления контуром в одном месте для удобочитаемости; но, как вы можете видеть, когда он выражается так, цикл for выполняется немного больше, чем цикл while.

Конечно, этот синтаксис Bash -специфичен; у классической оболочки Борна есть

for variable in token1 token2 ...; do

(Несколько более элегантно, вы можете избежать echo в первом примере, если вы уверены, что строка вашего аргумента не содержит кодов формата %:

date +'Today is %c. A fine day.'

Избегание процесса, в котором вы можете, важно изучить, хотя это не имеет большого значения в этом изолированном примере.)

Ответ 2

  • $() означает: "сначала оцените это, а затем оцените остальную часть строки".

    Пример:

    echo $(pwd)/myFile.txt
    

    будет интерпретироваться как

    echo /my/path/myFile.txt
    

    С другой стороны, ${} расширяет переменную.

    Пример:

    MY_VAR=toto
    echo ${MY_VAR}/myFile.txt
    

    будет интерпретироваться как

    echo toto/myFile.txt
    
  • Почему я не могу использовать его как bash$ while ((i=0;i<10;i++)); do echo $i; done

    Я боюсь, что ответ только в том, что синтаксис bash для while просто не совпадает с синтаксисом для for.

Ответ 3

  • Ваше понимание правильное. Подробную информацию о {} см. bash ref-parameter expand

  • 'for' и 'while' имеют различный синтаксис и предлагают разные стили управления программным обеспечением для итерации. Большинство не-asm-языков предлагают аналогичный синтаксис.

С того времени вы, вероятно, напишете i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done, по сути, сами обойдетесь обо всем итерации