我什么时候需要使用$来引用Bash中的变量?

时间:2017-03-30 18:42:48

标签: bash variables

例如,在某些时候,我的代码

var

有时我只是做

upstream() {
    push server_shared_shortname
    ssh $server_shared -t "cd  ~/public_html; git pull -q ~/root.git master"
}

这是一个更具体的例子:

"affiliation": "Example 1, Example 2",

2 个答案:

答案 0 :(得分:5)

$var用于变量扩展:当您希望Bash替换变量的时,可以使用它。所以,例如,这个:

var=foo
echo "$var"

将变量var设置为值foo,然后运行命令echo foo

编辑添加一些内容:

  • $还有一些其他相关用途;例如,$( ... )运行命令...,捕获其输出,并扩展到该输出(减去尾随换行符),$(( ... ))计算算术表达式...并扩展其结果:

    cat $(echo foo)      # equivalent to:  cat foo
    cat $((2+3))         # equivalent to:  cat 5
    
  • 正如codeforester在下面提到的那样,实际上并不需要$来扩展“算术表达式”中的变量(其中所有内容都被解释为数字),例如在{{当变量被声明为整数变量时,1}},(( ... ))$(( ... )),数组索引和变量赋值的右侧。

  • Bash参考手册http://www.gnu.org/software/bash/manual/bashref.html,详细且质量上乘。可能需要一些心理调整才能开始考虑Bash的方式,但是值得恕我直言。

答案 1 :(得分:3)

  • 分配给变量时,执行 使用$前缀;例如var=1

    • 这也适用于变量声明内置declarelocalexport的上下文中的赋值。
  • 引用 变量(其值) 使用$ ;例如,echo "$var"

    • 作为 异常,有算术上下文,您可以在 引用变量没有 $前缀 - 请参阅下文。

      • 请注意,此异常仅适用于其值为/可以解释为整数 的变量(Bash仅支持整数运算)。
    • 如上例所示,您应该通常 双引号 $ - 前缀变量引用(扩展)以防止shell通过其shell expansions对结果值进行不必要的修改,特别是通过空格(分词)将值拆分为多个参数并将值解释为文件名模式(globbing)。 / p>

    • 在以下情况下,必须使用表单${...} (名称/扩展表达式周围的花括号):

      • 消除(可扩展)字符串中的变量名称,其中字符紧跟在Bash可能认为是变量名称的一部分的变量名称之后;例如,echo "${HOME}grown"
      • Parameter expansions 转换扩展值,例如通过前缀和后缀修整,字符串替换或子字符串提取;例如,echo "${HOME%/*}"会产生类似/home的内容,其中最短的后缀(%)匹配模式/*会从$HOME的值中删除;换句话说:删除最后一个路径组件。

算术上下文,其中整数[-interpretable]变量通常需要 no $前缀:

  • 明确的算术上下文

    • $(( ... ))算术扩展 ;符合POSIX标准的功能)
      • echo $(( var ))打印1$var
      • 的值
    • (( ... ))算术表达式 ; Bash扩展名)
      • 使用作为条件(( var )) && echo 'yes'打印yes,因为值1$var的值,在概念上被解释为布尔,(概念上)是真的。
      • 用于将计算结果分配给变量:
        (( sum = var + var )); echo "$sum"打印2 [1]
  • 隐式算术上下文(所有这些都是Bash扩展名)

    • 内部数组索引
      • arr=( one two ); ndx=0; echo "${arr[ndx+1]}"收益two
    • 内部子字符串/数组切片操作(索引和偏移量):
      • str='one'; ndx=0; echo "${str:ndx+1}"收益ne
      • arr=( one two three ); ndx=0; echo "${arr[@]: 0: ndx + 2 }"收益one two
    • [[ ... ]]内部使用算术运算符
      • [[ 1 -eq var ]] && echo 'yes'收益yes
    • 使用declare -ilocal -i 声明的变量的分配,将其标记为整数
      • declare -i sum; sum=var; echo "$sum"收益1
      • declare -i sum=1; sum+=var; echo "$sum"收益2

警告:通常情况下,无论是否使用$前缀在这些上下文中引用变量都无关紧要 - 但存在细微差别;简而言之,在以下情况下仅使用算术上下文中的$前缀

  • 您需要通过参数展开提供的非零默认值 ;例如,如果${var:-2}未设置或为空,则2默认为$var

[1] (( ... ))有一个较旧的等效文件,过时let
(( ... ))是首选,因为它不需要引用,更容易被识别为与
相关 $(( ... ))(以及在视觉上更有特色) 将(( sum = var + var ))let 'sum = var + var'

进行比较