shell(2)--变量、算数运算、测试表达式、常用的操作运算符、文件测试运算符、整数值比较
文章目录
- shell的变量
- 变量概念解析
- 变量的作用:
- 变量的分类:
- 环境变量/系统变量
- 位置变量
- 预定义变量
- 初步实现免交互
- 变量的作用范围:
- 不同的符号的含义:
- Shell脚本中的变量交互详解
- 使用read命令进行交互式输入
- 带提示信息的输入 (-p选项)
- 1.2 不换行输出配合read (-n选项)
- 2. 数组输入 (-a选项)
- 高级用法示例
- 带默认值的输入
- 密码输入(不显示输入内容)
- 定时读取(超时设置)
- Shell中的算术运算方法
- expr命令
- 基本语法格式
- 支持的运算符
- 使用示例
- 变量赋值用法
- 注意事项
- $(( ))算术扩展
- 基本语法
- 使用示例
- 特点
- 其他算术运算方法
- 实际应用场景示例
- 性能比较
- 其他
- 测试 :test 或 [ ] 表达式
- 语法格式
- 返回值规则
- 示例
- 注意事项
shell的变量
变量概念解析
变量名:类似于容器的标识名称,可想象为一个收纳盒
变量值:随用户需求或系统环境变化的内容,相当于盒中存放的物品
当需要频繁使用多个数据时,将它们打包到变量中便于调用,使用时直接提取即可
变量由以下两部分构成:
变量名:使用"${ }"格式
变量值:每个变量只能存储一个值
变量的作用:
用来存放系统和用户需要使用的特定参数(值),即存储数据;可以被重复使用,让shell脚本更灵活
变量的分类:
自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置工作环境,系统设置好的
位置变量:通过命令行给脚本程序传递参数
预定义变量:Bash中内置的一类变量,不能直接修改
环境变量/系统变量
环境变量由系统提前创建,用来设置用户的工作环境
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
位置变量
$0:脚本本身
$1,$2…第xx个位置变量
预定义变量
系统做好的,有特殊功能的符号;输出的是一类功能
例:
$?:当前命令执行结果是否报错;无误:0;有误:非零值
$$:输出这个任务是的进程号
$# :判断参数个数
$0:脚本本身
$1:第一个位置参数
小知识:
显示系统信息:
uname -r查询操作系统版本:
cat /etc/redhat-release[root@localhost ~]# uname -r
3.10.0-1160.119.1.el7.x86_64
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
sh,bash都属于shell,故不需要给与执行权限
"./"运行脚本时,使用者是用户,需要给与用户文件可执行权限
初步实现免交互
在Linux系统中,>>和>是两种常用的输出重定向操作符,它们的主要区别在于对目标文件的处理方式:
-
重定向追加(
>>):- 将命令的输出以追加方式写入文件末尾
- 如果目标文件不存在会自动创建
- 不会删除或覆盖原有文件内容
- 示例:
echo "New line of text" >> existing_file.txt - 典型应用场景:
- 日志记录(持续添加新日志条目)
- 构建历史记录文件
- 累积数据收集
-
重定向覆盖(
>):- 将命令的输出覆盖写入文件
- 如果目标文件不存在会自动创建
- 会清空目标文件原有内容
- 示例:
echo "This will overwrite everything" > target_file.txt - 典型应用场景:
- 创建新配置文件
- 保存单次命令输出结果
- 初始化数据文件
注意事项:
- 两个操作符都可以与标准错误重定向结合使用(如
2>>或2>) - 使用时需确保对目标文件有写权限
- 可以使用
set -o noclobber防止意外覆盖重要文件 - 对于大文件操作,追加比覆盖通常更高效
扩展用法示例:
# 同时重定向标准输出和标准错误
command >> output.log 2>&1# 使用tee命令同时显示并保存输出
command | tee -a logfile.txt# 清空文件内容的特殊用法
> empty_file.txt
变量的作用范围:
终端执行命令时,变量a的值为系统环境定义值(a=10)
执行脚本时,变量a取脚本内定义值(a=20)
当使用source执行脚本时,终端和脚本中的变量值会统一,此时两者输出一致(a=20)
新创建脚本时,变量a取该脚本定义值(a=30)。若未使用source执行脚本,通过其他命令执行时a=30
vim 3.sh
echo $number
number =30
chmod +x 3.sh
sh ./3.sh
30
不同的符号的含义:
双引号" ":能够识别变量和特殊符号,引号内的内容会被视为字符串类型
单引号’ ':不会解析特殊符号,会将变量符号原样输出
反撇号``:用于执行包含的命令,并返回命令执行结果
当需要将命令执行结果赋值给变量时:
number = `ls -l | wc -l`
注意:
- 反撇号需使用英文模式下的波浪号键位输入
- 反撇号的作用是执行其包含的命令,并将结果赋给变量
练习:使用find找到/etc中name以conf为结尾的文件,并统计数量
conf_number=`find /etc/ -type f -name "*.conf" | wc -l`
[root@localhost etc]# echo "/etc中name以conf为结尾的文件数量为:$conf_number"
/etc中name以conf为结尾的文件数量为:105
Shell脚本中的变量交互详解
使用read命令进行交互式输入
带提示信息的输入 (-p选项)
read -p是最常用的交互式输入方式,它将提示信息与变量读取结合在一行完成。
基本语法:
read -p "提示信息" 变量名
示例:
read -p "请输入您的用户名:" username
echo "您输入的用户名是:$username"
应用场景:
- 需要用户输入配置参数时
- 创建交互式安装脚本
- 获取用户反馈信息
1.2 不换行输出配合read (-n选项)
echo -n可以实现不换行的输出效果,与read配合使用时可以让输入光标保持在提示信息后面。
基本语法:
echo -n "提示信息"
read 变量名
示例:
echo -n "请输入您的年龄:"
read age
echo "您输入的年龄是:$age"
与-p方式的区别:
- 这是两个命令的组合
- 可以更灵活地控制输出格式
- 适用于需要特殊格式提示的场景
2. 数组输入 (-a选项)
read -a允许用户一次性输入多个值,这些值会自动存储到数组中。
基本语法:
read -a 数组名
示例:
echo "请输入多个水果名称(用空格分隔):"
read -a fruits
echo "您输入的水果有:${fruits[@]}"
echo "第一个水果是:${fruits[0]}"
使用技巧:
- 输入时用空格分隔各个元素
- 访问数组元素时使用${数组名[索引]}
- 使用[@]或[*]可以访问所有元素
- 可以通过${#数组名[@]}获取数组长度
实际应用:
- 批量输入文件列表
- 收集多项配置参数
- 处理用户输入的多个选项
高级用法示例
带默认值的输入
read -p "请输入端口号 [默认8080]:" port
port=${port:-8080}
echo "将使用端口:$port"
密码输入(不显示输入内容)
read -s -p "请输入密码:" password
echo
echo "密码已接收"
定时读取(超时设置)
read -t 5 -p "请在5秒内输入:" quick_input
注意:变量与前面的语句之间一定要有一个空格,不然会不能读取输入的变量。
通过这些交互方式,可以创建出更友好、更灵活的Shell脚本程序。
Shell中的算术运算方法
expr命令
expr是Shell中用于执行算术运算的命令,主要用于整数运算。
基本语法格式
expr 变量1 运算符 变量2 [运算符 变量3 ...]
支持的运算符
+加法-减法\*乘法(注意需要转义)/除法%取余
i++ 相当于 i=[[[i+1]
i–相当于 i=[[[i-1]
i+=2 相当于 i=[[[i+2]
使用示例
expr 12 \* 5 # 结果为60
变量赋值用法
i=$(expr 12 \* 5) # 将计算结果60赋值给变量i
注意事项
- 运算符周围必须有空格
- 乘法运算符
*需要转义 - 只能进行整数运算
$(( ))算术扩展
$(( ))是更现代、更简洁的算术运算方式。
基本语法
$((算术表达式))
使用示例
i=$((12 * 5)) # 结果为60
特点
- 不需要对运算符转义
- 表达式内可以有空格(推荐)
- 支持更复杂的表达式
- 执行效率比expr更高
其他算术运算方法
-
$[ ]语法(较老的语法,现代脚本不推荐使用):
i=$[12 * 5] -
let命令:
let i=12*5 -
bc命令(支持浮点运算):
echo "scale=2; 12 * 5.1" | bc
实际应用场景示例
-
循环计数器:
for ((i=0; i<$((10*2)); i++)); doecho $i done -
脚本参数计算:
total=$(( $1 * $2 )) echo "结果为: $total" -
条件判断:
if [ $((count % 2)) -eq 0 ]; thenecho "偶数" fi
性能比较
在批量运算时,$(( ))的性能明显优于expr,特别是在循环中:
# 测试10000次运算
time for i in {1..10000}; do expr 12 \* 5 >/dev/null; done
time for i in {1..10000}; do echo $((12 * 5)) >/dev/null; done
其他
$() 和反引号 ` 都用于获取命令的执行结果
$(()) 用于执行算术运算
反斜杠 \ 是转义字符:
- 在命令中,
*具有通配符的特殊含义 - 在算术运算中使用时,需要添加反斜杠
\*来表示乘法运算符
测试 :test 或 [ ] 表达式
test 或 [ ] 用于测试表达式是否成立,返回布尔值(真/假)。
语法格式
test 条件表达式
[ 条件表达式 ](方括号与表达式之间需留空格)
返回值规则
- 条件成立:返回
0(真) - 条件不成立:返回非零值(假)
示例
基础数值比较:
a=10
b=10
test $a -eq $b
echo $? # 输出 0(成立)
字符串比较:
str1="hello"
str2="world"
[ "$str1" = "$str2" ]
echo $? # 输出非零(不成立)
文件测试:
file="/path/to/file"
test -f "$file"
echo $? # 若文件存在,返回 0;否则返回非零
逻辑组合:
[ 10 -gt 5 ] && [ "abc" != "def" ]
echo $? # 两个条件均成立,返回 0
注意事项
- 方括号
[ ]是test的另一种形式,需确保内部空格。 - 字符串比较时,变量建议用双引号包裹,避免空值或空格导致的语法错误。
