shell脚本学习(一)

shell脚本

一. 什么是shell

shell是一个程序,采用C语言编写,是用户和linux内核沟通的桥梁。它既是一种命令语言,又是一种解释性的编程语言。通过一个图表来查看一下shell的作用。、

在这里插入图片描述

**拓展知识:**
**kernel:为软件服务,接收用户或软件指令驱动硬件,完成工作;**
**shell:命令解释器**
**user:用户接口,对接用户。**

上图可以看出,shell在操作系统中起到了承接用户和系统内核的作用。那为什么不直接用户对内核呢?原因很简单,因为内核处理的都是二进制,而用户处理的都是高级语言。


二.shell语法

1.如何抒写一个shell脚本

shell脚本的命名:
名字要有意义,最好不要用a、b、c、d、1、2、3、4这种方式命名;虽然linux系统中,文件没有扩展名的概念,依然建议你用.sh结尾。
shell脚本格式:
shell脚本开头必须指定脚本运行环境 以 #!这个特殊符号组合来组成。如: #!/bin/bash 指定该脚本是运行解析由/bin/bash来完成的(还可以这么书写#!/usr/bin/env bash/python),shell中的注释使用#号

#shell脚本中,最好加入脚本说明字段
#!/bin/bash
#Author: Bai Shuming
#Created Time: 2018/08/2712:27
#Script Description: first shell study script

2.运行一个shell脚本

脚本运行需要执行权限,当我们给一个文件赋予执行权限后,该脚本就可以运行。
#chmod u+x filename
如果不希望赋予脚本执行权限,那么可以使用bash命令来运行未给予执行权限的脚本bash fiename
#bash filename

3.shell中的特殊符号

有基础的同学不要和正则表达式中的符号含义搞混淆了。
~:                家目录    # cd ~ 代表进入用户家目录
!:                执行历史命令   !! 执行上一条命令
$:                变量中取内容符
+ - * \ %:       对应数学运算  加 减 乘 除 取余数  
&:                后台执行
*:                星号是shell中的通配符  匹配所有
?:                问号是shell中的通配符  匹配除回车以外的一个字符
;:               分号可以在shell中一行执行多个命令,命令之间用分号分割
|:               管道符 上一个命令的输出作为下一个命令的输入   cat filename | grep "abc"
\:                转义字符
``:               反引号 命令中执行命令    echo "today is `date +%F`"
' ':              单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不解释变量
" ":              双引号,脚本中出现的字符串可以用双引号引起来

部分例子:
在这里插入图片描述

4.shell中的管道运用

|  管道符在shell中使用是最多的,很多组合命令都需要通过组合命令来完成输出。管道符其实就是下一个命令对上一个命令的输出做处理。

5.shell重定向

>   重定向输入  覆盖原数据
>>  重定向追加输入,在原数据的末尾添加
<   重定向输出     wc -l < /etc/passwd
<<  重定向追加输出  fdisk /dev/sdb <

> 和 >> 的例子
在这里插入图片描述

<的例子
在这里插入图片描述

<<的例子 注意:EOF可以用END代替表示括号的意思,且n、p需要顶格写
在这里插入图片描述

6.shell数学运算

 expr 命令:只能做整数运算,格式比较古板,注意空格
 [root@baism ~]# expr 1 + 1
 2
 [root@baism ~]# expr 5 - 2
 3
 [root@baism ~]# expr 5 \* 2  #注意*出现应该转义,否则认为是通配符
 10
 [root@baism ~]# expr 5 / 2
 2
 [root@baism ~]# expr 5 % 2
 1
 
 使用bc计算器处理浮点运算,scale=2代表小数点保留两位
 [root@baism ~]# echo "scale=2;3+100"|bc
 103
 [root@baism ~]# echo "scale=2;100-3"|bc
 97
 [root@baism ~]# echo "scale=2;100/3"|bc
 33.33
 [root@baism ~]# echo "scale=2;100*3"|bc
 300
 [root@baism ~]# echo "`echo "scale=2;141*100/7966"|bc`%"
 1.77%
 
 双小圆括号运算,在shell中(( ))也可以用来做数学运算
 [root@baism ~]# echo $(( 100+3))
 103
 [root@baism ~]# echo $(( 100-3)) 
 97
 [root@baism ~]# echo $(( 100%3))
 1
 [root@baism ~]# echo $(( 100*3))
 300
 [root@baism ~]# echo $(( 100/3))
 33
 [root@baism ~]# echo $(( 100**3))     #开方运算
 1000000

