在实习的时候用到了shell脚本,并且在面试中手撕代码时也让写过脚本,所以系统的学习了一下shell编程基础,对脚本编程的基础有了一些了解,主要源于bilibili上的视频,有些地方加了一些自己的理解和代码。
第1章 shell概述shell就是一个用户与操作系统交互的解释器,接收用户命令,然后调用操作系统。shell还是一门脚本编程语言,我们可以使用它编写脚本完成很多操作。
Linux提供的shell解析器有很多,可以使用cat /etc/shells命令查看,centos和Ubuntu的默认解析器都是/bin/bash。
第2章 Shell脚本入门/bin/sh是/bin/bash的软连接。
一般在编程中使用hello world来学习一门新的语言,下面使用shell来实现hello world,从而了解shell脚本的格式,如何运行。
- 编写程序hello.sh
#!/bin/bash echo "Hello World"
注:脚本以#!/bin/bash开头,指定解析器,在第一章我们看了有哪些解析器
- 执行脚本
bash hello.sh 或者 chmod +x hello.sh ./hello.sh
注:第一种是bash去解释脚本,所以脚本本身不需要权限,第二种是脚本需要运行,所以脚本本身需要权限。
第3章 变量 1.系统预定义变量系统预定义变量是系统预先定义好的某些变量,代表一些特定的意义:如$HOME、$PWD、$SHELL、$USER。系统一启动,就会给他们赋值。
2.自定义变量 1)基本定义我们可以通过变量名=值来定义变量
如果我们不想使用这个变量了,可以使用unset 变量名来进行一个撤销
如果声明一个静态变量,可以在声明的时候加一个readonly关键字,如果加了readonly就不能撤销。
使用export关键字可以将其设为全局变量,供其他shell程序使用
2)定义规则可以参考其他语言的变量定义,但是也有一些不同的地方,主要有
等号两侧不能有空格
bash中,变量默认都是字符串类型,无法直接进行数值运算
变量的值如果有空格,需要使用双引号或者单引号引起来。
3.特殊变量特殊变量是指我们在运行程序的时候用到的一些变量,它的值代表程序的一些运行情况。
1.$n
n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
比如在第一章的脚本hello.sh中,进行一个简单的修改
#!/bin/bash echo "$0" ./hello.sh nihao
2.$#
获取所有输入参数个数,不包括脚本本身。
#!/bin/bash echo "$#" ./hello.sh nihao
3.$*、$@
$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待,可以遍历取出每一个变量
4.$?
最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
上面的所有命令执行完成后,使用这个命令发现都是执行成功的,所以就是0;
第4章 运算符第二章中说过bash中变量赋值都是字符串,比如
所以我们需要在运算时使用运算符,有两种形式,$((运算式))或者$[运算式],比如在上面的操作中,我们加上这两种形式,就可以进行数据的运算。
第5章条件判断条件判断并不是if语句,而是if语句或者是while等关键字后面的布尔值,条件判断有两种语法,test condition还有[condition]条件不是空的就是true。
常用的条件如下:
字符串比较 =
整数比较 -lt小于 -le小于等于 -eq等于 -gt大于 -ge大于等于 -ne不等于
文件权限比较 -r -w -x
按照文件类型比较 -f文件 -e文件存在 -d文件存在并且是一个目录
多条件判断:&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令
第6章 流程控制(重点)流程控制主要有四部分,if、case语句、for循环、while循环。
1.if判断if [ 条件判断式 ];then 程序 elif [ 条件判断式 ];then 程序 else 程序 fi
注:
[ 条件判断式 ],中括号和条件判断式之间必须有空格
if 后要有空格
案例:
#!/bin/bash
if [ $1 -eq "1" ];then
echo "输入是1"
elif [ $1 -eq "2" ];then
echo "输入是2"
else
echo "输入是其它"
fi
2.case语句
case语句作用等同于Java或者C语言中的switch-case语句。
case $变量名 in "值1") 如果变量的值等于1,则执行程序1 ;; "值2") 如果变量的值等于2,则执行程序2 ;; *) 如果以上变量都不是,执行此程序 ;; esac
注:
1.case 行尾必须是in,每一个模式匹配必须以右括号“)”结束。
2.双分号“;;”表示命令序列结束,相当于java中的break.
3.最后的“*)”表示默认模式,相当于Java中的default。
案例:
#!/bin/bash
case $1 in
"1")
echo "输入是1"
;;
"2")
echo "输入是2"
;;
*)
echo "输入是其它"
;;
esac
3.for循环
1)语法1
for (( 初始值;循环控制条件;变量变化)) do 程序 done
案例:
#!/bin/bash s=0 for((i=0;i<=100;i++)) do s=$[$s+$i]#之前说过,在shell中变量都是字符串,要想加起来,必须加运算式,使用$[] 或者 $(())两种形式 done echo $s2)语法2
for 变量in 值1 值2 值3… do 程序 done
案例:打印所有的参数
#!/bin/bash
for i in $*
do
echo "hello $i "
done
注:
如果$* @ 不 加 引 号 , 他 们 的 作 用 相 同 , 如 果 加 了 引 号 , @不加引号,他们的作用相同,如果加了引号, @不加引号,他们的作用相同,如果加了引号,*就会看作一个整体,$@不看做一个整体,具体实例如下:
#!/bin/bash
for i in "$*"
do
echo "hello $i "
done
for i in "$@"
do
echo "hello $i"
done
4.while循环
while [ 条件判断式] do 程序 done
案例:
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
第7章read读取控制台输入
read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数
变量:指定读取值的变量名
案例:指定时间内输入爆炸指令,否则取消
#!/bin/bash read -t 7 -p "输入爆炸指令 " NAME echo $NAME第8章函数 1.系统函数
basename
basename [string / pathname] [suffix] basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
注:
1.basename后面可以跟一个字符串,也可以跟一个实际的路径,也就是说string可以是计算机中不存在的某个文件。
2.suffix后缀是可选的,如果指定了后缀,后缀会被去掉
案例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J32GtZiP-1636173045469)(D:oneDrive - stu.qlu.edu.cn2-大数据8-shellimgsimage-20211106121306850.png)]
第二个指定了后缀,所以在最终的输出结果中就没有.txt后缀。
dirname
dirname 文件绝对路径 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)),与basename正好相反。
案例:
2.自定义函数基本语法:
[ function ] funname[()]
{
Action;
[return int;]
}
funname
注:
1.必须在调用之前先声明,否则会报错
2.函数返回值只能通过$?系统变量获得,可以显示加return返回,如果不加,则以最后的一条命令添加,return 后面跟数值n(0-255)。
案例:计算两个数的和
#!/bin/bash
function sum()
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
基础篇就到这里,实战篇会总结一下自己实习的使用,结合看得视频中的一些例子,使用一些函数及shell工具来处理一些简单的事情。



