shell 是什么

shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
在Linux内核与用户之间的解释器程序,通常指/bin/bash,负责向内核翻译及传达用户/程序指令,相当于操作系统的“外壳”.

shell 使用方式

交互式 —— 命令行:人工干预、智能化程度高,逐条解释执行、效率低
非交互式 —— 脚本:需要提前设计、智能化难度大,批量执行、效率高,方便在后台静悄悄地运行

  1. [root@svr7 ~]# cat /etc/shells //查看所有解释器
  2. [root@svr7 ~]# sh //切换成sh解释器
  3. sh-4.2# ls //利用sh解释器输入命令
  4. sh-4.2#exit //退出sh解释器
  5. [root@svr7 ~]#yum -y install ksh //安装新解释器
  6. [root@svr7 ~]#ksh //进入新解释器

bash优点:tab键、快捷键、历史命令、支持别名、管道、重定向。shell脚本:提前写好可执行的语句,可以完成特定任务的文件,按顺序、批量化执行。

shell 编写规范

1.#!/bin/bash //声明解释器
2.编写注释信息 //可以描述脚本功能、变量作用等信息
3.执行指令

shell 脚本的执行方式

1,为脚本添加x权限,使用相对或者绝对路径执行 chmod u+x test01.sh ./test01.sh
/opt/test01.sh . test01.sh 用户(root)—-bash—-bash—-echo 2,使用解释器程序执行脚本,无需x权限 bash test01.sh 用户(root)—-bash —-bash—-echo 会开启子进程 3,使用source命令执行脚本,无需x权限,并且不会开启子进程 //source是sehll内嵌 source test01.sh 用户(root)—-bash—-echo 不会开启子进程 [root@ser4 /opt ]# type source source 是 shell 内嵌

  1. #!/bin/bash
  2. #搭建yum软件仓库
  3. mkdir /abc
  4. mount /dev/cdrom /abc
  5. rm -rf /etc/yum.repos.d/*.repo
  6. echo "[abc]
  7. name=abcabc
  8. baseurl=file:///abc
  9. enabled=1
  10. gpgcheck=0" > /etc/yum.repos.d/abc.repo
  1. #!/bin/bash
  2. #搭建网站
  3. yum -y install httpd
  4. echo "web-test~~" > /var/www/html/index.html
  5. systemctl restart httpd

编写脚本,安装ftp服务并开启且设置为开机自启

重定向标准输出 2> 重定向错误输出 &> 重定向所有输出

  1. #!/bin/bash
  2. yum -y install vsftpd &> /dev/null //将不需要的信息扔黑洞
  3. systemctl restart vsftpd
  4. systemctl enable vsftpd

变量: 使用固定的名称存放可能发生变化的值,可以提高脚本的灵活度、适应力 常量: 固定不变的内容

变量的种类

1.自定义变量

名称可以用数字、字母、下划线,不能以数字开头,不能使用特殊符号,等号两边不能有空格。

变量名称 = 值 a=10 //创建变量(对变量赋值),名字是a,值是10 a=30 //再次赋值,之前的会被覆盖 echo $a //调用变量时使用$符号 unset a //取消变量的定义 a= //将变量a赋值为空,效果同上 echo ${a}RMB //变量名容易与后续字符发生混淆时使用大括号隔开

2.环境变量

由系统提前定义好,需要时直接调用。

$USER 当前用户名 $UID 当前用户的id号 $HOME 当前用户家目录 $HOSTNAME 主机名 $SHELL 当前用户的解释器 $PWD当前位置 $PATH 存储命令的路径 $PS1 一级提示符 $PS2 二级提示符

3.位置变量与预定义变量

$1 执行脚本时后面第1个位置参数 $2 执行脚本时后面第2个位置参数 $3 执行脚本时后面第3个位置参数 $* 执行脚本时后面所有位置参数 $# 执行脚本时后面位置参数的个数 $$ 当前程序的进程号(该号码是随机的) $? 判断上一条指令是否执行成功,0是成功,非0是失败

  1. #!/bin/bash
  2. useradd tom
  3. echo "123456" | passwd --stdin tom
  4. 改良版
  5. #!/bin/bash
  6. useradd $1
  7. echo "$2" | passwd --stdin $1

env 查看所有环境变量

set 查看所有变量

变量的扩展

1.引号和反撇号

“ “ //双引号 界定范围 a=10 echo “$a” //正常调用变量 ‘ ‘ //单引号 界定范围 屏蔽特殊符号的功能 echo ‘$a’ //无法调用变量,$被屏蔽 ` //反撇号 获取命令的执行结果,还可以使用$( )实现相同效果 a=date //仅仅将四个字母赋值给a a=date` //将date执行结果赋值给a a=$(date) //效果同上

2.使用read指令

  1. #!/bin/bash
  2. read -p "请输入用户名" u //-p是可以定义提示信息,u相当于自
  3. 定义变量名称,可以存储用户看到提示信息后输入的字符
  4. useradd $u
  5. read -p "请输入密码" n
  6. echo "$n" | passwd --stdin $u
  7. 再次改良脚本:
  8. #!/bin/bash
  9. read -p "请输入用户名" u
  10. useradd $u
  11. stty -echo
  12. read -p "请输入密码" n
  13. stty echo
  14. echo "$n" | passwd --stdin $u

stty -echo 屏蔽回显 stty echo 恢复回显

3.使用export发布全局变量

局部变量:仅仅在当前解释器进程中使用的变量 全局变量:解释器产生的子进程中也可以使用的变量 a=10 //创建变量 export a //将已有变量发布为全局效果 export b=20 //创建变量的同时发布为全局效果 export -n b //将全局变量恢复为局部变量 注意,测试时要在父进程创建变量,然后可以执行bash进入,子进程测试效果,如果要返回父进程要执行exit指令。

运算

  1. 1. 加、减、乘、除、求模(取余数)
  2. 使用expr命令,可以运算并输出结果
  3. expr 1 + 1 //加法,运算符号两边要有空格
  4. expr 2 1 //减法
  5. expr 2 '*' 2 //乘法
  6. expr 2 \* 2 // \是转义符号,可以屏蔽身后一个特殊符号的功能
  7. expr 4 / 2 //除法
  8. expr 5 % 2 //取余数
  9. a=10
  10. b=20
  11. expr $a + $b
  12. expr $a + 100
  13. expr $a + $a
  14. 2$[ ] 运算 使用$(( )) 可以实现相同效果
  15. echo $[2*2]
  16. echo $[2-2]
  17. echo $[2/2]
  18. echo $[2%2]
  19. a=10
  20. b=20
  21. expr $a + $b
  22. echo $[a+b]

1.expr 运算并输出结果 2.$[ ]或者$(( )) 运算,如果要直接看 结果,可以配合echo命令 echo $[1+1] echo $[2-1] echo $[2*2] echo $[4/2] echo $[4%2] a=10 b=20 echo $[a+b]

3, 使用let命令,不输出结果,专用于变量的创建 或者变量的自增减 let a=1+1 //创建变量 变量的自增减: 常规写法 主流写法 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取余数

4,使用bc,可以进行小数计算 echo “1.1+1” | bc echo “10/3” | bc echo “scale=2; 10/3” | bc //scale可以定义结果是小数点后多少位