Shell编程
1. 入门须知
-
每一个脚本文件里,首行内容一定是:#!bin/bash 表明用哪种shell编译
-
执行脚本文件时需要有对应的权限 ,可以直接在要执行的文件前加上 sh eg:
sh ./usr/hello.sh
-
echo 相当于写代码用的输出语句 return
-
变量命名规范
-
变量名可以由数字,字母,下划线组成,不能以数字开头
-
编写脚本文件时,给变量名赋值时不要用空格:变量名=变量值
-
将命令返回值赋给变量:A=$(date) # 将 date 命令的返回值赋给变量A
-
-
:<<! 内容 ! # shell 脚本的多行注释: :<<! 和 ! 都要独占一行
2. 变量
linux shell 中变量分为两种:系统变量和用户变量
- 系统变量类似于windows中的系统变量,一般全为大写字母
- 用户变量就是在编写一个脚本文件时申明的变量,不可以被全局共享;
基本语法
-
定义变量: 变量名=变量值
-
撤销变量: unset 变量名 # 释放该变量
-
定义静态变量 readonly 变量名=变量值 # 静态变量不可被 unset
3.环境变量
语法
-
export 变量名=变量值 # 将变量名导出为系统变量,相当于windows的系统变量
-
source 配置文件名 # 将修改后的配置文件刷新,使之立即生效
-
echo $变量名 # 查询系统变量名对应的值
导出为系统变量后,不同的shell文件都可以访问
4. 位置参数变量
基本语法
-
$n # 表示接收命令行中的第几个参数,第0个参数是shell文件本身, $1表示接受第1个参数,超过9之后,用 ${10}这样的格式
-
$* # 接受所有的参数,并且把所有参数看成一个整体
-
$@ # 接收所有的参数,不过把单独处理每一个参数
-
$# # 表示接收的参数数量
举例
脚本内容为:
#!bin/bash
echo "第0个参数是$0, 第一个参数是$1, 第二个参数是$2"
echo "所有参数=$*"
echo "所有参数单独处理为:$@"
echo "参数的总数量为:$#"
输入的命令行为:
sh ./demo.sh 123 45
输出的内容为:

5.预定义变量
就是shell 设计者预先定义好的变量,可以直接在脚本中使用。
基本语法
-
$$ # 返回当前进程的进程号(PID)
-
$! # 返回后台运行的最后一个进程的进程号
6.运算符
-
三种写运算式的方法: $((运算式)) $[运算式] expr m + n
-
用第三种方式时:运算式之间需要有空格
-
expr 方式中的乘,除,取余:\ * / %
7.流程控制
7.1 基本语法
if [ 条件表达式1 ] # 条件表达式的前后都必须有一个空格
then
条件1成立时,需执行的代码块
elif [ 条件表达式2 ]
then
条件2成立时,需执行的代码块
fi
if [ ] # 返回false ,即使位空也得留一个空格,不然会有语法错误
7.2 常用判断条件
-
===== 判断字符串是否相等
-
两个整数的比较:
-
[ A -lt B ] # 判断A是否小于B
-
[ A -le B ] # 判断A是否小于等于B
-
[ A -eq B ] # 判断A是否等于B
-
[ A -gt B ] # 判断A是否大于B
-
[ A -ge B ] # 判断A是否大于等于B
-
[ A -ne B ] # 判断A是否不等于B
-
-
文件权限判断:
-
[ -r ./shcode/aaa.txt ] # 判断某个文件是否有读的权限
-
[ -w ./shcode/aaa.txt ] # 判断某个文件是否有写的权限
-
[ -x ./shcode/aaa.txt ] # 判断某个文件是否有执行的权限
-
-
文件类型判断:
-
[ -f ./shcode/aaa.txt ] # 判断某个文件是否(存在且为常规文件)
-
[ -e ./shcode/aaa.txt ] # 判断某个文件是否存在
-
[ -d ./shcode ] # 判断某个文件是否(存在且为一个目录)
-
7.3 switch-case语句
case $A in
"值1") # 若变量A的值等于 值1
代码块1 # 则执行代码块1,不需要缩进
;; # 一个分支的结束符号
"值2")
代码块2
;;
*) # 剩余其他所有情况
代码块3 # 如果不满足上面列出的情况 则执行代码块3
;;
esac # 结束 switch-case 语句
7.4 for循环
for循环有两种表达方式:
-
for i in 值1 值2 值3 值4 do 代码块 done
-
for ((i=1;i<=10;i++)) # 第二种方式类似于高级语言 do 代码块 done
7.5 while循环
while [ 条件表达式 ] # 关键字while和括号间得有一个空格,条件表达式和前后括号间也必须有一个空格
do
代码块
done
8. read读取控制台输入
read 选项 参数
- 选项:
- -p 表示等待输入值时给的提示
- -t 表示等待的时间,如果超过时间还没输入 程序就自动往下执行
- 参数:设置参数名,将输入的参数赋值给参数名
read -t 10 -p "请输入NUM1的值:" NUM1
# 上面这行命令的含义是:等待用户输入一个值,并把它赋值给变量NUM1,而且等待输入的时间不能超过10秒
9. 函数
函数有系统函数和自定义函数,类似于其他语言中的定义。
9.1 系统函数
-
basename 路径 后缀 # 用于查找某个文件名,如果填了后缀参数,则回返回没有后缀的文件名
basename /Users/ymy/papers/aaa.sh

basename /Users/ymy/papers/aaa.sh .sh

-
dirname 绝对路径 # 用于返回某个文件的绝对路径,其实和 basename刚好相反
dirname /Users/ymy/papers/aaa.sh

9.2 自定义函数
[ function ] 函数名[()]
{
代码块;
[return int;] # 若有返回值则加上这条语句
}
举例:定义一个做加法的函数,从用户输入得到两个加数
#!bin/bash
# 函数定义
function getSum(){
SUM=$[$n1 + $n2]
echo "总和为:$SUM"
}
# 读取输入的值
read -p "输入两个加数:" n1 n2
# 函数调用
getSum $n1 $n2
