目录
知识点1【shell的概述】(了解)
1、脚本的概述
C语言是编译语言,编程后用到编译器进行编译,shell是脚本语言,编程后通过解析器可以直接运行脚本程序。
shell的两层含义:shell解析器(软件)、shell语言(语言)
shell从语言的角度 批处理语言
linux下常见的解析器:sh、ash、bash
brightsky@Bright-SKY:~$ echo $SHELL
/bin/bash
linux中通过打印环境变量可以查看使用的shell解析器
2、创建一个脚本
brightsky@Bright-SKY:~$ vi myshell.sh
通过任何一个编译器创建一个shell脚本,后输入以下脚本:
#!/bin/bash
echo "hello shell"
3、如果脚本文件没有“可执行权限”,需要加上可执行权限x
权限修改命令使用chmod:
chmod u+x xxx.sh
brightsky@Bright-SKY:~/codes/blog$ ls -l shell00.sh
-rw-rw-r-- 1 brightsky brightsky 30 7月 4 12:42 shell00.sh
brightsky@Bright-SKY:~/codes/blog$ chmod u+x shell00.sh
brightsky@Bright-SKY:~/codes/blog$ ls -l shell00.sh
-rwxrw-r-- 1 brightsky brightsky 30 7月 4 12:42 shell00.sh
4、./00_shell.sh执行脚本
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
hello shell
5、单个#表示注释
#!/bin/bash
echo "hello shell"
# echo "hello #" 注释
6、脚本的三种运行方式
./shell00.sh 使用#!指定的解析器 如果不存在使用系统默认解析器
bash shell00.sh 明确使用bash解析脚本 #!指定的解析器优先级低于bash
. shell00.sh 使用默认解析
知识点2【shell的变量】(了解)
自定义变量、环境变量、预设变量
1、自定义变量
#!/bin/bash
num="hello"
echo $num #$num取num的值
num=100
echo "num=$num"
给变量赋值的时候 =两边不能有空格
取消变量
#取消变量
unset num
echo "num=$num" 无法识别num的值
获取键盘输入 read
#!/bin/bash
#获取键盘输入
echo "请输入num的值:"
read num
echo "num=$num"
#提示 并 获取键盘输入
read -p "请输入num的值:" num
echo "num=$num"
#获取多个变量的值
read -p "请输入两个值:" data1 data2
echo "data1=$data1"
echo "data2=$data2"
只读变量
#!/bin/bash
#定义只读变量
readonly num=10 #注意 不要加空格 不要加空格 不要加空格
num=100 #只读变量不允许赋值
echo "num=$num"
#./shell00.sh: 行 5: num:只读变量
#num=10
2、环境变量
我们在当前终端导出的环境变量在其他终端是找不到的,因为每个终端开启时只是拷贝了一份系统环境变量,并不是直接使用的系统环境变量。
#!/bin/bash
#导出环境变量num
export num=100
echo "num=$num"
所有的环境变量尽量大写
查看环境变量的指令:env
~/.bashrc (每个用户 都拥有独立的.bashrc) 改文件的配置信息 针对与 当前用户
/etc/profile 所有用户共享的配置文件
如果我们希望修改的环境变量在当前用户访问不受终端影响,我们可与将环境变量配置到~/.bashrc中,当我们用当前用户登录系统时会自动运行这个脚本进行环境变量配置
如果我们希望修改的环境变量在任何用户都可以访问并且不受终端影响,我们可与将环境变量配置到/etc/profile中,当我们登录系统时会自动运行这个脚本进行环境变量配置
当修改文件后,可以直接使用source重新加载配置文件,如 source ~/.bashrc重新加载~/.bashrc
brightsky@Bright-SKY:~/codes/blog$ source ~/.bashrc
欢迎来到Brightsky个人空间~~
3、环境变量
$#:传给 shell 脚本参数的数量
$*:传给 shell 脚本参数的内容
$1、$2、$3、...、$9:运行脚本时传递给其的参数,用空格隔开
$?:命令执行后返回的状态
"$?"用于检查上一个命令执行是否正确(在 Linux 中,命令退出状态为 0 表示该命令正确执行,任何非 0 值表示命 令出错)。
$0:当前执行的进程名
$$:当前进程的进程号 "$$"变量最常见的用途是用作临时文件的名字以保证临时文件不会重复
#!/bin/bash
#打印参数的数量
echo "参数的数量:$#"
echo "参数的内容:$*"
echo "第1个参数:$1"
echo "第2个参数:$2"
echo "第3个参数:$3"
echo "第4个参数:$4"
echo "上条语句执行状态:$?"
echo "当前的进程名:$0"
echo "当前的进程号:$$"
read num #仅仅是阻塞一下而已
#brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
#参数的数量:0
#参数的内容:
#参数1:
#参数2:
#参数3:
#参数4:
#上一语句的执行状态:0
#当前进程名:./shell00.sh
#当前的进程号:5707
#brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh 你好 我是 Brightsky 大家好
#参数的数量:4
#参数的内容:你好 我是 Brightsky 大家好
#参数1:你好
#参数2:我是
#参数3:Brightsky
#参数4:大家好
#上一语句的执行状态:0
#当前进程名:./shell00.sh
#当前的进程号:5716
知识点3【脚本的特殊用法】(了解)
1、""(双引号):包含的变量会被解释
2、''(单引号):包含的变量会当做字符串解释
#!/bin/bash
num=100
echo "num=$num" #$num能解释
echo 'num=$num' #$num不能解释
#num=100
#num=$num
3、``(数字键 1 左面的反引号)
反引号中的内容作为系统命令,并执行其内容
#!/bin/bash
num=100
echo "num=$num" #$num能解释
echo 'num=$num' #$num不能解释
echo "today is `date`"
#brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
#num=100
#num=$num
#today is 2021年 07月 04日 星期日 13:20:35 CST
4、\转义字符
需加-e 转义
#!/bin/bash
echo "###\n###"
echo -e "###\n###"
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
###\n###
###
###
5、(命令序列):
由子 shell 来完成,不影响当前 shell 中的变量
#!/bin/bash
num=100
(
num=10
echo "子shell中的num=$num"
)
echo "当前shell中的num=$num"
#子shell中的num=10
#当前shell中的num=100
6、{命令序列}
在当前 shell 中执行,会影响当前变量
#!/bin/bash
num=100
{
num=10
echo "{}里面的num=$num"
}
echo "{}外面的num=$num"
知识点4【条件测试语句】(了解)
1、条件测试的概述:
关键字:test
第一种语法: test condition
第二种语法:[ condition ]
文件测试、字符串测试、数字测试、复合测试
2、文件测试
文件测试:测试文件状态的条件表达式
-e 是否存在 -d 是目录 -f 是文件 -r 可读 -w 可写 -x 可执行 -L 符号连接 -c 是否字符设备 -b 是否块设备 -s 文件非空
#! /bin/bash
read -p "please input a filename >>>" FILE
test -e $FILE
echo "存在? $?"
test -s $FILE
echo "非空? $?"
test -r $FILE
echo "可读? $?"
test -w $FILE
echo "可写? $?"
test -x $FILE
echo "可执行? $?"
[ -s $FILE ]
echo "非空? $?"
[ -r $FILE ]
echo "可读? $?"
[ -w $FILE ]
echo "可写? $?"
[ -x $FILE ]
echo "可执行? $?"
test -b $FILE
echo "是块设备文件? $?"
test -c $FILE
echo "是字符设备文件? $?"
test -d $FILE
echo "是目录文件? $?"
test -f $FILE
echo "是普通文件? $?"
test -L $FILE
echo "是软连接文件? $?"
test -S $FILE
echo "是嵌套字文件? $?"
test -p $FILE
echo "是管道文件? $?"
please input a filename >>>shell00.sh
存在? 0
非空? 0
可读? 0
可写? 0
可执行? 0
非空? 0
可读? 0
可写? 0
可执行? 0
是块设备文件? 1
是字符设备文件? 1
是目录文件? 1
是普通文件? 0
是软连接文件? 1
是嵌套字文件? 1
是管道文件? 1
3、字符串测试
test str_operator “str”
[ str_operator “str” ]
test “str1” str_operator “str2”
[ “str1” str_operator “str2”]
其中 str_operator 可以是:
= 两个字符串相等
!= 两个字符串不相等
-z 空串 -n 非空
#! /bin/bash
read -p "请输入第一个字符串" str1
read -p "请输入第二个字符串" str2
test -n $str1
echo "str1 非空:$?"
[ -n $str2 ]
echo "str2 非空:$?"
test $str1 = $str2
echo "相等:$?"
[ $str1 != $str2 ]
echo "不等:$?"
请输入第一个字符串123
请输入第二个字符串321
str1 非空:0
str2 非空:0
相等:1
不等:0
4、数值的测试
测试数值格式如下:
test num1 num_operator num2
[ num1 num_operator num2 ]
num_operator 可以是:
-eq 数值相等
-ne 数值不相等
-gt 数 1 大于数 2
-ge 数 1 大于等于数 2
-le 数 1 小于等于数 2
-lt 数 1 小于数2
#! /bin/bash
read -p "请输入第一个值" data1
read -p "请输入第二个值" data2
test $data1 -ge $data2
echo "数值大于等于:$?"
[ $data1 -lt $data2 ]
echo "小于:$?"
请输入第一个值123
请输入第二个值321
数值大于等于:1
小于:0
5、复合测试
1、命令执行控制(逻辑与 逻辑或)
&&:
command1 && command2
&&左边命令(command1)执行成功(即返回 0)shell 才执行&&右边的命令
||:
(command2) || command1 || command2
||左边的命令(command1)未执行成功(即返回非 0)shell 才执行||右边的命令(command2)
#! /bin/bash
read -p "请输入0-100的数" data
[ $data -ge 0 ] && [ $data -le 100 ]
echo "0-100:$?"
请输入0-100的数87
0-100:0
2、多重条件判定
知识点5【 控制语句 】(了解)
1、if控制语句
格式一:
if [ 条件1 ];then
语句1
else
语句2
fi
格式二:
if [ 条件1 ];then
语句1
elif [ 条件2 ];then
语句2
else
语句3
fi
案例1:
请输入你的指令y表示继续 n表示退出
#! /bin/bash
read -p "请输入y/n:" y
if [ $y = "y" ];then
echo "输入$y, 继续"
elif [ $y = "n" ];then
echo "输入$y, 退出"
else
echo "输入非法指令"
fi
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入y/n:n
输入n, 退出
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入y/n:y
输入y, 继续
案例2:
请输入文件夹的名字,判断该文件夹 是否存在 如果存在进入该文件夹,如果不存在,请提示输入y创建改文件夹 并进入,输入n退出
#!/bin/bash
read -p "请输入文件夹的名字:" dir
#判断文件夹是否存在
if [ -e $dir -a -d $dir ];then
#存在 进入文件
cd $dir
echo "已进入文件夹:$PWD"
else
#不存在 输入y创建并进入 输入n退出
read -p "是否创建$dir文件夹y/n:" y
if [ $y = "y" ];then
mkdir $dir
cd $dir
echo "已进入文件夹:$PWD"
elif [ $y = "n" ];then
echo "立即退出"
exit 1
fi
fi
2、case 控制语
case $变量名称 in
"第一个变量内容")
程序段一
;;
"第二个变量内容")
程序段二
;;
*)
其他程序段
;;
esac
#! /bin/bash
read -p "请输入0-3的数值:" data
case $data in
0)
echo "data = 0"
;;
1)
echo "data = 1"
;;
2)
echo "data = 2"
;;
*)
echo "输入数值非法"
;;
esac
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入0-3的数值:2
data = 2
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入0-3的数值:10
输入数值非法
#! /bin/bash
read -p "请输入你的选择:" choice
case "$choice" in
Y | YES | yes | y | Yes)
echo "It is right"
;;
N* | n*)
echo "It is wrong"
;;
*)
exit 1
esac
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入你的选择:y
It is right
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
请输入你的选择:ne
It is wrong
3、for循环语句
格式一:
for (( 初始值; 限制值; 执行步阶 ))
do
程序段
done
初始值:变量在循环中的起始值
限制值:当变量值在这个限制范围内时,就绩效进行循环
执行步阶:每做一次循环时,变量的变化量
这里插入一个知识点:declare
declare 是 bash 的一个内建命令,可以用来声明 shell 变量、设置变量的属性。declare 也可以写作 typeset。
declare -i s 代表强制把 s 变量当做 int 型参数
案例1:求0~100的和
#! /bin/bash
declare -i i=0
declare -i sum=0
for (( i=0,sum=0; i<=100; i++ ))
do
sum=$sum+$i
done
echo "sum=$sum"
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
sum=5050
格式二:
for var in con1 con2 con3 ...
do
程序段
done
第一次循环时,$var的内容为con1
第二次循环时,$var的内容为con1
第三次循环时,$var的内容为con1
....................
#! /bin/bash
for data in 1 2 3 4 5
do
echo "data=$data"
done
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
data=1
data=2
data=3
data=4
data=5
案例1:判断当前路径下的文件是否是文件或目录
#! /bin/bash
for filename in `ls`
do
if [ -f $filename ];then
echo "$filename是普通文件"
elif [ -d $filename ];then
echo "$filename是文件夹"
fi
done
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
a.out是普通文件
c00.c是普通文件
c01.c是普通文件
c02.c是普通文件
c03.c是普通文件
c04.c是普通文件
c05.c是普通文件
c06.c是普通文件
c07.c是普通文件
c08.c是普通文件
core是普通文件
c.txt是普通文件
shell00.sh是普通文件
4、while循环语句
while [ condition ]
do
程序段
done
当confition成立的时候进入while循环,直到condition不成立时才退出循环。
#! /bin/bash
declare -i i=0
declare -i sum=0
while [ $i -le 100 ]
do
sum=$sum+$i
i=$i+1
done
echo "sum=$sum"
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
sum=5050
5、until语句
until [ conditon ]
do
程序段
done
这种方式与while恰恰相反,当condition成立的时候退出循环,否则继续循环。
#! /bin/bash
declare -i i=0
declare -i sum=0
until [ $i -gt 100 ]
do
sum=$sum+$i
i=$i+1
done
echo "sum = $sum"
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
sum = 5050
6、break continue
break:
break 命令允许跳出循环。 break 通常在进行一些处理后退出循环或 case 语句
contiune:
continue 命令类似于 break 命令 只有一点重要差别,它不会跳出循环,只是跳过这个循环步骤
知识点6【 函数 】(重要)
1、函数的定义形式
function my_add()
{
# 判断两个参数
if [ $# -eq 2 ];then
return $1+$2
else
echo "必须是两个参数"
fi
}
2、函数的调用
my_add $data1 $data2
3、完整代码
#!/bin/bash
# 函数的定义
function my_add()
{
# 判断两个参数
if [ $# -eq 2 ];then
((a=$1+$2))
return $a
else
echo "必须是两个参数"
fi
}
read -p "请输入两个数值:" data1 data2
#函数调用
my_add $data1 $data2
#获取函数的返回值
echo "函数的结果:$?"
4、shell函数分文件
06_fun.sh
#!/bin/bash
# 函数的定义
function my_add()
{
# 判断两个参数
if [ $# -eq 2 ];then
a=`expr $1 + $2`
return $a
else
echo "必须是两个参数"
fi
}
06_shell.sh
#!/bin/bash
# 包含其他脚本内容
source 06_fun.sh
read -p "请输入两个数值:" data1 data2
#函数调用
my_add $data1 $data2
#获取函数的返回值
echo "函数的结果:$?"
知识点7【变量的扩展】
1、判断变量是否存在
#! /bin/bash
#${num:-val} 如果num存在, 整个表达式的值为num, 否则为val
echo ${num:-100} #100
num=200
echo ${num:-100} #200
#! /bin/bash
#${num:=val} 如果num存在, 整个表达式的值为num, 否则为val, 并将num赋值为al
echo ${num:=100} #100
echo "num=$num" #100
2、字符串的操作
#! /bin/bash
str="hehe:haha:xixi:lala"
#测量字符串长度 {#str}
echo "str长度为:${#str}" #19
#从下标为3的位置提取${str:3}
echo ${str:3} #"e:hehe:xixi:lala"
#从下标为3的位置提取长度为6字节
echo ${str:3:6} #"e:haha"
#${str/old/new} 用new替换出现的第一个old
echo ${str/:/#} #"hehe#haha:xixi:lala"
#${str//old/new} 用new替换所以old
echo ${str//:/#} #"hehe#haha#xixi#lala"
brightsky@Bright-SKY:~/codes/blog$ ./shell00.sh
str长度为:19
e:haha:xixi:lala
e:haha
hehe#haha:xixi:lala
hehe#haha#xixi#lala