When do we need curly braces around shell variables?

后端 未结 7 1101
春和景丽
春和景丽 2020-11-22 01:39

In shell scripts, when do we use {} when expanding variables?

For example, I have seen the following:

var=10        # Declare variable

         


        
相关标签:
7条回答
  • 2020-11-22 02:01

    You are also able to do some text manipulation inside the braces:

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

    Result:

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

    or

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

    Result:

    This_is_a_string
    

    You are right in "regular variables" are not needed... But it is more helpful for the debugging and to read a script.

    0 讨论(0)
  • 2020-11-22 02:03

    Following SierraX and Peter's suggestion about text manipulation, curly brackets {} are used to pass a variable to a command, for instance:

    Let's say you have a sposi.txt file containing the first line of a well-known Italian novel:

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

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

    Now create two variables:

    # 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"
    

    Now substitute the word variable content with the one of new_word, inside sposi.txt file

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

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

    The word "ramo" has been replaced.

    0 讨论(0)
  • 2020-11-22 02:07

    In this particular example, it makes no difference. However, the {} in ${} are useful if you want to expand the variable foo in the string

    "${foo}bar"
    

    since "$foobar" would instead expand the variable identified by foobar.

    Curly braces are also unconditionally required when:

    • expanding array elements, as in ${array[42]}
    • using parameter expansion operations, as in ${filename%.*} (remove extension)
    • expanding positional parameters beyond 9: "$8 $9 ${10} ${11}"

    Doing this everywhere, instead of just in potentially ambiguous cases, can be considered good programming practice. This is both for consistency and to avoid surprises like $foo_$bar.jpg, where it's not visually obvious that the underscore becomes part of the variable name.

    0 讨论(0)
  • 2020-11-22 02:07

    The end of the variable name is usually signified by a space or newline. But what if we don't want a space or newline after printing the variable value? The curly braces tell the shell interpreter where the end of the variable name is.

    Classic Example 1) - shell variable without trailing whitespace

    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"
    

    Example 2) Java classpath with versioned jars

    # WRONG - no such variable LATESTVERSION_src
    CLASSPATH=hibernate-$LATESTVERSION_src.zip:hibernate_$LATEST_VERSION.jar
    
    # RIGHT
    CLASSPATH=hibernate-${LATESTVERSION}_src.zip:hibernate_$LATEST_VERSION.jar
    

    (Fred's answer already states this but his example is a bit too abstract)

    0 讨论(0)
  • 2020-11-22 02:10

    Variables are declared and assigned without $ and without {}. You have to use

    var=10
    

    to assign. In order to read from the variable (in other words, 'expand' the variable), you must use $.

    $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.
    

    This has confused me sometimes - in other languages we refer to the variable in the same way, regardless of whether it's on the left or right of an assignment. But shell-scripting is different, $var=10 doesn't do what you might think it does!

    0 讨论(0)
  • 2020-11-22 02:10

    You use {} for grouping. The braces are required to dereference array elements. Example:

    dir=(*)           # store the contents of the directory into an array
    echo "${dir[0]}"  # get the first entry.
    echo "$dir[0]"    # incorrect
    
    0 讨论(0)
提交回复
热议问题