shell编程扫盲
大部分内容参考自清华大学出版社<<Linux编程>>,相关内容会随着笔者的不断学习而增量更新
chatgpt能够完成shell编程的大部分内容,可以在阅读本文后向chatgpt提出需求,适当修改chatgpt给出的代码,再于测试环境进行排错,最后用于生产环境
2.1 Shell编程的基本概念
shell是一种围绕着linux内核所提供的接口的胶水语言,由于linux的接口是C程序,因此各种C程序(如linux的各种CLI命令),都可以被shell语言调用.
2.1.1 Shell脚本的程序结构
可由以下成分组成:
- Linux命令
- 变量与赋值语句
- 输入输出语句
- 流程控制语句
2.1.2 Shell脚本的创建与执行方法
创建:
script.sh
#!/bin/bash
# -*- coding: utf-8 -*-
#注释
#代码段...
echo "helloworld"
执行:
- CLI:
/bin/bash ./script.sh
- CLI:
chmod +x ./script.sh && ./script.sh
2.1.3 Shell变量与赋值表达式
shell中的变量和值遵循`key-value`逻辑,值分为数字和"字符串"
变量规则:
- 由字母,数字,下划线组成,大小写敏感
- 由${variableName}的形式提取变量引用的值,该方式可拼接其他字符,提取未定义的变量会得到空
- 使用$(linux_command)解析得到linux命令的返回值
2.1.4 Shell输入输出语句
输入:
将以空格分隔的输入量分别输入到v1,v2...,如果是超量输入,那么所有超量的部分都会被添加到最后一个变量里(此处为v2)
read [-s] [-p "提示字符串"] v1 v2 ...
- s : slient mode
- p : promt,即提示词
输出:
echo
可在其后解析变量引用和linux命令的返回值
命令行参数解析:
$num
:执行脚本时传入的第n个变量,众所周知$0
是脚本名称
$#
:执行脚本时传入的变量数量
$@
:执行脚本时传入的变量视为一个vector
$*
:执行脚本时传入的变量视为一个以空格分隔的string
$?
:最后一次命令的返回值,正常是0,可在程序中通过exit num
设置
2.2 shell三剑客与管道符和I/O重定向
三剑客直接问chatgpt吧
2.2.1 grep
2.2.2 sed
2.2.3 awk
2.2.4 管道符 |
cmd1 | cmd2:cmd1的输出传递给cmd2的输入
2.2.5 追加>>与阶段添加>
>>:左侧输出追加到右侧文件内容之后
>:左侧输出阶段添加到右侧文件内容之后
2.3 条件与if控制结构
2.3.1 if控制结构
if command
then
echo "hello"
elif command
then
echo "HELLO"
else#这行非必须
echo "world"#这行非必须
fi
###
if cmd;then
command
fi
其中:command的返回结果为0
时条件为真(参考$?
),若command错误,其返回报错也会输出到脚本的输出结果中
2.3.2 test命令
可使用test condition
或者[空格condition空格]
来替换if
后的command
提供条件检测能力,可处理:
- 数值比较,
- 字符串比较,
- 文件属性检查
- 数值比较
分别使用-
加equal(等于)/greetthan(大于)/lessthan(小于)的第一个可识别字母构成:
a -eq b #==
-lt #<=
-gt #>=
-le #<
-gt #>
-ne #!=
- 字符串比较
a = b #==
!= #!=
< #<
> #>
-n a #a的长度非0
-z a #a的长度是0
- 文件比较
-e f #存在
-d f #存在且目录
-f f #存在且文件
-r f #存在且可读
-s f #存在且内容非空
-w f #存在且可写
-x f #存在且可执行
-O f #存在且当前用户拥有
-G f #存在且当前用户组
f1 -nt f2 #f1新于f2
f1 -oz f2 #f1旧于f2
复合检查
if [expression1]&&[expression2]
if [expression1]||[expression2]
2.3.4 case
用于判断不同条件值与参数值相等的情况
case var in
condition1)
cmd
;;
condition2)
cmd
;;
*)
;;
esac
2.4 循环结构
2.4.1 for循环
支持break和continue
遍历
for i in list
do
cmd to $i
done
次数控制
for ((i=1;i<=3;i++))
do
echo "$i"
done
2.4.2 while循环与until循环
while:test command为真则执行循环体
while test command
do
other command
done
until:test command为假则执行循环体
until test command
do
other command
done
2.5 shell函数
定义:可以参考c语言函数的签名,其中的argn可以忽略,转而使用$1,$2..的形式提取函数实参,但是使用argn的方式能让传参更有阅读价值
function fname(arg1,arg2){
echo "hello function"
return 0
}
#函数调用
fname #不需要函数调用符()
2.6脚本的前台后台切换
- 在CLI执行脚本后+
&
会在后台执行 - fg + 脚本job号(就是1.执行后返回的中括号里的数字)可以将后台脚本放到前台
- bg +jobs号将脚本放在后台
- jobs命令查看所有脚本
- ctrl+z 暂停当前脚本
- ctrl+c 停止当前脚本
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 分享4款.NET开源、免费、实用的商城系统