Linux基础教程(十七)Shell 基本运算符:别只会ls了!解锁Shell运算符の魔法手册,让你的终端不再是“木头人”

引言:你的Shell,不止是传话筒

当你第一次打开Linux终端,输入ls并按下回车,看到一列文件蹦出来时,你可能会觉得:“哇,我好黑客!” 但很快你会发现,你就像一个在魔法世界里只会说“你好”的麻瓜,面对强大的魔法(自动化、条件判断、复杂计算)只能干瞪眼。

Shell的真正力量,不在于你记得多少条命令,而在于你如何用运算符这条“魔法语法”,将一条条简单的命令(咒语)编织成强大的脚本魔法。今天,我们就来掰开揉碎,看看Shell运算符这颗“瑞士军刀”上的每一个神奇刀片。

第一章:算术运算符——Shell的数学脑壳

没错,Shell这个文本大佬其实也能做数学题!但它的数学方式有点特别,需要我们动用一点小魔法。

1.1 魔法咒语:let, (()), expr$[]

Shell原生不支持简单的数学运算,像var=1+1只会让你得到一个字符串“1+1”。我们需要魔法符咒来激活它的计算能力。

let命令: 专为计算而生。

# 示例1:基础计算
let "sum = 5 + 7" # 加法
let "diff = 10 - 3" # 减法
let "product = 4 * 6" # 乘法(注意!不要用×)
let "quotient = 15 / 4" # 除法(结果是整数3,因为这是整数除法)
let "modulus = 15 % 4" # 取余(结果是3)
echo "5+7=$sum, 15÷4余$modulus"

双小括号(( )): 现代bash中更推荐的“魔法阵”,更加简洁强大。它内部的变量不需要$符号。

# 示例2:双小括号的妙用
a=10
b=3
(( a++ )) # 自增1,相当于 a=a+1,现在a=11
(( b-- )) # 自减1,相当于 b=b-1,现在b=2
(( result = a * b )) # 乘法,11*2=22
echo "结果是:$result"

# 还可以直接用于if判断
if (( a > b && a < 20 )); then
    echo "a比b大并且小于20"
fi

古董级工具:expr (了解一下即可,基本被淘汰)

# 示例3:expr的用法(注意空格!)
result=`expr 2 + 2` # 反引号获取命令输出
echo "2 + 2 = $result"
# 缺点:操作符需要转义,例如乘号要写 \*

1.2 实战小剧场:一个简单的计算器脚本

#!/bin/bash
# 文件名:simple_calc.sh
echo "欢迎使用社畜专用摸鱼计算器"
read -p "输入第一个数字: " num1
read -p "输入第二个数字: " num2

(( sum=num1+num2 ))
(( diff=num1-num2 ))
(( prod=num1*num2 ))
(( quot=num1/num2 ))
(( mod=num1%num2 ))

echo "-----结果如下-----"
echo "$num1 + $num2 = $sum"
echo "$num1 - $num2 = $diff"
echo "$num1 * $num2 = $prod"
echo "$num1 / $num2 = $quot (整数商)"
echo "$num1 % $num2 = $mod (余数)"

运行一下,你就在终端里拥有了一个专属计算器!

第二章:关系运算符——Shell的“比较之心”

关系运算符用于比较两个值,通常用在条件判断中,是脚本拥有“判断力”的关键。它们有两种主要形式:用于整数的-eq系列和用于字符串的=系列。千万别搞混!

2.1 数字比较(在[ ]test命令中使用)

  • -eq: 等于(Equal)
  • -ne: 不等于(Not Equal)
  • -gt: 大于(Greater Than)
  • -lt: 小于(Less Than)
  • -ge: 大于等于(Greater or Equal)
  • -le: 小于等于(Less or Equal)
# 示例4:数字比较
num1=10
num2=20

if [ $num1 -lt $num2 ]; then # 注意括号内的空格!
    echo "$num1 确实小于 $num2"
else
    echo "反直觉数学出现了!"
fi

2.2 字符串比较

  • ===: 等于(判断字符串是否相同)
  • !=: 不等于
  • -z: 检查字符串长度是否为零(Zero)
  • -n: 检查字符串长度是否非零(Non-zero)
# 示例5:字符串比较
name1="Neo"
name2="Smith"

if [ "$name1" != "$name2" ]; then
    echo "欢迎救世主 $name1,你不是特工 $name2"
fi

empty_str=""
if [ -z "$empty_str" ]; then
    echo "这个变量是空的,像个没睡醒的脑子。"
fi

⚠️血泪警告:如果你用-eq去比较字符串,或者用=去比较数字,Shell会给你一堆看不懂的错误,或者产生诡异的逻辑bug。记住:数字比大小,字符串比内容

第三章:布尔与逻辑运算符——Shell的“逻辑脑”

想让脚本做出更复杂的决策?你需要布尔逻辑。

  • !: 非(NOT),取反。
  • -o: 或(OR),在[ ]内使用。
  • -a: 与(AND),在[ ]内使用。
  • &&: 逻辑与(AND),更常用,用于连接命令。
  • ||: 逻辑或(OR),更常用,用于连接命令。

