Shell笔记
是什么?
- shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
- shell还是一个编程语言
解释器
- 通过输入
sudo cat /etc/shells
查看电脑上的shell解释器 - 可以看到我电脑上有7种shell解释器,其中bash和sh是较为常用的。
- 输入
echo $SHELL
查看系统默认shell解释器 - 因为我是mac系统,所以默认解释器是zsh,linux系统默认解释器是bash
脚本
脚本格式
- 以
#!/bin/bash
开头(指定解释器)
如何执行脚本
-
sh file_path 通过sh来执行脚本 bash file_path 通过bash来执行脚本 file_path 通过自己来执行脚本(需要有权限,可通过语句“chmod 777 file_path”来获得权限)
多命令操作
-
需求:在脚本地址的上一级创建一个txt文件,写入I am talent这句话。
-
#!/bin/bash cd .. touch test.txt echo "I am talent" >> test.txt
变量
常用系统变量
$HOME, $PWD, $SHELL, $USER
等
自定义变量
-
同python定义变量:变量=值
- 例如:
a=1
(等号两边不能有空格)
- 例如:
-
撤销变量:
unset 变量
-
定义静态变量(不能撤销):
readonly 变量
-
将变量提升为全局变量,可供其他Shell脚本调用:
export 变量
注意事项
- 变量名可以由字母、数字、下划线组成,但是不能以数字开头。环境变量建议大写
- 等号两侧不能有空格
- 变量默认均为字符串类型,不能直接数值运算
- 变量的值若有空格,需用引号括起来
特殊变量 $n
- 语法:$n
- n为数字,0代表该脚本名称,1-9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
- parameter.sh文件
特殊变量 $#
- 语法:$#
- 获取输入变量的个数,常用于循环
特殊变量 $* $@
- $*:该变量代表命令行中所有的参数,把所有参数看成一个整体
- $@:同上,但是把每个参数区分对待
特殊变量 $?
- $?:记录上一次命令是否正确执行,0表示正确执行了,非0表示执行失败
运算符
基本语法
$((运算式))
或$[运算式]
expr +,-,\*,/,%
加减乘除取余(运算符之间要有空格)
例子
- expr方法
- 计算3+2
- 计算(3+2)*4
- $[]方法
- 计算3+2
- 计算(3+2)*4
条件判断
基本语法
- [ 条件 ]
- 中括号内的左右两侧必须有一个空格
- 只要[]内有条件,则返回true,否则返回false
常用判断条件
-
两个整数之间的比较 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于 -
文件权限判断 -r 可读 -w 可写 -x 可执行 -
文件类型判断 -f 文件存在且常规文件 -e 文件存在 -d 文件存在且是目录
例子
-
检查文件test.sh是否具有写权限
[ -w test.sh ]
echo $?
0
-
多条件判断(&&表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令执行失败,才执行下一条命令)
-
[ condition ] && echo OK || echo notek OK [ condition ] && [ ] || echo notek notek
流程控制
if 判断
基本语法
-
if [ condition ];then code fi
-
if [ condition ] then code fi
例子
case 语句
基本语法
-
case $变量名 in "值1") code1 ;; "值2") code2 ;; *) code3 ;; esac
注意事项
- “;;”相当于break
- “*”相当于default
例子
for 循环
基本语法
-
for ((初始值;循环控制条件;变量变化)) do code done
-
for 变量 in 值1 值2 值3 ... do code done
例子
while 循环
基本语法
-
while [ 条件判断式 ] do code done
例子
read读取控制台输入
基本语法
read 选项 参数
- 选项:
- -p:指定读取值时的提示符
- -t:指定读取值时等待的时间(秒)
- 参数
- 变量:指定读取值所存放的变量名
例子
函数
系统函数
basename基本语法
basename [string/pathname] [suffix]
- 该命令会删除掉所有前缀包括最后一个‘/’字符,然后显示字符串
- suffix为后缀,若指定了,则会在显示字符串中的suffix给删除
dirname基本语法
dirname 文件绝对路径
- 该命令会从给定的绝对路径中删除文件名(非目录部分),返回剩下路径
自定义函数
基本语法
-
function 函数名() { code }