Shell基础-介绍

Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。

  • 内核(Kernel):管理硬件设备(文件、内存、多线程、网络),是连接各种硬件设备的桥梁
  • Shell:既是一个命令解释器,又是一种程序设计语言
    • 命令解释器:接收输入的命令,交给内核执行,并返回结果
      • 交互式:输入一条命令,Shell就解释执行一条
      • 脚本式:把多个命令写入Shell脚本文件,再让Shell一次性执行完
    • 程序设计语言:定义变量、控制语句,实现逻辑运算等
  • 命令行、终端、命令提示符:可以输入并执行命令的软件

image

 

一、基础结构

  •  声明
    • #:单行注释
    • #-*-coding:xx-*-:使用指定编码方式来读取该文件

    • #!/bin/bash :使用bash解释器
  • 执行脚本
    • bash script.sh   #方式1:用bash执行
    • ./script.sh          #方式2:直接执行(需要先 chmod +x script.sh)

二、变量

  • 定义和使用
    • "$name":将变量的值作为单一的整体参数传递给命令。可以安全地保留值内部的空格、换行符等特殊字符。(推荐使用)
    • $name:先对变量值进行"分词"(按空格、制表符、换行符分割),再将每个分词结果作为"路径匹配模式"(Pattern)去匹配实际的文件名。(危险操作)
# 假设你想删除一个名为 *.tmp 的文件
file="*.tmp"

# ✅ 安全:只删除名为 *.tmp 的文件(通配符不生效)
rm "$file"
# ❌ 危险:会删除当前目录下所有 .tmp 文件(通配符生效)
rm $file

 

# 定义变量(等号两边不能有空格)
name="张三"
age=25
file_path="/home/user/test.txt"

# 使用变量(加$符号)
echo $name
echo ${name}      # 花括号是可选的,用于明确边界
echo ${#name}    # 获取长度
echo "他叫${name},今年${age}岁"

# 只读变量
readonly PI=3.14

# 删除变量
unset name
  • 特殊参数
$0:脚本本身的名称

$n:传入的第n个参数
$#:参数的个数
$@:所有参数(每个独立、依次获取)
$*:所有参数(作为一个整体、一次获取全部)

$$:当前脚本的进程ID
$?:上一条命令的退出状态(0表示成功)

三、数组

# 定义数组
fruits=("苹果" "香蕉" "橙子")

#数组赋值
fruits[0]="红富士"

# 访问数组
echo ${fruits[0]}   # 第一个元素(下标从0开始)
echo ${fruits[@]}   # 所有元素
echo ${#fruits[@]}  # 数组长度

# 添加元素
fruits+=("葡萄")

# 遍历数组
for fruit in "${fruits[@]}"; do
    echo $fruit
done

四、条件判断

  • 条件判断
    • [ xx ]:进行简单的算术、字符串判断(运算符两边有空格,括号与变量、运算符之间也有空格)
    • 复杂算术运算:result=$((a * b + 10))
  • 逻辑组合
    • 与:(-a)、&&
    • 或:(-o)、||
    • 非:(!)
数值比较
[ $a -eq $b ]    a 等于 b
[ $a -ne $b ]    a 不等于 b
[ $a -gt $b ]    a 大于 b
[ $a -lt $b ]    a 小于 b
[ $a -ge $b ]    a 大于等于 b
[ $a -le $b ]    a 小于等于 b

字符串比较
[ "$str1" = "$str2" ]    字符串相等(注意等号两边有空格)
[ "$str1" != "$str2" ]   字符串不相等
[ -z "$str" ]    字符串为空,不推荐[ -z $var ]
[ -n "$str" ]    字符串非空

文件判断:
[ -f "$file" ]    是普通文件
[ -d "$dir" ]     是目录
[ -e "$path" ]    路径存在
[ -r "$file" ]    可读
[ -w "$file" ]    可写
[ -x "$file" ]    可执行
[ -s "$file" ]    文件非空
  • if 语句
# 基本语法
if [ 条件 ]; then
    # 条件成立时执行
elif [ 另一个条件 ]; then
    # 另一个条件成立时执行
else
    # 都不成立时执行
fi

五、循环

break :跳出整个循环

continue:跳出当前循环,继续下一次循环

  • for 循环
# 遍历列表
for i in 1 2 3 4 5; do
    echo "数字: $i"
done

# 遍历范围
for i in {1..10}; do
    echo "数字: $i"
done

# 遍历文件
for file in /var/log/*.log; do
    echo "日志文件: $file"
done

# C语言风格
for ((i=0; i<10; i++)); do
    echo "计数: $i"
done
  • while 循环
# 基本while
count=1
while [ $count -le 5 ]; do
    echo "第$count次"
    count=$((count + 1))
done

# 读取文件每一行
while read line; do
    echo "行内容: $line"
done < file.txt

六、函数

# 定义函数
function say_hello() {
    echo "你好,$1"    # $1是第一个参数
    return 0
}

# 简化写法
greet() {
    echo "欢迎: $1"
    return 0
}

# 调用函数
say_hello "张三"
greet "李四"

# 获取函数返回值
say_hello "王五"
result=$?    # $?获取上一条命令的返回值

七、常见命令和操作

  • 命令替换(从内向外执行里面的命令、得到结果,再拿结果进行处理)
# 方法1:反引号(老旧)
today=`date +%Y-%m-%d`

# 方法2:$()(推荐,可嵌套)
today=$(date +%Y-%m-%d)
files_count=$(ls | wc -l)
  • echo "hello":输出"hello"
    • -n:不换行输出
    • -e:启用转义字符(\n是换行,\\是斜杠,\"是引号)
  • printf "格式字符串" 参数1 参数2 ...
"格式字符串":固定内容、替代符、对齐、宽度、转义符
---替代符:%s:字符串、%d:十进制整数、%f:浮点数
printf
"姓名:%s,年龄:%d\n" "张三" 25 printf "保留两位小数:%.2f\n" 3.14159
  • read name:读取用户输入赋值给name
  • bash -x script.sh:开启调试
  • source file、(.  file):读取并执行文件中的内容,可以使用文件中的变量、函数等
  • xx|xx、管道符:把前一个命令的输出作为下一个命令的输入
posted @ 2026-06-04 18:22  Fēngwèi  阅读(5)  评论(0)    收藏  举报