Когда нам нужны фигурные скобки вокруг переменных оболочки?


в скриптах оболочки, когда мы используем {} при увеличении переменных?

например, я видел следующее:

var=10        # Declare variable

echo "${var}" # One use of the variable
echo "$var"   # Another use of the variable

есть ли существенная разница, или это просто стиль? Один предпочтительнее другого?

6 474

6 ответов:

в данном конкретном примере это не имеет никакого значения. Тем не менее,{} in ${} полезны, если вы хотите расширить переменной foo в строке

"${foo}bar"

С "$foobar" вместо этого разверните foobar.

фигурные скобки также безусловно необходим при:

  • расширение элементов массива, как в ${array[42]}
  • использование операций расширения параметров, как в ${filename%.*} (снять расширение)
  • расширение позиционных параметров за пределы 9:" "

делаю это везде, а не только в потенциально неоднозначных случаях, можно считать хорошей практикой программирования. Это как для согласованности, так и для того, чтобы избежать сюрпризов, таких как $foo_$bar.jpg, где визуально не очевидно, что подчеркивание становится частью имени переменной.

переменные объявляются и назначаются без $ и без {}. Вы должны использовать

var=10

присвоить. Чтобы прочитать из переменной (другими словами, "развернуть" переменную), вы должны использовать $.

$var      # use the variable
${var}    # same as above
${var}bar # expand var, and append "bar" too
$varbar   # same as ${varbar}, i.e expand a variable called varbar, if it exists.

это иногда смущало меня - в других языках мы ссылаемся на переменную таким же образом, независимо от того, слева или справа от задания. Но shell-скриптинг отличается,$var=10 не делает то, что вы могли бы думаю, что да!

вы используете {} для группировки. Фигурные скобки необходимы для разыменования элементов массива. Пример:

dir=(*)           # store the contents of the directory into an array
echo "${dir[0]}"  # get the first entry.
echo "$dir[0]"    # incorrect

вы также можете сделать некоторые текстовые манипуляции внутри фигурных скобок:

STRING="./folder/subfolder/file.txt"
echo ${STRING} ${STRING%/*/*}

результат:

./folder/subfolder/file.txt ./folder

или

STRING="This is a string"
echo ${STRING// /_}

результат:

This_is_a_string

вы правы в "регулярных переменных" не нужны... Но это более полезно для отладки и чтения сценария.

конец имени переменной обычно обозначается пробелом или новой строкой. Но что делать, если мы не хотим пробел или новую строку после печати значения переменной? Фигурные скобки указывают интерпретатору оболочки, где находится конец имени переменной.

классический пример 1) - переменная оболочки без пробела

TIME=10

# WRONG: no such variable called 'TIMEsecs'
echo "Time taken = $TIMEsecs"

# What we want is $TIME followed by "secs" with no whitespace between the two.
echo "Time taken = ${TIME}secs"

Пример 2)

# WRONG
CLASSPATH=hibernate-$LATESTVERSION_src.zip:hibernate_$LATEST_VERSION.jar

(ответ Фреда уже утверждает это, но его пример слишком абстрактен)

следуя предложению SierraX и Питера о текстовых манипуляциях, фигурные скобки {} используются передать переменную в команды, например:

Допустим, у вас есть sposi.txt файл, содержащий первую строку итальянского известного романа:

> sposi="somewhere/myfolder/sposi.txt"
> cat $sposi

Ouput:quel ramo del lago di como che volge a mezzogiorno

Теперь создайте две переменные:

# Search the 2nd word found in the file that "sposi" variable points to
> word=$(cat $sposi | cut -d " " -f 2)

# This variable will replace the word
> new_word="filone"

теперь заменить слово переменной с одним из new_word, внутри г..текстовый файл

> sed -i "s/${word}/${new_word}/g" $sposi
> cat $sposi

Ouput:quel filone del lago di como che volge a mezzogiorno

слово" Рамо " было заменено.