变量

变量 属于 Bash

{other: "%{count} 个练习"}

关于 变量

变量

_变量_是存放数据的地方。 Bash 有两种数据:字符串和数组。 数组我们稍后再讲。

像这样给变量赋值

name="value"
Note

重要:等号两边_不能有空格_!

如果有空格,就像这个例子:

x = 10

bash 会调用命令x,并传入两个实参=和10!

变量也可以称为_参数_。 本文档中这两个术语可以互换使用。

bash 使用或设置的一些重要参数包括:

  • PATH:一个以冒号分隔的目录列表,用于查找外部命令。
  • IFS:即“内部字段分隔符”。 下面我们会看到它的用法。
  • PWD:你当前的工作目录。 它的值与pwd命令的输出相同。
  • RANDOM:一个介于 0 和 32767 之间的伪随机整数。
  • BASH_VERSION:正在运行的 bash 实例的版本字符串。

变量名

变量名由_大写字母、小写字母、数字和下划线_组成。 不能以数字开头。

Caution

最好避免使用全大写变量名。 shell 用这种约定来表示它的参数,而你不会想意外覆盖具有特殊含义的 shell 参数。 例如:1、2、3

参数扩展

使用$varname语法可以获取参数的值。

x=10
echo "The value of x is $x"

为了防止变量名与周围文本混淆,可以用花括号把变量名括起来。 例如,要打印字符串10x10

echo "${x}x$x"
# or
echo "${x}x${x}"

一些风格指南建议在大多数情况下使用花括号,以提高可读性或保持一致性。

位置参数

正如我们在命令和实参一课中讨论的,命令可以接受实参。 Bash 脚本也不例外。 当前 bash 实例的实参称为_位置参数_。 可以用这些特殊参数来获取:

  • $1:第一个位置参数
  • $2 ... $9:后续参数
  • ${10} ...:两位数需要加花括号。
  • $0:当前脚本的名称。

shell 函数的实参也是位置参数,处理方式完全相同。 后面的课程中我们会进一步了解函数。

特殊位置参数

有一些_特殊参数_可以帮助你处理位置参数。

  • $#会展开为位置参数的_数量_。
  • "$@"会展开为所有位置参数的列表,每个参数都是一个单独的单词。
  • "$*"会展开为单个字符串,其中所有位置参数由一个字符连接在一起。
    • 连接字符是$IFS变量的_第一个字符_,默认是空格。

"$@"是把位置参数传给另一个命令的最安全方式,同时能保持它们被安全引用。 你也会用它来遍历位置参数:

for arg in "$@"; do
    do_something_with "$arg"
done

实践中,"$@"比"$*"更常用。

命令替换

在 bash 脚本中经常要做的一个操作是捕获命令的输出并存入变量。 为此,你会用到_命令替换_。

var=$(command)

例如,要把字符串转换成大写,可以这样做:

text="Hello world!"
uppercase=$(echo "$text" | tr '[:lower:]' '[:upper:]')
echo "$uppercase"
# => HELLO WORLD!

更多参数扩展

Bash 有很多内置功能来操作变量和字符串,这样你就不需要调用外部命令。

  • 将文本转换为大写。 上一节我展示了如何使用tr把文本转换为大写。 在 bash 中这样做:

    echo "${text^^}"
    

    类似地,${text,,}会把值转换为小写。

  • 如果变量为空,提供一个默认值。

    default="nothing here"
    result=""
    echo "${result:-$default}"
    # => nothing here
    
  • 搜索并替换。

    text="Hello world!"
    echo "${text//[aeiou]/X}"
    # => HXllX wXrld!"
    

还有很多其他有趣的参数扩展:提取子字符串、获取字符串长度、_赋值_默认值、从值的开头或结尾删除文本,等等。 可以在手册中了解它们。

通过 GitHub 编辑 该链接会在新窗口或标签页中打开