作业:输入一个年份,判断是否是润年
一、shell脚本
Shell:贝壳 保护内核
C++:属于编译型语言,需要使用编译器gcc,执行速度快,不可以和内核交互
Shell:解释型语言(可以和内核直接交互),需要使用解析器bash,执行速度慢
Shell:shell的本质是指令的集合,但是指令需要默许一点的逻辑关系,在使用解析器解析脚本文件时,按照一定的逻辑关系进行执行
二.Shell脚本的创建
1、vim **.sh 创建
#!+tab补全 ——>#!/bin/bash
#!:表示这是一个脚本文件
/bin/bash:使用的解析器bash
2、注释
#:单行注释
/shell中没有多行注释,但是可以用指令模拟多行注释(
<<a
A
三、bash解析器
1、查看使用的解析器:
- echo $SHELL
- cat etc/shells
2、认识解析器
bash:用于Ubuntu和debain操作
sh:最早的解析器,和终端交互较差
dash:类似sh
csh:类似c语言,需要许可证
- bash ***.sh 可以不具备可执行权限
在当前终端下的终端进行,把结果返回给当前终端
- chomd 777 ***.sh 需要具备权限
./***.sh
在当前终端下的终端进行,把结果返回给当前终端
- source ***.sh 可以不具备可执行权限
直接在当前终端执行
四、修改环境变量
1.查看环境变量
指令:env
SHELL=/bin/bash
HOME=/home/ubuntu
USERNAME=ubuntu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:sbin:/bin:/usr/games:/usr/local/games:/snap/bin
OLDPWD=/home/ubuntu/Pictures
2、对当前终端有效
1、添加对PATH指定路径
Export PATH =$PATH:/home/ubuntu/Pictures/7.16/
| | | |
| | | 添加的指令路径
| | |
| | 展开环境变量的值
| 环境变量
类似extern
3、对当前用户有效
1、在~/.bashrc文件中添加以下语句
export PATH=$PATH:
2、使修改的文件生效
source ~/.bashrc
3、为文件添加可执行权限
chmod 777 ***.sh
4、执行
文件名
4、对所有用户有效
1、在/etc/bash.bashrc文件中添加以下语句
export PATH=$PATH:
2、使修改的文件生效
source/etc/bash.bashrc 或者重启
3、为文件添加可执行权限
chmod 777 ***.sh
4、执行
文件名
5、对所有用户有效
1、在/etc/profile文件中添加以下语句
export PATH=$PATH:
2、使修改的文件生效
source/etc/profile 或者重启
3、为文件添加可执行权限
chmod 777 ***.sh
4、执行
文件名
6、对所有用户有效
1、在/etc/environment文件中添加以下语句
export PATH=$PATH:
2、使修改的文件生效
source/etc/environment 或者重启
3、为文件添加可执行权限
chmod 777 ***.sh
4、执行
文件名
五、shell变量
1、shell变量的定义格式
1.shell的变量没有数据类型,默认是字符串
2.shell的变量默认是全局变量
1、格式:
变量 error
变量= 定义变量值为空
变量=初始化的值 定义变量值为初始化的值
Eg:
a shell认为是一个指令,报错
a= 定义变量值a为空
a=100 定义变量a值为100
2.shell变量定义以及初始化
1. shell初始化的值=号的左右两端不允许存在空格,认为是一个指令
1.格式:
变量=初始化的值
变量= “初始化的值”
变量=‘初始化的值‘
2.初始化的值没有空格
a=hello
a=”hello”
a=’hello’
3、初始化的值存在空格(有无引号)
a=hello world error
a=”hello world”
a=’hello world’
4、使用变量对另一个变量初始化(单引号和双引号的区别)
a=hello
b=$a >b=hello
b=’$a’ >b=$a
b=”$a” >b=hello
5、建议在引用变量值的时候使用${}
a=hello
b=world
c=$a$b >helloworld
c=$aworld” >把aworld看成一个整体
c=${a}world >helloworld
3、shell变量的引用
格式1: $变量
格式2:${变量} 建议
var=hello
echo $var / echo ${var}
4、位置变量
位置变量:类似C语言的argc argv,用来接收外部输入的字符串
作用于函数的传参
$0 文件名
$1 终端输入的第一个字符串
……
${n} 第n个字符串
5、预定义变量
$* 终端输入的所有字符串,不包括文件名
$@ 终端输入的所有字符串,不包括文件名
$# 终端输入字符串的个数
$$ 当前终端的进程号
$? 获取上一行指令的结果,如果上一行指令运行成功则为0,失败则为非0多用于接收 函数的返回值
6、命令置换
命令置换:把指令的结果赋值给变量
格式1:
变量=$(指令)
变量=·指令·
7、特殊符号
1. readonly 只读
2. unset 取消变量,不可以取消只读类型的变量
3、 local 定义局部变量
六、输入输出
1、输出echo
echo 字符串 echo hello
echo '字符串' echo 'hello'
echo "字符串" "echo hello"
a=100
echo $a >100
echo ' $a' >$a
echo "$a" >100
echo -n “hello world” >取消换行
echo -e "\thello world" >使转义字符起效果
2、输入 read
1.输入一个或多个变量,数据元素之间以空格,tab表示数据输入的结束,回车表示read的结束
read a
read a b c d
2.显示提示语句
read -p "字符串" a
3.输入n个字符自动结束
read -n 5 a
4.n秒不输入自动结束
read -t 5 a
5.隐藏输入 ,密码
read -s a
6、输入数组
read -a arr
echo ${arr[0]}
七、shell的字符串
1、c语言的字符串是一个数组,shell的字符串是一个变量
1、计算字符串长度
格式:${#str}
2、字符串拼接
b=world c=$a$b
3、字符串截取
1、正向截取
${str:m} 从左到右,从0开始,截取第m以后的所有字符串
${str:m:n} 从左到右,从0开始,截取第m开始n个字符串
2、反向截取
${str:0-m} 从右到左,从1开始,截取第m以后的所有字符串
${str:0-m,n} 从右到左,从1开始,截取第m以后n个字符串
3、# ## %% %
string:分隔符
${str#*string} 从左到右,截取第一个分隔符后面的所有字符串
${str##*string] 从左到右,截取最后一个分隔符后面的所有字符串
${str%string*} 从右到左,截取第一个分隔符的前面所有字符串
${str%%string*} 从右到左,截取最后一个分隔符前面的字符串
str=www.baidu.com
${str#*.} baidu .com
${str##*.} com
${str%。*} www . baidu
${str%%.*} www
八、shell的数组
1、c语言中存在多维数组,shell中只有一维数组,不存在多维数组
2、shell中输入的每个元素是字符串
1、数组的定义格式以及初始化
1.数组的定义以及初始化
arr=(100 22 33 44)
2.she1l支持稀疏数组,数组长度为2
arr=([0]=100[3]=hello)
3.she1l的单个赋值
arr[0]=100
arr[3]=hello
4.追加赋值
arr=(11 22 33)
arr[3]=hello
5.数组拼接
a=(11 22)
b=(44 55 77)
c=(${a[*]} ${b[*]})
c=(${a[@]} ${b[@]})
2、数组的引用
arr=(11 22 33 44)
1.单个引用
${arr[index]}
2.引用所有数组元素,默认中间使用空格隔开
${arr[*]}
${arr[@]}
3.计算数组长度
${#arr[*]}
${#arr[@]}
4.计算某一个字符串的长度
${#arr[index]}
九、运算符
1.shell不擅长做算术运算,擅长字符串以及文件的相关操作
2.shell的运算符
(()):实现算术运算,关系运算,逻辑,条件,逗号等 针对整数
$[]:实现算术运算,关系运算,逻辑,条件,逗号等 针对整数
let :实现算术运算,关系运算,逻辑,条件,逗号等 针对整数
expr 实现字符串,关系运算,逻辑运算
1、(())
格式:((表达式))
引用:
((变量=表达式))
变量=$((表达式))
特点:
1.表达式的空格可有可无
2.表达式的$可有可无
3.(())可以实现任意复杂的运算:算数、关系、逻辑、条件等
4.(())可以实现自增或自减运算 ((a++))
5.(())可以实现幂运算
例:判断时分秒
输入时长 read -p "second" second
输出时间 echo $((second/3600))时$((second%3600/60))分$((second%60))秒
2、$[]
格式:变量=$[表达式]
特点:
1.表达式的空格可有可无
2.表达式的$可有可无
3.$[]可以实现任意复杂的运算:算数、关系、逻辑、条件等
4.$[]可以实现自增或自减运算 ((a++))
5.$[]可以实现幂运算
例:输入三个数,输出最大值
输入三个数 read -p "请输入三个数" a b c
判断最大值 max=$[(a>b&&a>c)?a:(b>a&&b>c?b:c)]
输出 echo max=$max
3、let
格式:
let 变量=表达式 不可存在空格
let"变量=表达式” 可以存在空格
特点:
1.表达式的空格可有可无
2.表达式的$可有可无
3.1et可以实现任意复杂的运算:算数、关系、逻辑、条件等
4.let可以实现自增或自减运算
5.let可以实现幂运算
4、expr
1.expr是一个指令,可以使用man手册查看
2.expr可以对整数(算数、关系、逻辑),字符串实现操作
格式:
变量=$(expr 表达式)
变量=·expr 表达式·
特点:
1.表达式的空格必须存在
2.表达式的$必须存在,在必要需要已添加""
3.expr可以实现算数,关系,逻辑,字符串运算
4.expr不可以实现自增或自减运算
5.expr不可以实现幂运算
i算数运算
格式: value=`expr $a (运算符) $b`
ii、关系运算
j
iii、逻辑运算
变量=·expr $a & $b·
iv、字符串运算
1.返回指定字符(串)在另一字符串中出现重复的字符个数
a=he
str=hello
value= 'expr match $str $a'
#a在str中相同字符的个数
2、字符串截取
str=www.baidu.com
value=`expr substr $str 5 5 ' baidu
3、查找字符在字符串中出现的下标,不存在返回0
str=hello a=l
value=`expr index $str $a `
4、计算字符串长度
str=hello world
value=`expr length $str`
十、shell的选择结构
C语言的选择结构:单分支if 双分支if..else 多分支if..else if switch
shell的选择结构:单分支if双分支ifelse 多分支if el if case..in
1、选择结构格式
单分支
if 表达式
then
shell语句
fi
执行流程:如果表达式为真,则执行shell语句,否则跳过
双分支
if 表达式
then
shell语句
else
shell语句2
fi
执行流程:表达式为真,则执行shell语句1,否则执行she11语句2
多分支
if 表达式
then
shell语句
elif 表达式2
then
shell语句2
…………
else
shell语句n
fi
执行流程:如果表达式1为真,则执行she11语句1,结束选择结构
如果表达式1为假,则判断表达式2,如果表达式2为真,则执行shel1语句2,结束选择结构
如果表达式2为假,则重复以上过程,如果所有表达式均为假,则执行else
2、test指令
一般if语句不直接和运算符结合使用,多和test指令结合
1.test是一个指令,必须存在空格,必须添加$必要时使用"
2.test指令实现:逻辑运算,整数关系,字符串,文件
3.test等价于[]
if [ 表达式 ]
then
shell语句
fi
if test 表达式
then
shell语句
fi
i.关系运算——>整数
eq:——> ==
gt:——> >
ge:——> >=
-lt:——> <
-le:——> <=
-ne:—— >!=
ii逻辑运算
if [ $a -ne 0 ]——》if[ $a ]
if[ $a -eq 0 ]——》if [ ! $a ]
if[ $a -ge 90 -a $a le 100]——》if[ $a -ge 90 ]&&[ $a -le 100 ]
if[ $a -lt 0 -o $a -gt 100 ]——》if[ $a -lt 0 ] ||[ $a -gt 100 ]