shell脚本编程第一章
1、什么是shell
shell相当于一个翻译,把我们在计算机上执行的操作和命令,翻译成计算机可以识别的二进制命令,然后传递给内核,以便计算机硬件去执行操作,计算机执行完成后,再通过shell翻译成自然语言,呈现给用户。
shell收到命令后,首先检查是不是内部命令,如果不是的话再去检查是否为某个应用程序,这里的应用程序可以是Linux本身的实用程序,比如“ls、rm”,然后shell会通过控制变量“$PATH”去寻找命令,环境变量$PATH是一个存放可执行程序的目录,如果键入的命令不是内部命令也不是应用程序的命令(或者说找不到执行命令的路径),会返回一个报错。如果可以找到,shell会将命令分解为系统调用并且传给Linux内核。
[root@server ~]# kkksada
bash: kkksada: 未找到命令... ##这就表示找不到命令
2、Linux的常用解释器
-
Bash
bash(GNU Bourne-Again Shell)是最常用的一种shell,是当前大多数Linux发行版的默认Shell。
bash的全名是Bourne Again Shell。最开始在Unix系统中流行的是sh,而bash作为sh的改进版本,提供了更加丰富的功能。一般来说,都推荐使用bash作为默认的Shell。
bash 与 Bourne shell(sh) 完全向后兼容,并且在 Bourne shell 的基础上增加和增强了很多特性。bash 也包含了很多 C 和 Korn shell 里的优点。bash 有很灵活和强大的编程接口,同时又有很友好的用户界面。
bash的优点:支持tab补全、支持快捷键、查询历史命令、支持别名、管道、重定向
-
其他解释器
其他的shell还有 sh、ksh、rsh、csh
3、什么是Shell脚本
Sehll脚本是一种编程语言脚本,它是一系列命令的集合,保存在一个文件中,可以用.sh文件后缀来提示为shell脚本文件。通过运行这个脚本文件来执行里面的命令。
4、Shell脚本的编写规范
-
声明解释器
在shell文件开头通过“#!"来声明该脚本通过何种shell来执执行文件中的命令
#!/bin/bash ##使用bash来解释,也是最常用的声明方式 -
单行注释
在shell脚本中,注释通过#字符实现,任何#后面的内容不会被执行。
# this is exegesis #hello world -
编写命令
撰写解释器可以理解的命令
#! /bin/bash #shell 脚本测试 mkdir /opt/test cd /opt/test echo test > 123.txt
4、Shell脚本的执行方式
-
给文件赋予x(执行)权限,通过相对、绝对路径执行
chmod U+x test.sh ./test.sh(相对路径) 或 /opt/test.sh此时执行的逻辑:用户(root)---bash(目前系统的shell)---bash(shell脚本声明的shell)---执行命令。执行结束后退出脚本的shell。此时的环境为用户(root)---bash。
-
使用解释器程序去执行脚本,无需x权限
bash test01.sh通过该命令执行,会使用bash命令权限去对文件执行。执行逻辑:
用户(root)---bash(目前系统的shell)---bash(命令声明的解释器)---执行命令
-
使用source或者.执行脚本,无需x权限
source test01.sh执行逻辑:用户(root)---bash(目前系统的shell)--命令
这种执行方式不再调用解释器,直接使用系统的自身的解释器。(不开子进程)
5、shell脚本案例
-
编写搭建yum脚本
#!bin/bash #yum搭建脚本 mv /etc/yum.repos.d/*.repo /opt/data echo "[test] name=test baseurl=http://192.168.2.1/yum enabled=1 gpgcheck=0" > /etc/yum.repos.d/sehllyum.repo -
创建http服务,并且显示页面为hello world
#!bin/bash #搭建http服务 yum -y install httpd systemctl restart httpd cd /var/www/html echo "hell word" > index.html -
编写脚本,安装ftp服务并开启且设置为开机自启
#bin/bash #搭建ftp服务 yum -y install vsftpd systemctl restart vsftpd systemctl enable vsftpd systemctl status vsftpd6、变量
再shell中,变量的定义不需要使用数据类型,可以直接用”=“赋值,”=“两边不要有空格,变量的值可以直接通过$符合来应用
a=10 echo $a -
变量的命名规则
- 变量名只能包含字母、数字、下划线
- 不能以数字开头
- 变量名通常用大写字母提高可读性(非强制)
-
变量赋值方式
变量名称=值
a=10 #创建变量a,赋值10 a=20 #再次给a赋值,之前的会被覆盖 echo $a #调用变量a unset a #取消变量的定义,也可以用a= ,给a赋空值 -
环境变量
环境变量是可以在整个系统中使用的变量,通常再shell会话就可以定义,可以影响整个系统的行为和操作,常见的环境变量有:
USER 当前用户名 UID当前用户的id号 HOME当前用户家目录
HOSTNAME 主机名 SHELL当前用户的解释器 PWD当前位置
PATH 存储命令的路径 PS1 一级提示符 PS2 二级提示符
printenv #查看所有环境变量 -
位置变量和预定义变量
-
$0:当前脚本的文件名。
-
$1, $2, ...:传递给脚本或函数的参数。
例
#!/bin/bash echo "push $1 $2 $3"运行结果
[root@server opt]# sh shell.sh 10 20 30 push 10 20 30 -
$#:传递给脚本或函数的参数个数。
例:
#!/bin/bash echo push $1 $2 $3 $#运行结果
[root@server opt]# sh shell.sh 10 20 30 push 10 20 30 3 -
$@:传递给脚本或函数的所有参数。
-
$?:上个命令的执行结果,执行成功为0,不成功为其他数字
-
$$:当前 Shell 进程的 PID。
-
$!:后台运行的最后一个进程的 PID。
例:
#!/bin/bash echo push $1 $2 $3 $# $@ $? $$ $!运行结果
[root@server opt]# sh shell.sh 10 20 30 push 10 20 30 3 10 20 30 0 16234
-
-
变量相关符号
-
双引号” “
” “用于定义一段字符串,在字符串中可以允许调用变量,输出变量所赋予的值。
示例
[root@server opt]# name=xiaobai [root@server opt]# echo "hello $name" hello xiaobai -
单引号
‘ ’用于定义一段字符串,在字符串中不会解析变量和命令替换。单引号内的内容会被完全保留,包括变量和特殊字符。
示例
name="Kimi" echo 'Hello, $name!' # 输出:Hello, $name!
-
-
交互变量
利用read命令可以读取键盘输入的内容,然后赋值给指定的变量,read命令格式为
read [变量] read -p "可以在这里写需要提示给用户的内容" [变量]-
创建用户且设置密码脚本
#/bin/bash read -p "请输入用户名" u useradd $u stty -echo #不展示键盘输入的内容 read -p "请输入密码" p stty -echo echo "$p" | passwd --stdin $u
-
7、Linux数学运算
-
expr命令
可以使用expr命令实现加减乘除以及求模运输(取余)
[root@server opt]# expr 1 + 1 ##运算符号中间要有空格 2 [root@server opt]# expr 2 '*' 2 ## *在Linux存在代表所有的意思,需要通过''或\符号进行转义 4 [root@server opt]# expr 2 - 2 0 [root@server opt]# expr 2 / 2 1 [root@server opt]# expr 2 % 2 0变量可以配合expr命令使用
a=10 b=20 expr $a + $b -
$[ ]运算
[root@server opt]# echo $[2*2] 4 [root@server opt]# echo $[2+2] 4 [root@server opt]# echo $[2-2] 0 [root@server opt]# echo $[2/2] 1 [root@server opt]# echo $[2%2] 0 -
let命令,不直接输出结果,专用于变量的创建或变量自增减
let a=1+1 #创建变量,并且将计算结果赋值给a-
变量的自增减
let a=a+1 let a++ 变量a加1
let a=a-1 let a-- 变量a减1
let a=a+10 let a+=10 变量a加10
let a=a-10 let a-=10 变量a减10
let a=a2 let a=2 变量a乘以2
let a=a/2 let a/=2 变量a除以2
let a=a%3 let a%=3 变量a除以3取余数
-
-
bc可以用于计算小数
[root@server opt]# echo "1+1.1" | bc 2.1可以定义小数位数
[root@server opt]# echo "scale=2;10/3" | bc 3.33
浙公网安备 33010602011771号