注意:$? 返回为0表示上一条指令执行成功,非0表示上一条指令没有执行成功,例子如下:
在这里插入图片描述

7.退出脚本

exit NUM 退出脚本,释放系统资源,NUM代表一个整数,代表返回值。NUM=[1,255]

三.shell格式化输出

1.echo命令介绍

echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。 该命令的一般格式为:echo [ -n ]字符串,其中选项n表示输出文字后不换行;字符串能加引号,也能不加引号。
用echo命令输出加 引号的字符串时,将字符串原样输出;用echo命令输出不加引号的字符串时,将字符串中 的各个单词作为字符串输出,各字符串之间用一个空格分割。

echo [-ne][字符串]或echo [—help][—version]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在 最后加上换行号。

命令选项:
-n不要在最后自动换行
-e若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:

转义字符
\a发出警告声;
\b删除前一个字符,必须在同一行;
\c最后不加上换行符号;
\f换行但光标仍旧停留在原来的位置;
\n换行且光标移至行首;
\r光标移至行首,但不换行;
\t插入tab;
\v与\f相同;
\插入\字符;
\nnn插入nnn(八进制)所代表的ASCII字符;
–help显示帮助–version显示版本信息

例子如下
在这里插入图片描述

2.颜色代码

脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e
格式如下:
echo -e “\033[字背景颜色;文字颜色m字符串\033[0m”
例如:
echo -e “\033[41;36m something here \033[0m”
其中41的位置代表底色, 36的位置是代表字的颜色
1、字背景颜色和文字颜色之间是英文的””
2、文字颜色后面有个m
3、字符串前后可以没有空格,如果有的话,输出也是同样有空格

下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配
例
echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[34m 黄色字 \033[0m”
echo -e “\033[41;33m 红底黄字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
  
字颜色:30—–37
echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[32m 绿色字 \033[0m”
echo -e “\033[33m 黄色字 \033[0m”
echo -e “\033[34m 蓝色字 \033[0m”
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天蓝字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”
  
字背景颜色范围:40—–47
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
echo -e “\033[42;37m 绿底白字 \033[0m”
echo -e “\033[43;37m 黄底白字 \033[0m”
echo -e “\033[44;37m 蓝底白字 \033[0m”
echo -e “\033[45;37m 紫底白字 \033[0m”
echo -e “\033[46;37m 天蓝底白字 \033[0m”
echo -e “\033[47;30m 白底黑字 \033[0m”
  
最后面控制选项说明
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m — \33[37m 
设置前景色
\033[40m — \33[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\33[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标

四.shell基本输入

1.read命令

默认接受键盘的输入,回车符代表输入结束
read 命令选项
-p打印信息
-t限定时间     例如-t5表示5秒内必须输入,否则直接退出
-s不回显       一般用在密码输入
-n输入字符个数  例如-n10表示输入的字符最多10个字符,超过10个自动停止

例子如下:
在这里插入图片描述


五.shell变量

1.定义变量

变量格式: 变量名=值
在shell编程中的变量名和等号之间不能有空格。

变量名命名规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
VAR1=1
age=18
name=’baism’
score=88.8
注意:字符串要用单引号或双引号引起来
定义变量演示:
变量赋值,此种方法设置为本地变量
[root@www ~]# name="baism"
[root@www ~]# school='ayitula'
[root@www ~]# age=30
[root@www ~]# score=88.8

2.读取变量内容

读取变量内容符:$
读取方法:$变量名

变量内容读出
[root@www ~]# echo $name
baism
[root@www ~]# echo $school
ayitula
[root@www ~]# echo $age
30
[root@www ~]# echo $score
88.8

3.取消变量

[root@www ~]# unset name
[root@www ~]# echo $name

六.shell数组

1.基本数组

数组可以让用户一次赋予多个值,需要读取数据时只需通过索引调用就可以方便读出了。
数组语法
数组名称=(元素1 元素2 元素3 …)
数组读出

${数组名称}[索引]
索引默认是元素在数组中的排队编号,默认第一个从0开始

数组赋值
一次赋一个值

array0[0]=’tom’
array0[1]=’jarry’
array0[2]=’natasha’

一次赋多个值

# array2=(tom jack alice)
# array3=(cat /etc/passwd) 希望是将该文件中的每一个行作为一个元素赋值给数组array3
# array4=(ls /var/ftp/Shell/for*)
# array5=(tom jack alice “bash shell”)

访问数组元数

# echo ${array1[0]} 访问数组中的第一个元素
# echo ${array1[@]} 访问数组中所有元素 等同于 echo ${array1[*]}
# echo ${#array1[@]} 统计数组元素的个数
# echo ${!array2[@]} 获取数组元素的索引
# echo ${array1[@]:1} 从数组下标1开始
# echo ${array1[@]:1:2} 从数组下标1开始,访问两个元素

遍历数组

默认数组通过数组元素的个数进行遍历
[root@www ~]# echo ${array1[0]}
pear
[root@www ~]# echo ${array1[1]}
apple
[root@www ~]# echo ${array1[2]}
orange
[root@www ~]# echo ${array1[3]}
peach

2.关联数组

关联数组可以允许用户自定义数组的索引,这样使用起来更加方便、高效。
定义关联数组

申明关联数组变量
# declare -A ass_array1
# declare -A ass_array2

关联数组赋值

方法一: 一次赋一个值
数组名[索引]=变量值
# ass_array1[index1]=pear
# ass_array1[index2]=apple
# ass_array1[index3]=orange
# ass_array1[index4]=peach

方法二: 一次赋多个值
# ass_array2=([index1]=tom [index2]=jack [index3]=alice [index4]=’bash shell’)

访问数组元素

# echo ${ass_array2[index2]} 访问数组中的第二个元数
# echo ${ass_array2[@]} 访问数组中所有元数 等同于 echo ${array1[*]}
# echo ${#ass_array2[@]} 获得数组元数的个数
# echo ${!ass_array2[@]} 获得数组元数的索引

遍历数组

通过数组元数的索引进行遍历,针对关联数组可以通过数组元素的索引进行遍历
[root@www ~]# echo ${ass_array2[index1]}
tom
[root@www ~]# echo ${ass_array2[index2]}
jack
[root@www ~]# echo ${ass_array2[index3]}
alice
[root@www ~]# echo ${ass_array2[index4]}
bash shell

3.案列分享—-学员信息系统

/bin/bash
for ((i=0;i<3;i++))
   do
      read -p "输入第$((i + 1))个人名: " name[$i]
      read -p "输入第$[$i + 1]个年龄: " age[$i]
      read -p "输入第`expr $i + 1`个性别: " gender[$i]
done
clear
      echo -e "\t\t\t\t学员查询系统"
while :
   do
      cp=0
      #echo -e "\t\t\t\t学员查询系统"
      read -p "输入要查询的姓名: " xm
      [ $xm == "Q" ]&&exit
      for ((i=0;i<3;i++))
         do
              if [ "$xm" == "${name[$i]}" ];then
                  echo "${name[$i]} ${age[$i]} ${gender[$i]}"
                  cp=1
              fi
      done
      [ $cp -eq 0 ]&&echo "not found student"
done

注:以上案例来自B站的UP主Python社区,结合博客和视频一起食用,效果更好哦
shell脚本视频链接:Shell脚本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值