一、shell的功能
1.Linux操作系统的核心原理都是基于shell实现外层应用程序和内核以及硬件的通信,从而实现人对机器的控制。
2.shell的主要功能:
-
Linux系统管理和运维:例如批量增加/删除多个用户
-
文本处理
-
数值运算
-
整合其他软件/语言,搭建流程
3.shell的版本
(1)sh:最基础的shell
(2)bash:在sh的基础上增加了一下特性,最常用的shell。
(3)csh:类C的语法
(4)tcsh:csh增强版
使用echo $SHELL 查看系统默认使用的shell版本
cat /etc/shells 查看安装的所有shell版本
二、变量和注释
第一句#!/bin/bash,以#!紧接程序解释器路径/bin/bash的方式告诉计算机要用/bin/bash程序来解释执行我们的脚本
1.创建变量:a=字符、数值、数组等等内容,注意:=号两边不能有空格
2.使用变量:${变量名} 或 $变量名
3.打印变量:echo ${变量名} 或 echo $变量名
4.使用#来注释,多行注释使用EOF
5.变量作用域:
(1)全局变量(global variable),可以在当前Shell进程(即一个shell窗口)中使用,Shell中定义的变量默认就是全局变量
(2)局部变量(local variable),只能在函数内部使用,注意函数内部定义的变量也是可以在函数外生效,在变量名称之前加上local关键字定义所谓的局部变量
环境变量(environment variable),可以在子进程中使用,使用export命令将全局变量导出,那么它就在所有的子进程中也有效了,这称为“环境变量”。
6.常用系统变量
$0 表示当前shell脚本的文件名
$1 $2 当前shell脚本的位置参数
$# 传递到脚本的参数总个数
$? 上一个命令的执行结果,0是执行成功,非0是执行失败
7.只读变量:使用 readonly 命令定义只读变量,只读变量的值不能被改变。
8.删除变量:unset 变量名 unset 命令不能删除只读变量。
三、字符串操作
1.获取字符串的长度:${#变量名}
2.指定位置截取字符串
(1)echo ${变量名:4:5} 从第4个字符开始,截取5个字符。
(2)echo ${变量名:4} 从第4个字符.开始截取到最后
(3)echo ${变量名:0-3} 从倒数第三个字符截取到最后
echo ${变量名: -3} 另外的写法,一定要注意冒号和-3之间有空格
3.匹配字符串截取
net=hhwhoarewyou
(1)echo ${net#*w} 删除从左到右第一个遇到的字符及其左侧的字符
(2)echo ${net##*w} 删除从左到右最后一个遇到的字符及其左侧的字符(贪婪模式)
(3)echo ${net%w*} 删除从右向左第一个遇到的字符及其右侧的字符
(4)echo ${net%%w*} 删除从右到左最后一个遇到的字符chr及其右侧的字符(贪婪模式)
4.字符串替换
需要注意的是原变量并未修改
(1)echo ${变量/匹配字符/替换字符} 替换第一个匹配到的字符
(2)echo ${变量// 匹配字符/替换字符} 替换所有匹配到的字符
(3)${变量/#匹配字符/替换字符 只替换开头匹配的字符串
(4)${变量/%匹配字符/替换字符}只替换结尾匹配的字符串
5.删除字符串
(1)echo ${变量/要删除的字符/} 或echo ${变量/要删除的字符} 删除第一个匹配到的字符
(2)echo ${变量//要删除的字符/} 或echo ${变量//要删除的字符} 删除所有匹配到的字符
6.字符串拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
四、数组
1.类似于python中的列表,不过用()表示,只有一维数组
2.数组创建
(1)names=(Jerry Jane 赵四 刘能)
(2)names[0]=Jerry
names[1]=Jane
names[2]=赵四
names[3]=刘能
(3)name=([0]=Jerry [1]=Jane [2]=赵四 [3]=刘能)
(4) str=" Jerry Jane 赵四 刘能"
names=($str)
3.数组删除
list=(book food)
(1)echo ${list[@]#b*o} 每个元素,从左向右进行最短匹配
(2)echo ${list[@]##b*o} 每个元素,从左向右进行最长匹配
(3)echo ${list[@]%f*d} 每个元素,从右向左进行最短匹配
(4)echo ${list[@]%%f*d}每个元素,从右向左进行最长匹配
(5) unset list[0] 删除索引为0的元素 unset 数组名 删除整个数组
4.修改数组:数组名[索引]=修改的值
5.取值
(1)获取单个值:${数组名[索引]}
(2)获取整个数组:${数组名[@]} 或${数组名[*]}
${数组名[@]}得到是以空格隔开的元素,可以用在数组遍历中;${数组名[*]}得到的是一整个字符串。
6.其他操作
(1)获取数组长度: ${#days[@]} 或${#days[*]}
(2)获取数组的的索引:${!数组[@]}
(3)数组切片:${数组[@]:1:3}
(2)两个数组连接: 用()将多个数组连接在一起,()中各个数组用空格隔开。
days=(one two three four)
names=(tom jack)
days=(${days[@]} ${names[@]})
五、流程控制
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
(1)if语句
基本语法:if[条件];then;ellifelse;fi
n=$((2*3))
n1=$[3+2]
if test $n1 -eq $n
then
echo "两个数相等"
else
echo "两个数不等"
fi
(2)case语句
case ${n} in
1)echo "n===1";;
2)echo "n==2";;
3)echo "n==3";;
*)echo "n=!1,2,3";;
esac
(3)for循环
基本语法:
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
(4)while 循环
n=10
i=1
while [ ${n} -gt ${i} ]
do
echo $i
i=$((i+1))
done
(5)printf用法
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数
六、函数和运算
1.定义函数的两种方法
(1)函数名(){}
(2)function 函数名 {} 注意:函数名和{}之间必须有空格
2.函数返回值
(1)使用return返回:只能返回1-255的整数,
(2)使用echo返回数据
3.运算
(1)n=$((2*3))
(2)n=$[2+6]
(3)let n=1+3
(4)n=`expr 3 + 4`
(5)bc