shell脚本变量及使用
1、变量类型
1.1 自定义变量
- 定义变量: my_var=“Hello, world!”
- 引用变量: echo $my_var
- 只读变量: readonly my_var
- 删除变量: unset my_var
使用花括号: 使用花括号 {} 可以帮助区分变量的边界,特别是在变量名后面有其他字符的情况下。
my_var="world"echo “Hello, ${my_var}!”
1.2 特殊变量
特殊变量 | 含义 |
---|---|
$0 | 脚本的文件名 |
$1, $2, … | 脚本的第n个参数 |
$# | 脚本参数的个数 |
$? | 最后一个命令的退出状态码 |
$$ | 当前 Shell 进程的 PID |
$USER | 当前用户的用户名 |
$HOME | 当前用户的主目录 |
$* | 获取所有参数,并将每个参数作为单独字符返回 |
$@ | 将所有参数包括空白符一起作为一个字符返回 |
1.3 环境变量
环境变量是全局可用的变量,用于存储与当前 Shell 会话相关的信息。
定义变量:export PATH=“/bin:/usr/bin:/usr/local/bin”
2、read从键盘读入变量值
2.1 read 命令
语法:read [-options] [variable_name]
read 命令常用的选项:
常用选项 | 含义 |
---|---|
-p prompt | 显示提示符,提示用户输入 |
-a array | 将输入的数据按照空格分割存储到数组中。 |
-d delimiter | 指定输入的结束符。 |
-r | 取消对反斜杠的特殊处理(默认情况下,反斜杠用于转义特殊字符)。 |
-n num_chars | 指定读取的字符数。 |
-s | 静默模式,用户输入不会显示在屏幕上。 |
-t timeout | 设置超时时间,在超时后 read 命令会自动退出。 |
2.2 用法介绍
- 基本用法
#!/bin/bash
echo "Please enter your name:"
read name
echo "Hello, $name! Welcome to our website."
运行该脚本时,输出如下:
Please enter your name:
Alice
Hello, Alice! Welcome to our website.
- 存储到数组中
read -a numbers
这会等待用户输入一组数字,每个数字以空格分隔,并将它们存储到 numbers 数组中。
- 指定分隔符
IFS="," read -ra names
使用逗号作为分隔符,等待用户输入一组名称,每个名称以逗号分隔,并将它们存储到 names 数组中。
- 超时处理
if read -t 10 -p "Enter your choice: " choice; then
echo "You entered: $choice"else
echo "Timed out!"fi
等待用户输入,并在 10 秒内输入完成后存储到 choice 变量中。如果超过了超时时间,则显示 “Timed out!”。
3、双引号,单引号,反单引号
3.1 双引号(")
-
双引号用来创建包含变量和特殊字符(如空格、*、?、$等)的字符串。
-
在双引号中,变量会被解析并替换为其对应的值,而不是直接作为字符串输出。
-
特殊字符(如 $、*、?、\ 等)在双引号中会被解释为其特殊含义,而不是字面量。
-
双引号中的反斜杠(\)用来转义特殊字符,使其失去特殊含义。
3.2 单引号(')
- 单引号用来创建纯文本字符串,其中的内容会被原样输出,不会进行变量替换和特殊字符解释。
- 在单引号中,一切内容都被视为普通字符,没有特殊含义。
- 单引号字符串内部不能使用单引号,但可以使用双引号、反斜杠等。
比较双引号和单引号的区别:
var="world"echo "Hello, $var!" # 输出:Hello, world!
echo 'Hello, $var!' # 输出:Hello, $var!
3.3 单反引号(``)
- 在 Shell 脚本中用于执行命令,并将命令的输出结果作为字符串返回。
- 单反引号的作用类似于 $()` 语法。
例如,假设有一个命令 date 用于获取当前日期和时间,可以将其输出结果赋值给变量 current_date:
current_date=`date`
echo "Current date and time: $current_date"
或者使用 $() 语法:
current_date=$(date)
echo "Current date and time: $current_date"
这将输出当前的日期和时间。
需要注意的是,在较新版本的 Bash 中,建议使用 $() 语法而不是单反引号,因为 $() 语法更加清晰易读,并且可以嵌套使用,而单反引号不支持嵌套。
4、变量的运算
4.1 整数运算
- 使用 $((…)) 进行算术运算
# 定义两个整数变量
a=10
b=5
# 加法sum=$((a + b))
# 减法
difference=$((a - b))
# 乘法
product=$((a * b))
# 除法
quotient=$((a / b))
# 求余数
remainder=$((a % b))
- 使用 expr 进行算术运算
# 加法sum=$(expr $a + $b)
# 减法
difference=$(expr $a - $b)
# 乘法
product=$(expr $a \* $b) # 乘法符号需要转义
# 除法
quotient=$(expr $a / $b)
# 求余数
remainder=$(expr $a % $b)
- 使用 let 进行算术运算
# 加法let "sum = a + b"
# 减法let "difference = a - b"
# 乘法let "product = a * b"
# 除法let "quotient = a / b"
# 求余数let "remainder = a % b"
4.2 小数运算
- 使用 bc 命令:
bc 是一种用于数学计算的命令行工具,在大多数 Linux 和 Unix 系统中都是默认安装的。它支持高精度的小数运算,可以用于 Shell 脚本中进行小数运算。
例如,计算两个小数的加法:
result=$(echo "3.14 + 2.78" | bc)
echo "Result is: $result"
- 使用其他编程语言或工具:
如果需要更复杂或高级的小数运算,可以考虑使用其他编程语言,如 Python、Perl 或 awk 等,这些语言都提供了更强大的数学计算能力。
例如,使用 Python 计算两个小数的乘法:
result=$(python -c "print(3.14 * 2.78)")
echo "Result is: $result"
5、shell变量配置文件
5.1 常用变量配置文件
-
/etc/profile
全局设置,针对所有用户生效
/etc/profile 是系统级别的 Bash Shell 配置文件,用于设置全局的环境变量和执行系统范围内的初始化工作。当用户登录时,首先会执行该文件。它通常包含系统范围的环境变量设置和全局的 Shell 配置。在 /etc/profile 中,可以定义系统范围内的环境变量,这些变量对系统中的所有用户和进程都是全局可见的。此外,还可以在这个文件中执行一些初始化工作,如设置全局的命令别名、导出函数、配置系统范围的默认环境等。
一般情况下,/etc/profile 文件是系统管理员用来配置系统范围内的默认环境的地方。它对于所有用户都起作用,但用户也可以在自己的用户级别配置文件中覆盖或补充这些设置。当用户登录(login)时,文件会被执行,并从/etc/profile.d目录的配置文件中查找shell设置
在编辑 /etc/profile 文件时,请谨慎操作,因为它会影响到整个系统的运行环境。任何不正确的更改都可能导致系统功能异常或不稳定。
-
/etc/bashrc:
系统级别的配置文件,用于设置全局的 Bash Shell 配置。
与 /etc/profile 文件类似,但更专注于 Bash Shell 的配置。该文件通常包含一些 Bash Shell 的全局配置,如命令别名、提示符等。
-
~/.profile
用户级别的 Bash Shell 配置文件,用于个人用户的环境变量设置和其他初始化工作。它位于用户的主目录(通常是 /home/username)下,是用户登录时 Bash Shell 默认加载的文件之一。
在 ~/.profile 文件中,用户可以定义个性化的环境变量和执行个人用户级别的初始化工作。这些设置和操作会在用户登录时自动执行,因此可以确保用户每次登录时都会获得相同的环境和配置。
通常情况下,~/.profile 文件用于设置个人用户的环境变量,如 PATH、JAVA_HOME 等,以及执行其他个性化的初始化工作,如设置命令别名、定义个人函数等。用户可以根据自己的需求自定义这个文件,以满足自己的个性化配置需求。
需要注意的是,~/.profile 文件仅在用户登录时才会被加载,而不会在每次启动新的交互式 Bash Shell 时加载。因此,如果需要在每次启动新的交互式 Bash Shell 时都执行一些操作,可以考虑使用 ~/.bashrc 文件。
-
~/.bash_login
用户级别的配置文件,用于个人用户的 Bash Shell 配置。当用户使用登录 Shell 登录时,会加载该文件。不是所有 Linux 系统都默认使用此文件。
-
~/.bash_profile
同样是用户级别的配置文件,用于个人用户的 Bash Shell 配置。与 ~/.bash_login 功能类似,但在某些系统中可能会更常见。在用户登录时加载。
-
~/.bashrc
用户级别的配置文件,用于个人用户的 Bash Shell 配置。在每次启动新的交互式 Bash Shell 时加载。通常包含个性化的 Bash Shell 配置,如命令别名、提示符等。
-
~/.bash_logout
用户级别的配置文件,用于个人用户的 Bash Shell 配置。在用户退出登录时执行。通常用于清理临时文件或执行其他清理工作。
5.2 配置文件执行顺序
- 系统级别的配置文件
/etc/profile:系统级别的 Bash Shell 配置文件,在用户登录时执行。
/etc/bashrc:系统级别的 Bash Shell 配置文件,在每次启动新的交互式 Bash Shell 时执行。
- 用户级别的配置文件:
~/.bash_profile:用户级别的 Bash Shell 配置文件,在用户登录时执行。如果存在此文件,则忽略 ~/.bash_login。
~/.bash_login:用户级别的 Bash Shell 配置文件,在用户登录时执行。
~/.profile:用户级别的 Bash Shell 配置文件,在用户登录时执行。
- 每次启动交互式 Bash Shell 时执行的文件
~/.bashrc:用户级别的 Bash Shell 配置文件,在每次启动新的交互式 Bash Shell 时执行。
- 用户退出登录时执行的文件
~/.bash_logout:用户级别的 Bash Shell 配置文件,在用户退出登录时执行。
总结起来,执行顺序是在用户登录时首先执行系统级别的配置文件,然后执行用户级别的配置文件,最后执行每次启动交互式 Bash Shell 和退出登录时的用户级别配置文件。