bash变量替换紧挨着另一个字符串

10 浏览
0 Comments

bash变量替换紧挨着另一个字符串

在shell脚本中,展开变量时何时使用{}

例如,我见过以下用法:

var=10        # 声明变量
echo "${var}" # 变量的一种用法
echo "$var"   # 变量的另一种用法

这两种用法是否有重大区别,还是只是风格不同?有一种比另一种更受欢迎吗?

0
0 Comments

在这个特定的例子中,没有什么区别。然而,在字符串中使用${}中的{}对于扩展变量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-}序列将优雅地将一个不存在的变量设置为一个空字符串。

0
0 Comments

在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中的变量赋值语法与其他编程语言有所不同,需要注意在赋值时不要使用$。只有在读取变量的值时才需要使用$

0
0 Comments

在这个例子中,出现了的问题。问题的原因是在变量替换和字符串之间没有使用适当的空格。

解决这个问题的方法是在变量替换和字符串之间添加空格。这样可以确保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正确解析代码,并按预期执行。

0