Shell基础
什么是shell?
shell是用户和操作系统内核交互的接口,可以使用shell编写脚本来自动执行一系列命令和操作。
shell执行方式
分类
1、在当前shell环境运行
1):./脚本
2):soucre 脚本
2、开启子shell环境运行
1):bash 脚本
2):sh 脚本
两者区别
1、子shell会开启新线程,当前shell不会
2、当前shell修改变量是永久性的,子shell则仅子shell内有效
3、当前shell运行速度快,子shell因为要创建子线程运行比前者慢
shell快速入门
1 2 3
| #!/bin/bash
echo 'hello-shell'
|
shell变量
什么是变量?
变量是内存中的一小块存储空间,存储自己指定的值,然后给这小块空间取个名字,当我们要用到值的时候通过变量的名字就能拿到对应的值。
shell变量分类
系统变量:系统本身定义好的,可以直接用
自定义变量:需要用户自己来定义
环境变量:应用运行时需要环境变量,我们不能每次都进入指定目录下运行,太过繁琐,只需要在/etc/profile下指定该应用的环境变量,这样在哪里都可以使用该应用了,例如JDK
预定义变量:获取命令行信息
shell变量的基本语法
1 2 3 4 5 6 7 8 9 10
| 变量名=值
unset 变量名
readonly 变量名=值
|
练习
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #!/bin/bash
name='Tom' age=1001
unset age
readonly sex='女'
time=`date`
data=$(date)
echo "$name-----------$age---------$sex-------------$time---------$data"
|
环境变量
1 2 3 4 5 6 7 8 9 10
| vim /etc/profile
exprot 变量名=值
source /etc/profile
echo $变量名
|
位置变量
$0:代表命令本身
$1-9:代表一到九的参数
${9以上的数字}:代表十或十以上的参数
$*:代表所有参数,看作一个整体
$@:代表所有参数,分别看待每一个参数
$#:代表参数的总个数
$?:返回上一次命令执行结果,0成功,非0失败
$$:表示当前shell的PID
$!:上一个后台进程的PID
$_:获取上次命令最后一个参数
1 2 3 4 5 6 7 8 9
| #!/bin/bash
echo "名字=======$1 || 年龄========$2"
echo "测试\$*========$*"
echo "测试\$@========$@"
echo "测试\$#=========$#"
|
shell运算式
shell中有三种运算格式
1 2 3 4 5 6 7 8
| #第一种 $((运算式))
#第二种,推荐使用 $[运算式]
#第三种,它的乘号用 \*,想得到它的值需要用 `` 符号括起来 变量名=`expr 值1 运算符 值2`
|
shell流程控制
if语句
判断给出的运算式执行相应操作
if语句基本格式
1 2 3 4
| if [ 条件判断式 ] then 操作 fi
|
常用判断比较符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 比较字符串用:=
#整数类比较 -lt:小于 -le:小于等于 -eq:等于 -gt:大于 -ge:大于等于 -ne:不等于
#权限类判断 -r:是否可读 -w:是否可写 -x:是否可执行
#文件类型判断 -f:判断文件是否存在且是一个常规文件 -e:判断文件是否存在 -d:判断文件是否存在且是目录
#逻辑运算符 &&:并且,左右结果必须都为真 ||:或者,左右任意一个结果为真即可 !:取反
|
练习
1 2 3 4 5 6 7 8
| #!/bin/bash
number=100
if [ $number -lt 200 ] then echo "$number小于200" fi
|
if多分支语法格式
1 2 3 4 5 6
| if [ 运算判断式 ] then 业务代码 elif [ 运算判断式 ] 业务代码 fi
|
练习
1 2 3 4 5 6 7 8 9 10 11
| #!/bin/bash
number=100
if [ $number -gt 200 ] then echo "$number大于200" elif [ $number -gt 50 ] then echo "$number大于50" fi
|
case语句
语法格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| case $变量 in "值1") 业务代码1 ;; "值2") 业务代码2 ;; "值3") 业务代码3 ;; *) 默认业务代码 ;; esac
|
练习
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/bin/bash
data=80
case $data in "90") echo "90分" ;; "80") echo "80分" ;; *) echo "没有对应分数" ;; esac
|
for循环
第一种语法格式
1 2 3 4 5
| #在列表值内都可循环 for 初始变量 in "值列表" do 业务代码 done
|
第二种语法格式
1 2 3 4
| for((初始变量;条件表达式;变量变化)) do 业务代码 done
|
第一种练习
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash
sum=0
for i in {1..100} do sum=$[$sum+$i] done
echo "1加到100等于======$sum"
|
第二种练习
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash
sum=0
for ((k=0;k<=100;k++)) do sum=$[$sum+$k] done
echo $sum
|
while循环
语法格式
1 2 3 4 5
| # [ ] 左右都有空格 while [ 条件表达式 ] do 业务代码 done
|
练习
1 2 3 4 5 6 7 8 9 10 11 12
| #!/bin/bash
sum=0 j=0
while [ j<100 ] do sum=$[$sum+$j] $j++; done
echo $sum
|
键盘录入
在shell中使用read命令来获取用户输入的信息。
语法格式
1 2 3 4 5
| read 选项 参数
#常用选项 -p:提示信息 -t:等待时间(秒)
|
练习
1 2 3 4 5 6 7 8 9
| #!/bin/bash
read -t 10 -p '请输入用户名:' name
read -t 10 -p '请输入年龄:' age
echo "输入信息:用户===$name;年龄===$age"
|
数组
什么是数组?
数组是一种存储多个值的数据结构,可以按索引访问。
数组分类
普通数组:索引是数字,有序
关联数值:索引是单词,以key-value形式存储,类似Map形势,无序,索引不能重复,值可以
普通数组
1 2 3 4 5 6 7 8 9 10 11
| 数组名=(值1 值2 值3 ...)
${数组名[*]}
${数组名[索引]}
${#数组名[*]}
|
关联数组
1 2 3 4 5 6 7 8
| #定义,先创建,再放值 declare -A 数组名 数组名=([索引1]=值1 [索引2]=值2 [索引3]=值3 ...)
#访问和普通数组一样 ${数组名[索引]} ${数组名[*]} ${#数组名[*]}
|
循环操作数组
插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
while read line do arr[++i]=$line done < /etc/profile
echo ${#arr[@]}
for((k=0;k<${#arr[@]};k++)) do echo ${arr[k]} done
declare -A arr i=0 while read line do arr["index_$i"]=$line ((i++)) done < /etc/profile
echo ${#arr[@]}
for((k=0;k<${#arr[@]};k++)) do echo "${arr["index_$k"]}" done
|
函数
什么是函数?
在shell中函数是一组可以重复使用的命令集合,可以接收参数并返回状态或值。
语法格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #第一种 function 函数名 { 业务代码 }
#第二种,推荐使用 函数名() { 业务代码 }
#调用 函数名
#带参调用,定义了几个参数就写几个值 函数名 值 ...
|
练习
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| showTest() { ls /yzg/shell >> yzg.java }
showTest
sum=0
showTest() { sum=$[$1+$2] }
showTest $1 $2
if [ $? -eq 0 ] then echo "执行成功!==========状态码:$?============相加结果:$sum" fi
|