Shell基础-介绍
Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。
- 内核(Kernel):管理硬件设备(文件、内存、多线程、网络),是连接各种硬件设备的桥梁
- Shell:既是一个命令解释器,又是一种程序设计语言
- 命令解释器:接收输入的命令,交给内核执行,并返回结果
- 交互式:输入一条命令,Shell就解释执行一条
- 脚本式:把多个命令写入Shell脚本文件,再让Shell一次性执行完
- 程序设计语言:定义变量、控制语句,实现逻辑运算等
- 命令解释器:接收输入的命令,交给内核执行,并返回结果
- 命令行、终端、命令提示符:可以输入并执行命令的软件

一、基础结构
- 声明
- #:单行注释
-
#-*-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、管道符:把前一个命令的输出作为下一个命令的输入
本文来自博客园,作者:Fēngwèi,转载请注明原文链接:https://www.cnblogs.com/fengwei-blogs/p/20314665

浙公网安备 33010602011771号