当前位置: 首页 > news >正文

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系统中,>>>是两种常用的输出重定向操作符,它们的主要区别在于对目标文件的处理方式:

  1. 重定向追加(>>):

    • 将命令的输出以追加方式写入文件末尾
    • 如果目标文件不存在会自动创建
    • 不会删除或覆盖原有文件内容
    • 示例:
      echo "New line of text" >> existing_file.txt
      
    • 典型应用场景:
      • 日志记录(持续添加新日志条目)
      • 构建历史记录文件
      • 累积数据收集
  2. 重定向覆盖(>):

    • 将命令的输出覆盖写入文件
    • 如果目标文件不存在会自动创建
    • 会清空目标文件原有内容
    • 示例:
      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`

注意:

  1. 反撇号需使用英文模式下的波浪号键位输入
  2. 反撇号的作用是执行其包含的命令,并将结果赋给变量

练习:使用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方式的区别:

  1. 这是两个命令的组合
  2. 可以更灵活地控制输出格式
  3. 适用于需要特殊格式提示的场景

2. 数组输入 (-a选项)

read -a允许用户一次性输入多个值,这些值会自动存储到数组中。

基本语法:

read -a 数组名

示例:

echo "请输入多个水果名称(用空格分隔):"
read -a fruits
echo "您输入的水果有:${fruits[@]}"
echo "第一个水果是:${fruits[0]}"

使用技巧:

  1. 输入时用空格分隔各个元素
  2. 访问数组元素时使用${数组名[索引]}
  3. 使用[@]或[*]可以访问所有元素
  4. 可以通过${#数组名[@]}获取数组长度

实际应用:

  • 批量输入文件列表
  • 收集多项配置参数
  • 处理用户输入的多个选项

高级用法示例

带默认值的输入
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

注意事项

  1. 运算符周围必须有空格
  2. 乘法运算符*需要转义
  3. 只能进行整数运算

$(( ))算术扩展

$(( ))是更现代、更简洁的算术运算方式。

基本语法

$((算术表达式))

使用示例

i=$((12 * 5))  # 结果为60

特点

  1. 不需要对运算符转义
  2. 表达式内可以有空格(推荐)
  3. 支持更复杂的表达式
  4. 执行效率比expr更高

其他算术运算方法

  1. $[ ]语法(较老的语法,现代脚本不推荐使用):

    i=$[12 * 5]
    
  2. let命令

    let i=12*5
    
  3. bc命令(支持浮点运算):

    echo "scale=2; 12 * 5.1" | bc
    

实际应用场景示例

  1. 循环计数器

    for ((i=0; i<$((10*2)); i++)); doecho $i
    done
    
  2. 脚本参数计算

    total=$(( $1 * $2 ))
    echo "结果为: $total"
    
  3. 条件判断

    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 的另一种形式,需确保内部空格。
  • 字符串比较时,变量建议用双引号包裹,避免空值或空格导致的语法错误。
http://www.dtcms.com/a/583271.html

相关文章:

  • php怎样做网站管理后台设计网站软件开发
  • 有没有和小孩做的网站新闻发布会邀请哪些媒体
  • 浙江做铁塔的公司网站网站年费如何做会计分录
  • 开州网站建设网站项目有需要什么技术支持
  • Linux27 线程同步--条件变量
  • seo网站优化推广怎么做盐城网站建设有限公司
  • Numpy一维、二维、三维数组切片实例
  • 手机端网站建站云南网站建设招商
  • 开放获取 SuperMamba 小目标检测特征增强框架
  • 布吉网站建设哪家技术好怎样在手机上创建网站
  • seo是什么?seo网站关键词优化哪家好
  • MinimalWalls v1.9.8 | 提供高质量简约壁纸,支持一键下载、收藏和自动更换等功能,界面干净并支持深浅模式切换
  • 网站优化推广seo公司网站建设的有什么需求
  • 成都网站建设与网站制作网站建设的技术要求
  • 东营住房与城乡建设部网站网站优化 北京
  • asp网站免费模板专门做外链的网站
  • 网站开发技术课程设计说明书做卖挖掘机的网站
  • 购物网站功能模块图wordpress 中英文站点
  • 神经网络中的反向传播与梯度下降
  • 备案网站 备注内容wordpress主题的使用
  • Linux C/C++ 学习日记(48):dpdk(九):dpdk的应用场景及劣势
  • 台州网络建站模板一般网站建设流程有哪些步骤
  • 做视频添加字幕的网站网站建设费用:做个网站要多少钱?
  • 无锁编程在高并发场景下的性能优势
  • Linux:WSL内存空间管理之清完内存C盘可用空间不增问题解决
  • 女頻做的最好的网站iis7 新建网站
  • 可信的邢台做网站企业推广软件有哪些
  • 网站上面的水印怎么做的旅游景点网站模板大全
  • 三轴云台之坐标变换技术
  • 玉泉路网站制作aspnet东莞网站建设价格