&&||的用法非常巧妙:

  • 命令1 && 命令2: 只有命令1成功执行(返回0)后,命令2才会执行。
  • 命令1 || 命令2: 只有命令1执行失败(返回非0)后,命令2才会执行。
# 示例6:逻辑运算符实战
file="important_document.txt"

# 如果文件存在且可读,就打印其内容
[ -f "$file" ] && [ -r "$file" ] && cat "$file"

# 如果拷贝文件失败,就打印错误信息并退出
cp "$file" /backup/ || { echo "备份失败!世界要毁灭了!"; exit 1; }

# 复杂的逻辑判断
age=25
if [ $age -gt 18 ] && [ $age -lt 30 ]; then
    echo "你是年轻的打工人。"
fi
# 等价于
if [ $age -gt 18 -a $age -lt 30 ]; then
    echo "你依然是年轻的打工人。"
fi

第四章:字符串运算符——Shell的“文本侦探”

除了比较,Shell还对字符串提供了专属调查工具。

  • =: 检测两字符串是否相同。
  • !=: 检测两字符串是否不同。
  • -z: 检测字符串长度是否为0。
  • -n: 检测字符串长度是否不为0。
  • [ $string ]: 检测字符串是否不为空(类似-n)。
# 示例7:字符串侦探事务所
username=$1 # 获取脚本的第一个参数

if [ -z "$username" ]; then
    echo "错误:用户名不能为空,你这记性!"
    exit 1
fi

if [ -n "$username" ]; then
    echo "正在为用户 '$username' 创建账户..."
    # ... 相关操作
fi

default_name="喵星人"
final_name=${username:-$default_name} # 如果username未设置或为空,则使用default_name
echo "你好,$final_name!"

第五章:文件测试运算符——Shell的“万物感知”

这是Shell运算符中最实用、最强大的部分之一。它可以让你不打开文件就知道关于它的一切。

  • -e: 文件/目录是否存在(Exist)
  • -f: 是否存在且为普通文件(File)
  • -d: 是否存在且为目录(Directory)
  • -r: 是否可读(Readable)
  • -w: 是否可写(Writable)
  • -x: 是否可执行(eXecutable)
  • -s: 文件大小是否大于0(非空文件)
  • -L: 是否存在且为符号链接(Link)
# 示例8:文件检测综合脚本
file_path="/etc/passwd"

echo开始检测文件 $file_path...

if [ -e "$file_path" ]; then
    echo "✓ 文件存在。"

    if [ -f "$file_path" ]; then
        echo "✓ 它是一个普通文件。"
    fi

    if [ -d "$file_path" ]; then
        echo "✓ 它是一个目录。"
    fi

    if [ -r "$file_path" ]; then
        echo "✓ 我可读。"
    fi

    if [ -w "$file_path" ]; then
        echo "⚠️  我可写!普通用户能改这个文件?这可能有安全风险!"
    fi

    if [ -s "$file_path" ]; then
        echo "✓ 我不是空文件。"
    fi
else
    echo "✗ 文件不存在!"
fi

这个功能在写安装脚本、备份脚本、部署脚本时极其有用,可以避免很多低级错误。

终章:融会贯通——打造你的第一个智能脚本

现在,让我们把所有的魔法融合起来,写一个有点用的脚本:自动备份并检查脚本

#!/bin/bash
# 文件名:smart_backup.sh

# 定义源文件和目标目录
source_file="./my_work.txt"
backup_dir="./backup"

# 1. 检查源文件是否存在且可读
if [ ! -f "$source_file" ]; then # 注意 [!] 的用法
    echo "错误:源文件 $source_file 不存在!"
    exit 1
elif [ ! -r "$source_file" ]; then
    echo "错误:源文件不可读!"
    exit 1
else
    echo "✓ 源文件检查通过。"
fi

# 2. 检查备份目录是否存在,不存在则创建
if [ ! -d "$backup_dir" ]; then
    echo "备份目录不存在,正在创建..."
    mkdir -p "$backup_dir"
    if [ $? -ne 0 ]; then # 判断上一条命令(mkdir)是否成功
        echo "创建备份目录失败!"
        exit 1
    fi
    echo "✓ 备份目录创建成功。"
fi

# 3. 执行备份(添加时间戳)
backup_file="$backup_dir/my_work_$(date +%Y%m%d_%H%M%S).bak"
cp "$source_file" "$backup_file"

# 4. 检查备份是否成功
if [ $? -eq 0 ] && [ -s "$backup_file" ]; then
    echo "✓ 备份成功!文件已保存为: $backup_file"
else
    echo "✗ 备份失败!请检查磁盘空间或权限。"
    exit 1
fi

echo "🎉 所有操作已完成!可以安心摸鱼了。"

这个脚本综合运用了文件测试、布尔逻辑、算术($?获取退出状态码)和字符串,是一个真正有用的小工具。

结语:从麻瓜到法师

看,Shell的世界不再是冰冷的命令罗列。通过灵活运用这些运算符,你的脚本获得了计算、比较、判断、探测的能力,变得真正“智能”起来。

现在,放下lscd,拿起-eq&&-f,开始你的Shell魔法师生涯吧!记住,伟大的自动化不是一蹴而就的,而是由一个一个聪明的运算符和条件判断构建起来的。

祝你编程愉快,法力无边!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值