一、shell基本介绍
1.1 什么是shell
◆ 在Linux内核与用户之间的解释器程序
◆ 通常指 /bin/bash
◆ 负责向内核翻译及传达用户/程序指令
◆ 相当于操作系统的“外壳”
1.2 shell使用方式
◆ 交互式 —— 命令行
-----人工干预、智能化程度高
-----逐条解释执行、效率低
◆ 非交互式 —— 脚本
-----需要提前设计、智能化难度大
-----批量执行、效率高
-----方便在后台静悄悄地运行
[root@test1 ~]# cat /etc/shells #查看所有解释器
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash[root@test1 ~]# sh #切换成sh解释器
sh-4.2#sh-4.2# ls #利用sh解释器输入命令
\ anaconda-ks.cfg named.conf test1.txtsh-4.2#exit #退出sh解释器
1.3 bash命令和shell脚本优点
bash命令:tab键、快捷键、历史命令、支持别名、管道、重定向。
shell脚本:提前写好可执行的语句,可以完成特定任务的文件按顺序、批量化执行。
二、shell脚本的编写
2.1 创建shell脚本文件并命名
[root@test1 ~]# vim /test01.sh
2.2 shell脚本编写规范
2、声明解释器
#!/bin/bash
3、编写注释
# 可以描述脚本功能、变量作用等信息
4、执行指令yum -y install httpd
。。。。。。
2.3 脚本的执行
1)方式一:
[root@test1 ~]# chmod u+x /test01.sh #为脚本添加x权限,使用相对或者绝对路径执行
[root@test1 ~]# cd /
[root@test1 ~]# ./test01.sh #执行脚本
2)方式二:
[root@test1 ~]# bash /test01.sh #使用解释器程序执行脚本,无需x权限
用户(root)---bash ---bash---echo 会开启子进程
3)方式三:
[root@test1 ~]# source /test01.sh #使用source命令执行脚本,无需x权限
用户(root)---bash---echo 不会开启子进程
示例:编写脚本,安装网站服务并开启,浏览网站时显示"web-test~~"。
[root@test1 ~]# vim /http.sh
#!/bin/bash
#搭建网站
yum -y install httpd
echo "web-test~~" > /var/www/html/index.html
systemctl restart httpd
[root@test1 ~]# chmod u+x /http.sh
[root@test1 ~]# cd /
[root@test1 ~]# ./http.sh
2.4 重定向符号说明
符号 | 说明 |
> | 重定向标准输出 |
2> | 重定向错误输出 |
&> | 重定向所有输出 |
三、shell变量
3.1 变量和常量
变量-------使用固定的名称存放可能发生变化的值,可以提高脚本的灵活度、适应力。
常量-------固定不变的内容。
3.2 变量的种类
3.2.1 自定义变量
● 名称可以用数字、字母、下划线,不能以数字开头,不能使用特殊符号,等号两边不能有空格。
变量名称=值
变量使用 | 说明 |
a=10 | 创建变量(对变量赋值),名字是a,值是10 |
a=30 | 再次赋值,之前的会被覆盖 |
echo $a | 调用变量时使用$符号 |
unset a | 取消变量的定义 |
a= | 将变量a赋值为空,效果取消变量定义 |
echo ${a}RMB | 变量名容易与后续字符发生混淆时使用大括号隔开 |
3.2.2 环境变量
● 由系统提前定义好,使用时直接调用
变量 | 说明 |
USER | 当前用户名 |
UID | 当前用户的id号 |
HOME | 当前用户家目录 |
HOSTNAME | 主机名 |
SHELL | 当前用户的解释器 |
PWD | 当前位置 |
PATH | 存储命令的路径 |
PS1 | 一级提示符 |
PS2 | 二级提示符 |
env | 看所有环境变量 |
set | 查看所有变量 |
3.2.3 位置变量与预定义变量
变量 | 说明 |
$1 | 执行脚本时后面第1个位置参数 |
$2 | 执行脚本时后面第2个位置参数 |
$3 | 执行脚本时后面第3个位置参数 |
$* | 执行脚本时后面所有位置参数 |
$# | 执行脚本时后面位置参数的个数 |
$$ | 随机进程号 |
$? | 判断上一条指令是否执行成功,0是成功,非0是失败 |
示例: 编写脚本,创建用户tom,配置密码123456
#!/bin/bash
useradd tom
echo "123456" | passwd --stdin tom
改良版
#!/bin/bash
useradd $1
echo "$2" | passwd --stdin $1
四、变量的扩展知识
4.1 引号和反撇号
变量及符号 | 说明 |
" " | 双引号,界定范围 |
echo "$a" | 正常调用变量a |
' ' | 单引号,界定范围,屏蔽特殊符号的功能 |
echo '$a' | 无法调用变量a,$被屏蔽 |
` ` | 反撇号,获取命令的执行结果,还可以使用$( )实现相同效果 |
a=`date` | 将date执行结果赋值给a |
a=$(date) | 将date执行结果赋值给a |
4.2 使用read指令
#!/bin/bash
read -p "请输入用户名" u # -p是可以定义提示信息,u相当于自
# 定义变量名称,可以存储用户看到提示信息后输入的字符
useradd $u
read -p "请输入密码" n
echo "$n" | passwd --stdin $u
# stty -echo 屏蔽回显
# stty echo 恢复回显
再次改良脚本:
#!/bin/bash
read -p "请输入用户名" u
useradd $u
stty -echo
read -p "请输入密码" n
stty echo
echo "$n" | passwd --stdin $u
4.3 使用export发布全局变量
● 局部变量------仅仅在当前解释器进程中使用的变量
● 全局变量------解释器产生的子进程中也可以使用的变量
a=10 #创建变量
export a #将已有变量发布为全局效果
export b=20 #创建变量的同时发布为全局效果
export -n b #将全局变量恢复为局部变量
注意:测试时要在父进程创建变量,然后可以执行bash进入
子进程测试效果,如果要返回父进程要执行exit指令
4.4 算法
加、减、乘、除、求模(取余数)
4.4.1 使用expr命令,可以运算并输出结果
expr 1 + 1 //加法,运算符号两边要有空格
expr 2 – 1 //减法
expr 2 '*' 2 //乘法
expr 2 \* 2 // \是转义符号,可以屏蔽身后一个特殊符号的功能
expr 4 / 2 //除法
expr 5 % 2 //取余数
a=10
b=20
expr $a + $b
expr $a + 100
expr $a + $a
4.4.2 $[ ] 运算 使用$(( )) 可以实现相同效果
标签:test1,Shell,运算,echo,sh,概述,root,bash,变量 From: https://blog.csdn.net/bsqsb/article/details/143626044echo $[2*2]
echo $[2-2]
echo $[2/2]
echo $[2%2]
a=10
b=20
expr $a + $b
echo $[a+b]