网站开发如何避免浏览器缓存的影响,企业网站建设外包,有哪些做网站的网站,定制开发网站 推广文章目录 SHELL基础查看有哪些解释器使用usermod修改用户解释器BASH基本特性 shell脚本的设计与运行编写问世脚本脚本格式规范执行shell脚本方法一方法二实验 变量自定义变量环境变量位置变量案例 预定义变量 变量的扩展运用多种引号的区别双引号的应用单引号的应用反撇号或$()… 文章目录 SHELL基础查看有哪些解释器使用usermod修改用户解释器BASH基本特性 shell脚本的设计与运行编写问世脚本脚本格式规范执行shell脚本方法一方法二实验 变量自定义变量环境变量位置变量案例 预定义变量 变量的扩展运用多种引号的区别双引号的应用单引号的应用反撇号或$()的应用 read命令定义变量案例 条件测试字符串测试整数值比较运算常量与常量的比较常量与变量的比较 文件状态的测试 总结 SHELL基础
shell是用户与linux内核之间的解释器shell环境准备本实验需要用到一台虚拟机A即可 查看有哪些解释器 [rootsom ~]# cat /etc/shells #查看shell解释器使用usermod修改用户解释器
[rootsom ~]# usermod -s /bin/tcsh test #使用usermod指令修改用户解释器
[rootsom ~]# grep test /etc/passwd #从/etc/passwd过滤test用户信息BASH基本特性
查看
[rootsom ~]# ls #数据有颜色区分重定向 覆盖重定向
[rootsom ~]# ls a.txt
[rootsom ~]# cat a.txt追加重定向
[rootsom ~]# ls a.txt
[rootsom ~]# cat a.txt 显示一个错误的文件
[rootsom ~]# ls xxyyzz.txt
ls: 无法访问xxyyzz.txt: 没有那个文件或目录
[rootsom ~]# ls xxyyzz.txt b.txt #失败 收集正确信息
ls: 无法访问xxyyzz.txt: 没有那个文件或目录
[rootsom ~]# ls xxyyzz.txt 2 b.txt #正确2 收集错误信息
[rootsom ~]# cat b.txt
ls: 无法访问xxyyzz.txt: 没有那个文件或目录收集正确和错误的信息
[rootsom ~]# ls a.txt xxyzz.txt b.txt
[rootsom ~]# ls a.txt xxyzz.txt b.txt #收集所有信息
[rootsom ~]# cat b.txt
ls: 无法访问xxyzz.txt: 没有那个文件或目录
a. txt管道
[rootsom ~]# ifconfig | head -2 #查看ip信息前两行快捷键与Tab键补齐常见快捷键如表所示 shell脚本的设计与运行
什么是shell脚本
Shell脚本是一种自动化执行任务的脚本语言可以帮助我们完成日常任务比如文件管理、进程管理等。脚本可以理解为功能性文件
编写问世脚本
[rootsom ~]# mkdir -p /root/shell/day0{1..2}
[rootsom ~]# vim /root/shell/day01/first.sh
echo Hello World
[rootsom ~]# chmod x /root/shell/day01/first.sh #添加执行权限
[rootsom ~]# /root/shell/day01/first.sh #绝对路径形式执行
Hello World[rootsom ~]# cd /root/shell/day01/ #切换目录
[rootsom day01]# ./first.sh #相对路径执行
Hello World脚本格式规范
脚本声明需要的解释器、作者信息等注释信息步骤、思路、用途、变量含义等可执行语句操作代码
优化刚刚的first.sh脚本
[rootsom day01]# vim /root/shell/day01/first.sh
#!/bin/bash #指定解释器
#This a test program for shell. #这是一个测试性的程序
echo Hello World
[rootsom day01]# ./first.sh #执行脚本执行shell脚本
执行脚本的多种方式 方法一
脚本在执行的时候要有执行x权限否则会报错
[rootsom day01]# chmod -x first.sh
[rootsom day01]# ./first.sh #报错
-bash: ./first.sh: 权限不够
[rootsom day01]# /root/shell/day01/first.sh #报错
-bash: /root/shell/day01/first.sh: 权限不够方法二
不需要文件有可执行权限指定解释器执行脚本
[rootsom day01]# sh first.sh #指定sh来执行first.sh
[rootsom day01]# bash first.sh #指定bash解释器执行first.sh实验
[rootsom day01]# vim tmp.sh #编写tmp.sh
#!/bin/bash
exit
[rootsom day01]# sh tmp.sh #指定运行脚本没有关闭终端[rootsom day01]# vim tmp.sh #编写tmp.sh
#!/bin/bash
exit
[rootsom day01]# source tmp.sh #执行tmp.sh会关闭终端总结
指定解释器会新开子进程使用source不会新开子进程
变量
自定义变量
环境变量变量名通常大写有操作系统维护位置变量bash内置变量存储脚本执行时的参数预定义变量bash内置变量可以调用但是不能赋值或修改自定义变量用户自主设置
定义变量
可以是数字字母下划线变量名不能使用特殊符号会报错不能以数字开头
查看变量
echo ${变量名}echo $变量名
定义变量
[rootsom ~]# a11
[rootsom ~]# echo $a #调用变量,查看变量的值
[rootsom ~]# a33 #变量名已经存在再次赋值里面的内容会被覆盖
[rootsom ~]# echo $a #调用变量,查看变量的值[rootsom ~]# a)11 #变量包含特殊符号所以定义失败
-bash: 未预期的符号 ) 附近有语法错误
[rootsom ~]# 3a33 #变量数字开头所以定义失败
bash: 3a33: 未找到命令...[rootsom ~]# a_011 #没有违规所以成功
[rootsom ~]# _a11 #没有违规所以成功
[rootsom ~]# _011 #没有违规所以成功[rootsom ~]# xCentOS
[rootsom ~]# echo $x #成功
[rootsom ~]# echo ${x} #成功若想要显示CentOS7.9
[rootsom ~]# echo $x7.9 #失败会显示.9此时是把$x7看成一个变量名加上{}可以成功
[rootsom ~]# echo ${x}7.9 #输出CentOS7.9
[rootsom ~]# echo ${x}7.6 #输出CentOS7.6取消变量
[rootsom ~]# unset x #取消变量
[rootsom ~]# echo $x环境变量
存储在/etc/profile或~/.bash_profile命令env可以列出所有环境变量环境变量通常是大写字母
[rootsom ~]# echo $PATH #命令搜索的路径变量
[rootsom ~]# echo $PWD #返回当前工作目录
/root
[rootsom ~]# echo $USER #显示当前登录的用户
root
[rootsom ~]# echo $UID #显示当前用户的uid
0
[rootsom ~]# echo $HOME #显示当前用户的家目录
/root
[rootsom ~]# echo $SHELL #显示当前的SHELL
/bin/bash 位置变量
存储脚本时执行的参数$1 $2 $3 …$9 ${10} ${11} … #从10开始位置变量需要加{}
[rootsom ~]# vim /root/shell/day01/vars.sh
#!/bin/bash
echo $1
echo $2
echo $3[rootsom ~]# chmod x /root/shell/day01/vars.sh
[rootsom ~]# /root/shell/day01/vars.sh aa bb cc #执行脚本传递参数
aa
bb
cc案例
编写一个user.sh脚本使用它创建用户
[rootsom ~]# vim /root/shell/day01/user.sh
#!/bin/bash
useradd $1 #创建用户
echo $2 | passwd --stdin $1 #设置密码[rootsom ~]# chmod x /root/shell/day01/user.sh
[rootsom ~]# /root/shell/day01/user.sh tom 123 #执行脚本
[rootsom ~]# /root/shell/day01/user.sh jim 123 #执行脚本预定义变量
用来保存脚本程序的执行信息可以直接使用这些变量但是不能为这些变量赋值 $?执行上一条命令的返回状态0为正确非0为错误
[rootsom ~]# ls /etc/hosts #执行命令成功
/etc/hosts
[rootsom ~]# echo $? #返回值为0正确
0[rootsom ~]# ls /xxxxxyyyy #执行命令错误
ls: 无法访问/xxxxxyyyy: 没有那个文件或目录
[rootsom ~]# echo $? #返回值为非0失败
2其他几个预定义变量的测试
[rootsom ~]# vim /root/shell/day01/pre.sh
#!/bin/bash
echo $0 #执行脚本的名字
echo $$ #当前脚本的进程号
echo $# #位置变量的个数
echo $* #所有位置变量[rootsom7 ~]# chmod x /root/shell/day01/pre.sh
[rootsom7 ~]# /root/shell/day01/pre.sh a b c d
/root/shell/day01/pre.sh
46608
4
a b c d变量的扩展运用
多种引号的区别
双引号的应用
使用双引号可以界定一个完整字符串。
[rootsom ~]# touch a b c #创建了三个文件
[rootsom ~]# touch a b c #创建1一个文件
[rootsom ~]# ls -l[rootsom ~]# rm -rf a b c #删除三个文件
[rootsom ~]# rm -rf a b c #删除一个文件单引号的应用
界定一个完整的字符串并且可以实现屏蔽特殊符号的功能。当双引号里面有变量时会被扩展出来也就是会取变量的值
[rootsom ~]# hiworld
[rootsom ~]# echo $hi #成功
world
[rootsom ~]# echo $hi #失败当成一个字符串
$hi当没有特殊符号时单引号和双引号的含义是一样的
[rootsom ~]# touch a b c
[rootsom ~]# touch c d e练习单引号和双引号的区别
[rootsom ~]# echo $USER id is $UID #调用变量
root id is 0
[rootsom ~]# echo $USER id is $UID #不调用变量
$USER id is $UID反撇号或$()的应用
使用反撇号或$()时可以将命令执行的标准输出作为字符串存储因此称为命令替换。
[rootsom ~]# grep root /etc/passwd
[rootsom ~]# testgrep root /etc/passwd #定义变量内容为命令输出结果
[rootsom ~]# echo $test[rootsom ~]# test2$(grep root /etc/passwd) #定义变量内容为命令输出结果
[rootsom ~]# echo $test2read命令定义变量
使用read命令从键盘读取变量值 -p: 指定提示信息-s: 屏蔽输入键盘输入内容在屏幕上不显示-t: 可指定超时秒数指定秒数不输入直接退出
read基本用法
执行后从会等待并接受用户输入无任何提示的情况并赋值给变量
[rootsom ~]# read iname #定义变量iname
123 #从键盘输入123作为iname的值
[rootsom ~]# echo $iname #输出变量iname
123虽然可以赋值。但是屏幕上没有任何提示信息在未来写脚本的时候不太方便可以加上-p选项给出提示
[rootsom ~]# read -p 请输入用户名 iname #定义变量
请输入用户名tom
[rootsom ~]# echo $iname #输出变量
tom案例
创建一个脚本通过read定义变量创建用户更改密码
[rootsom ~]# vim /root/shell/day01/read.sh
#!/bin/bash
read -p 请输入用户名 name
read -p 请输入密码 pass
useradd $name
echo $pass | passwd --stdin $name[rootsom ~]# chmod x /root/shell/day01/read.sh
[rootsom ~]# /root/shell/day01/read.sh
请输入用户名user2
请输入密码a
更改用户 user2 的密码 。
passwd所有的身份验证令牌已经成功更新。但是此时密码是名为显示的不安全可以使用-s参数不显示终端输入的信息
[rootsom ~]# vim /root/shell/day01/read.sh
read -p 请输入用户名 name
read -s -p 请输入密码 pass
useradd $name
echo $pass | passwd --stdin $name[rootsom ~]# /root/shell/day01/read.sh
请输入用户名user3
请输入密码
更改用户 user3 的密码 。
passwd所有的身份验证令牌已经成功更新。[rootsom ~]# read -t 3 iname #3秒不输入直接退出条件测试
语法格式使用 [ 表达式 ]表达式两边至少要留一个空格。
字符串测试
是否为空 [ -z 字符串 ]
[rootsom ~]# echo $TT
[rootsom ~]# [ -z $TT ] #T为空吗
[rootsom ~]# echo $? #是返回值为0
0[rootsom ~]# TThello
[rootsom ~]# [ -z $TT ] #T为空吗
[rootsom ~]# echo $? #否返回值非0
1等于[ 字符串1 字符串2 ]
[rootsom ~]# [ a a ] #判断aa
[rootsom ~]# echo $? #查看返回值
0
[rootsom ~]# [ a c ] #判断ac
[rootsom ~]# echo $? #查看返回值
1变量和常量的判断
[rootsom ~]# [ $USER root ] #环境变量USER的值是root吗
[rootsom ~]# echo $?
0
[rootsom ~]# [ $USER tom ] #环境变量USER的值是tom吗
[rootsom ~]# echo $?
1不等于[ 字符串1 ! 字符串2 ]
[rootsom ~]# [ $USER ! tom ] #环境变量USER的值不是tom
[rootsom ~]# echo $?
0整数值比较
格式[ 整数值1 操作符 整数值2 ]
-eq等于-ne不等于-gt大于-ge大于等于-lt小于-le小于等于
参与比较的必须是整数可以调用变量比较非整数值时会出错
运算
四则运算 - * /
求模取余%
计算练习
[rootsom ~]# echo $[11] #计算11
[rootsom ~]# echo $[10-2] #计算10-2
[rootsom ~]# echo $[2*2] #计算2*2
[rootsom ~]# echo $[6/3] #计算6/3
[rootsom ~]# echo $[10%3] #取10/3的余数变量计算
[rootsom ~]# a10
[rootsom ~]# b20
[rootsom ~]# echo $[ab] #计算变量a变量b常量与常量的比较
小于
[rootsom ~]# [ 3 -lt 8 ]
[rootsom ~]# echo $?
0大于
[rootsom ~]# [ 3 -gt 2 ]
[rootsom ~]# echo $?
0等于
[rootsom ~]# [ 3 -eq 3 ]
[rootsom ~]# echo $?
0小于等于
[rootsom ~]# [ 3 -le 3 ]
[rootsom ~]# echo $?
0大于等于
[rootsom ~]# [ 3 -ge 1 ]
[rootsom ~]# echo $?
0常量与变量的比较
判断计算机登录的用户
[rootsom ~]# who | wc -l
[rootsom ~]# [ $(who | wc -l) -ge 2 ]
[rootsom ~]# echo $?
0文件状态的测试
格式[ 操作符 文件或目录 ]-e判断对象是否存在不管是目录还是文件存在则结果为真
[rootsom ~]# [ -e /etc ]
[rootsom ~]# echo $?
0[rootsom ~]# [ -e /etc/hosts ]
[rootsom ~]# echo $?
0[rootsom ~]# [ -e /etc/xxyy ]
[rootsom ~]# echo $?
1-d判断对象是否为目录存在且是目录是则为真
[rootsom ~]# [ -d /etc/hosts ]
[rootsom ~]# echo $?
1
[rootsom ~]# [ -d /etc/ ]
[rootsom ~]# echo $?
0-f判断对象是否为文件存在且是文件是则为真
[rootsom ~]# [ -f /etc/ ]
[rootsom ~]# echo $?
1
[rootsom ~]# [ -f /etc/hosts ]
[rootsom ~]# echo $?
0-r判断对象是否可读是则为真
[rootsom ~]# ls -l /etc/hosts
-rw-r--r--. 1 root root 158 6月 7 2013 /etc/hosts
[rootsom ~]# [ -r /etc/hosts ]
[rootsom ~]# echo $?
0-w判断对象是否可写是则为真
[rootsom ~]# [ -w /etc/hosts ]
[rootsom ~]# echo $?
0-x判断对象是否具有可执行权限是则为真
[rootsom ~]# [ -x /etc/hosts ]
[rootsom ~]# echo $?
1总结
掌握SHELL脚本执行流程掌握SHELL中的变量 自定义变量环境变量位置变量预定义变量 掌握SHELL中条件测试