课程内容
第一个Shell脚本
#!/bin/bash
#注释
echo "Hello"
- 第一行#!指定解释器,只在第一行才有效
- 注释:"#"
变量
a=123
a=hello
a=`pwd`
PATH=${PATH}:path # 变量后接字符串,可以直接拼接字符串
# 【注意】":a"有特殊含义,会指到当前路径
- 不需要定义变量类型[弱类型语言]
- 如a = 123可以是字符串,也可以是整数
特殊变量
位置变量
- 结果:
状态变量
-
$?:【上一条】指令执行结果,0——成功,非0——不成功
-
便于脚本自动判断指令成功与否
-
、$!:当前进程/上一指令的PID,一般用于自动化测试、多脚本交互场景
-
输入:read
- -p:显示友好提示,需在bash下使用
- -s:静默模式
- -t:输入等待时长,超时结束(单位:s)
- 输出:echo
- -e:开启转义
- 输出:printf
- 和C语言的printf非常像!
- [PS]: !和\n放一起有特殊含义,需要分开
- bash下需要分开
- zsh下可以分开,或用\转义
- 一般对于特殊符号,需要警觉!
函数
- 没有形参
- 调用:函数名 参数…
流程控制
do — done 、if — then — fi、case — esac
分支结构
- if
- if用两个中括号[[ ]]的写法,更高级,与TEST表达式兼容性更好
- case
- 分号;;不能没有!, 相当于break,加了break也要有
- 默认情况可用*)
- case用的较少,一般用来做菜单,比if更好
循环结构
- for
- 利用seq生成序列
- 利用ls的匹配规则
- while
- 同样适用test表达式
- 可以初始化变量,否则第一次echo num时,num是空值,表现为空行
当遇到后面的+1时,系统判定它为整数类型,就当作整数用。
- until
- 与while唯一的区别在于:until写的是停止条件,while写的是循环条件
数组
- 数组赋值和使用
- [常用的数组操作]输出数组元素下标
echo ${num[*]}
输出数组所有元素
echo ${!num[*]}
输出数组下标
num=(1, 2 3 a 3 b)
输出初始化
+=
追加元素
unset
删除数组,或元素[通过下标删除]
随堂练习
1~100的偶数和
- $[ ]可用来做整数运算
- seq效率稍低
暴力求素数
- 函数的return值
- 通过$?获得,在调用函数后echo $?即可,但是return值有范围限制0~255
- 通过命令替换符``取到
- 注意对循环变量i的冲突问题:定义局部变量
- 调试程序
- 习惯:适当的echo输出
- 全局调试: bash -x *.sh
- 局部调试:set -x [代码块] set +x
素数筛
- 方式一方便操作素数,且输出时可减少判断
- 方式二还可以操作合数