Shell脚本编程基础(二)

在 Bash Shell 编程中,数组、运算符和条件判断是非常重要的基础内容。本文将介绍如何在 Bash 中使用一维数组、进行基本的数学运算以及条件判断。

一维数组

Bash Shell 仅支持一维数组,初始化时不需要定义数组的大小。以下是一些基本的数组操作:

定义数组

可以通过下面的方式定义数组:

bash 复制代码
myArray=(a b c 1 2 5)

访问数组元素

可以使用下标访问数组元素,下标从 0 开始:

bash 复制代码
echo ${myArray[0]}  # 输出: a
echo ${myArray[2]}  # 输出: c

获取数组的所有元素

使用 ${myArray[*]} 或 ${myArray[@]} 可以获取数组的所有元素:

bash 复制代码
echo ${myArray[*]}  # 输出: a b c 1 2 5

获取数组长度

使用 ${#myArray[@]} 可以获取数组的长度:

bash 复制代码
echo ${#myArray[@]}  # 输出: 6

基本运算符

Bash 支持基本的算术运算符,包括加、减、乘、除和取余。以下是一些示例:

使用 (( )) 或 进行算术运算

bash 复制代码
res=$((4 + 2))
echo $res  # 输出: 6

res=$((4 + 2 * 3))
echo $res  # 输出: 10

expr 命令

expr 用于计算表达式,运算符之间必须有空格:

bash 复制代码
result=$(expr 2 + 3)
echo $result  # 输出: 5

result=$(expr 9 - 3)
echo $result  # 输出: 6

result=$(expr 3 \* 3)
echo $result  # 输出: 9

result=$(expr 5 / 2)
echo $result  # 输出: 2  # 因为 Bash 中的整数除法会截断结果

条件判断

Bash 脚本中经常需要进行条件判断,以下是基本的条件判断操作:

文件和权限判断

bash 复制代码
#!/bin/bash

if [ -e "/opt/oracle/ora.txt" ]; then
    echo "ora.txt 文件存在"
else
    echo "ora.txt 文件不存在"
fi

if [ -w "/opt/oracle/ora.txt" ]; then
    echo "ora.txt 有可写权限"
else
    echo "ora.txt 没有写权限"
fi

数值比较

bash 复制代码
if [ 30 -lt 50 ]; then
    echo "返回真"
else
    echo "false!"
fi

逻辑运算符

bash 复制代码
if [ "$1" -gt 5 ] && [ "$1" -lt 9 ]; then
    echo "$1 它在5和9之间"
elif [ "$1" -lt 5 ] || [ "$1" -gt 8 ]; then
    echo "$1 它小于5或者大于8"
fi

示例脚本

以下是两个简单的示例脚本,演示了基本的数组、运算和条件判断操作:

bash 复制代码
#!/bin/bash

# 数组定义与使用
myArray=(10 20 30 40 50)
echo "数组的第一个元素: ${myArray[0]}"
echo "数组的所有元素: ${myArray[*]}"
echo "数组的长度: ${#myArray[@]}"

# 基本运算
a=10
b=20

var=$(expr $a + $b)
echo "a + b 的结果是: $var"

var=$(expr $a - $b)
echo "a - b 的结果是: $var"

var=$(expr $a \* $b)
echo "a * b 的结果是: $var"

var=$(expr $a / $b)
echo "a / b 的结果是: $var"

var=$(expr $a % $b)
echo "a % b 的结果是: $var"
bash 复制代码
#!/bin/bash

# 判断文件是否存在
if [ -e "/opt/oracle/ora.txt" ]; then
    echo "ora.txt 文件存在"
else
    echo "ora.txt 文件不存在"
fi

# 判断文件是否有写权限
if [ -w "/opt/oracle/ora.txt" ]; then
    echo "ora.txt 有可写权限"
else
    echo "ora.txt 没有写权限"
fi

# 比较整数大小
if [ 30 -lt 50 ]; then
    echo "30 < 50"
else
    echo "false!"
fi

# 检查输入参数是否在指定范围内
if [ "$1" -gt 5 ] && [ "$1" -lt 9 ]; then
    echo "$1 它在5和9之间"
elif [ "$1" -lt 5 ] || [ "$1" -gt 8 ]; then
    echo "$1 它小于5或者大于8"
fi

要点总结:

  1. 条件判断语法:

    • [ 和 ] 前后必须有空格,否则会产生语法错误。
    • = 用于比较字符串是否相等。
  2. 整数比较运算符:

    • -lt:小于
    • -gt:大于
    • -eq:等于
    • -le:小于等于
    • -ge:大于等于
  3. 逻辑运算符:

    • && 表示逻辑与。
    • || 表示逻辑或。
  4. 文件操作符:

    • -r:检查文件是否有读权限。

    • -w:检查文件是否有写权限。

    • -x:检查文件是否有执行权限。

    • -e:检查文件是否存在。

    • -d:检查是否是目录。

    • -f:检查是否是普通文件。

    • -s:检查文件是否为空。

相关推荐
瑞雪兆丰年兮3 分钟前
JavaWeb-day07-MySQL(DQL&多表设计)
java·开发语言·数据库·sql·mysql·javaweb·web
我是koten5 小时前
【运维杂谈】K8s遇到Terminating的名称空间删除不了怎么办?(解决方案亲测有效)
linux·运维·服务器·云原生·kubernetes·k8s·名称空间
isNotNullX10 小时前
仓储管理最全框架:6大流程、8项指标、10个管理动作、12个常见问题
大数据·人工智能
国科安芯11 小时前
把接口变成观测量:CANFD收发器状态可观测性驱动的星上故障检测隔离与恢复方法
大数据·人工智能·物联网·卫星·抗辐射·通信芯片·载荷
玩美数据13 小时前
海外市场数据服务常用术语与名词解释权威指南
大数据·人工智能
2601_9679873713 小时前
安装 Redis 或 Redis Stack
linux·windows·redis·macos·安装
feng_you_ying_li13 小时前
linux之数据链路层
linux·网络·智能路由器
修己xj13 小时前
服务器无法解析域名?一次 DNS 配置缺失的排查与修复
运维
GeW14 小时前
高端化走到深处,是数据库和Linux的事
linux
武子康15 小时前
Qwen-Drive 的 91.4 分,究竟选中了什么?
大数据·人工智能·agent