bash变量替换紧挨着另一个字符串
在这个特定的例子中,没有什么区别。然而,在字符串中使用${}
中的{}
对于扩展变量foo
非常有用,例如字符串"${foo}bar"
,而"$foobar"
则会扩展为变量foobar
。
花括号在以下情况下也是必需的:
- 扩展数组元素,例如
${array[42]}
- 使用参数扩展操作,例如
${filename%.*}
(删除扩展名) - 扩展超过9个位置参数:
"$8 $9 ${10} ${11}"
在所有的地方都这样做,而不仅仅是在可能有歧义的情况下,可以被视为良好的编程实践。这是为了保持一致性,并避免像$foo_$bar.jpg
这样的令人意外的情况,其中下划线成为变量名的一部分并不明显。
"所以除了数组之外,实际上并不需要"并不是这样的,花括号对于参数扩展是必需的,在脚本中非常有用。我见过很多可以用一点参数扩展来替代的sed和awk脚本。
${1:-20}
是参数扩展的一种形式。这并不明显,因为它主要使用了数字和算术运算符,让我们误以为涉及到了算术运算,但实际上它是引用了位置参数$1
,如果没有定义,则会被默认值20
替换(语法为${variable:-default_value}
)。
与下划线的例子相反:foo=Hello; echo $foo:
的结果是Hello:
,与${foo}:
相同。
使用花括号处理未设置或空变量的方法,如"-"运算符或":-"运算符,会得到不同的结果,特别是当bash会话设置为默认情况下对空变量报错时,您仍然可以强制容忍它。参见gnu.org/software/bash/manual/html_node/…和stackoverflow.com/questions/14152534/…,例如,一个${a-}序列将优雅地将一个不存在的变量设置为一个空字符串。
在bash中,变量的声明和赋值不需要使用$
和{}
。你只需要使用var=10
来进行赋值。
为了从变量中读取(也就是扩展)变量的值,你必须使用$
。
$var # 使用变量 ${var} # 和上面一样 ${var}bar # 扩展变量var,并且追加"bar" $varbar # 和${varbar}一样,即扩展一个名为varbar的变量(如果它存在的话)。
这个特点有时候会让我感到困惑:在其他编程语言中,无论变量是在赋值的左边还是右边,我们都是以相同的方式引用变量。但是在shell脚本中,情况不同,$var=10
并不会像你想象的那样执行赋值操作!
这个问题的原因是因为在bash中,$var=10
被解释为将变量$var扩展为一个空字符串,然后将该空字符串与"=10"进行拼接。所以实际上,这行代码并不能正确地给变量$var赋值。
解决方法就是在变量赋值的时候,不要使用$
,只需直接写变量名即可。正确的写法是var=10
。
这样,变量$var就被赋值为10了。当你需要使用这个变量时,只需要使用$var
即可。
总结起来,bash中的变量赋值语法与其他编程语言有所不同,需要注意在赋值时不要使用$
。只有在读取变量的值时才需要使用$
。
在这个例子中,出现了
解决这个问题的方法是在变量替换和字符串之间添加空格。这样可以确保shell正确解析变量替换和字符串,并将它们作为单独的实体处理。
在上述例子中,正确的写法是使用"$dir[0]"
而不是"$dir[0]"
。这样可以确保dir[0]
被解析为变量dir
的第一个元素,而不是整个字符串dir[0]
。
另外,关于第一行dir=(*)
的疑问,dir
不是一个内置命令来列出目录内容(相当于ls -C -b
)。在shell编程中,命令和参数必须用空格分开。在这里,等号后面没有空格,意味着这是一个变量赋值。dir
是变量的名称,括号用于将文件名扩展*
收集到数组中。
通过使用其他变量名,比如foo
,可以证明dir
只是一个变量名,没有其他特殊意义。正确的写法是foo=(*); echo "${foo[2]}"
。
在shell编程中,正确使用变量替换和字符串之间的空格是很重要的。这可以确保shell正确解析代码,并按预期执行。