Когда нам нужны фигурные скобки вокруг переменных оболочки?
в скриптах оболочки, когда мы используем {}
при увеличении переменных?
например, я видел следующее:
var=10 # Declare variable
echo "${var}" # One use of the variable
echo "$var" # Another use of the variable
есть ли существенная разница, или это просто стиль? Один предпочтительнее другого?
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
слово" Рамо " было заменено.