shell脚本第一章

目录

1.概述

shell脚本应用场景

三种处理逻辑

Shell脚本应用场景

常见的Shell

Shell的作用

2.脚本

编写脚本代码

编写脚本

执行脚本

使用路径执行(需要加执行权限)

直接使用解释器(不需要加执行权限)

source和" . "执行(不需要加执行权限)——不推荐(会影响环境变量)

脚本错误调试

1.命令错误

2.语法错误

3.逻辑错误

延伸

set -e

set -u

3.重定向和管道符

重定向

延伸

多行重定向

管道符

4.特殊符号

5.变量

 变量的作用

命名要求

定义变量

只读变量

自定义变量(约等于别名)

变量追加值(+=)

交互的定义变量

变量作用范围

6.整数运算

expr——只能进行整数运算(乘*需要加转义\)

bc计算器——交互式的进行算数(支持非整数)

let——只支持整数运算

((num=x+x))——支持整数运算

sum=$[x*x]——支持整数运算

延伸——变量的运算

 7.RANDOM——随机数生成器

延伸

8.修改颜色

颜色修改

随机颜色

​编辑延伸——打印当前系统信息

​编辑小拓展

9.环境变量

10.位置变量

11.预定义变量

12.延伸——()和{}

()

{}


1.概述

  • 将要执行的命令按顺序保存到一个文本文件
  • 给该文件可执行权限
  • 可结合各种shell控制语句以完成更复杂的操作

shell脚本应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行

三种处理逻辑

顺序执行:程序按从上到下顺序执行

选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)、

脚本是命令的集合;

将命令一一列出,最后自动执行;

执行需要权限,也可以直接使用路径;

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。 常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符 等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。

[root@localhost ~]#cat /etc/shells
#查看当前系统支持的Shell
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

Shell脚本应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行

重复性操作、定时任务执行:脚本可以放到Crontab  -e定时计划任务中执行;

交互性任务:脚本的目的是避免人机交互

批量事务处理:将要执行的命令按顺序保存到一个文本文件进行批量操作

服务运行状态监控:例如过滤80端口的httpd服务

常见的Shell

  • bash:基于gun的框架下发展的shell
  • csh:类似c语言的shell
  • tcsh:整合了csh提供了更多功能
  • sh:已经被bash替换
  • nologin:让用户无法登录

bash (/bin/bash)是目前大多数Linux 版本采用的默认shell

Shell的作用

  • Shell的作用——命令解释器,“翻译官”
  • 介于系统内核与用户之间,负责解释命令行

用户登录的Shell

  • 登录后默认使用的Shell程序,一般为/bin/bash
  • 不同Shell的内部指令、运行环境等会有所区别

2.脚本

编写脚本代码

  • 使用vim文本编辑器
  • 每行一条Linux命令,按执行顺序依次编写
[root@localhost ~]#vim test.sh
 
#!/bin/bash
cd /opt
pwd
touch cxk
 
[root@localhost ~]#bash test.sh 
/opt
[root@localhost ~]#ls /opt
cxk  rh

赋予可执行权限

  • 使脚本具有可执行权限
[root@localhost ~]#chmod +x test.sh 
[root@localhost ~]#ll test.sh 
-rwxr-xr-x 1 root root 34 1月  22 14:36 test.sh
  • 脚本申明(解释器):第一行开头“#! /bin/bash”表示此行以下的代码语句是通过/bin/bash程序来解释执行。#! /bin/bash为默认的解释器还有其他类型的解释器(例如还有#! /bin/python     #! /bin/expece  代码语句)
  • 注释信息:以#开头的语句表示为注释信息    #代表注释
  • 可执行语句:比如echo、ls、touch等命令用于输出“  ” 之间的字符串

编写脚本

[root@localhost ~]#vim test.sh
 
#!/bin/bash
 
#这是我的第一个脚本
 
echo "hello world"
 
 
[root@localhost ~]#bash test.sh 
hello world

执行脚本

使用路径执行(需要加执行权限)

[root@localhost /]#/test.sh
#绝对路径
hello world
[root@localhost /]#./test.sh
#相对路径
hello world

直接使用解释器(不需要加执行权限)

[root@localhost ~]#bash test.sh 
hello world

source和" . "执行(不需要加执行权限)——不推荐(会影响环境变量)

[root@localhost ~]#. test.sh 
hello world
[root@localhost ~]#source test.sh 
hello world
[root@localhost ~]#ll test.sh 
-rwxr-xr-x 1 root root 62 1月  22 14:51 test.sh

如果使用bash或者路径执行脚本,会开启子bash环境去执行脚本;使用source和 . 执行脚本 会影响当前的bash环境;

脚本执行结束后会结束;

如果想补全脚本的话  可以通过软连接的方式,ln -s

脚本错误调试

脚本执行逻辑

  • 顺序执行:程序按从上到下顺序执行
  • 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
  • 循环执行:程序执行过程中需要重复执行多次某段语句
1.命令错误

命令执行如果错误的话,不会影响接下来的命令执行

[root@localhost ~]#vim test.sh
 
#/bin/bash
 
ech "hello world"
 
 
cd /opt
touch cxk
 
 
[root@localhost ~]#bash test.sh 
test.sh:行3: ech: 未找到命令
[root@localhost ~]#cd /opt
[root@localhost opt]#ls
cxk
2.语法错误

会影响接下来的命令继续

[root@localhost ~]#vim test.sh 
#/bin/bash
 
ech "hello world"
 
 
c /opt
touch cxk
 
 
 
[root@localhost ~]#bash test.sh 
test.sh:行3: ech: 未找到命令
test.sh:行6: c: 未找到命令
[root@localhost ~]#ls /opt
3.逻辑错误

如果逻辑错误的话只能自己去筛查哪里出错

[root@localhost ~]#bash -x test.sh 
+ ech 'hello world'
test.sh:行3: ech: 未找到命令
+ c /opt
test.sh:行6: c: 未找到命令
+ touch cxk

bash -n 脚本名称 (不在当前目录下加绝对路径)     检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径)     逻辑错误

1.语法错误:会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的

2.命令错误:默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察

3.逻辑错误:只能使用 bash -x 进行

延伸

set -e

如果命令出错,立即停止

[root@localhost ~]#vim test.sh
 
 
#/bin/bash
 
set -e
cd /op
rm -rf ./*
 
[root@localhost ~]#bash test.sh 
test.sh: 第 4 行:cd: /op: 没有那个文件或目录
set -u

变量出错,立即停止

[root@localhost ~]#vim test.sh
 
#/bin/bash
 
set -u
DIR=/opt
rm -rf $DIr/*
 
 
[root@localhost ~]#bash test.sh 
test.sh:行5: DIr: 为绑定变量

两个可以同时添加

3.重定向和管道符

重定向

标准输入和标准输出

ls是标准输入  标准输出是打印在当前终端屏幕上的

类型 设备文件 文件描述编号 默认设备
标准输入 /dev/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 /dev/stderr 2 显示器

交互式硬件设备 

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息

重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置

类型 操作符 用途
重定向输入 < 从指定的文件读取数据,而不是从键盘输入
重定向输出 1> 将输出结果保存到指定的文件(覆盖原有内容)
>> 将输出结果追加到指定的文件尾部
标准错误输出 2> 将错误信息保存到指定的文件(覆盖原有内容)
2>> 标准错误输出结果追加到指定的文件尾部
混合输出 &>无论对错都可以重定向 将标准输出、标准错误的内容保存到同一个文件中
[root@localhost ~]#ls /dev/pts/1
/dev/pts/1
#ls命令最终显示到终端  标准重定向省略了1>
 
 
[root@localhost ~]#xxx >/dev/pts/1
bash: xxx: 未找到命令...
#错误重定向
 
[root@localhost ~]#rm xxx.txt >/dev/pts/1
rm: 无法删除"xxx.txt": 没有那个文件或目录
#错误重定向
[root@localhost ~]#vim passwd.txt
 
123321
 
[root@localhost ~]#setenforce 0
setenforce: SELinux is disabled
 
 
[root@localhost ~]#passwd --stdin zk < passwd.txt 
更改用户 zk 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]#cat passwd.txt 
123321
[root@localhost ~]#echo "123321" > passwd.txt 
[root@localhost ~]#cat passwd.txt 
123321
[root@localhost ~]#ls > passwd.txt 
[root@localhost ~]#cat passwd.txt 
all.log
anaconda-ks.cfg
initial-setup-ks.cfg
passwd.txt
webmin-2.100-1.noarch.rpm
公共
模板
视频
图片
文档
下载
音乐
桌面

延伸

#不能将正确和错误一起显示出来 
[root@centos7 ~]#ls /data /xxx 1> /data/all.log 2>&1
[root@centos7 ~]#ls /data /xxx 2> /data/all.log 1>&2 
[root@centos7 ~]#ls /data /xxx &> /data/all.log  
[root@centos7 ~]#ls /data /xxx >& /data/all.log  
 
[root@centos7 ~]#ls /data /xxx   2>&1 1> /data/all.log
#不可以显示出来
 
1代表 正确输入
2代表 错误输入
&    代表混合

多行重定向

Here Document 概述 使用 I/O 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。 HereDocument是标准输入的一种替代品, 可以帮助脚本开发人员不必使用临时文件来构建输入信息, 而是直接就地生产出一个文件并用作命令的标准输入。

[root@localhost opt]#wc -l < cxk.txt
#需要回车才可以写入
123
321
cxk
^C
[root@localhost opt]#ls
cxk.txt
[root@localhost opt]#ls cxk.txt 
cxk.txt
[root@localhost opt]#cat cxk.txt 
123
321
cxk
 
 
[root@localhost opt]#cat >test.txt < 111
> 222
> 333
> cxk
> EOF
[root@localhost opt]#ls
cxk.txt  test.txt
[root@localhost opt]#cat test.txt 
111
222
333
cxk

管道符

管道操作符号“ | ”

将左侧的命令输出结果,作为右侧命令的处理对象

[root@localhost ~]#grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
zk:x:1000:1000:ghd:/home/ghd:/bin/bash
 
[root@localhost ~]#grep "bash$" /etc/passwd|awk -F: '{print $1,$7}'
root /bin/bash
zk /bin/bash
 
 
[root@localhost opt]# echo "123123" |passwd --stdin zk
更改用户 zk 的密码 。
passwd:所有的身份验证令牌已经成功更新

4.特殊符号

  1. 赋值时使用双引号(" ")可以直接调用变量
  2. 赋值时使用单引号(' ')变量$只会被认为是字符$ 不会调用变量
  3. 赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结 果 和$( ) 用法相同
  4. {}可以分隔变量值
双引号 弱引用 可以识别变量
单引号 强引用 不能识别变量
{  } 定义变量名的范围
''(反撇) 调用命令的执行结果(  反撇=$()  )

 

[root@localhost ~]#name=cxk
[root@localhost ~]#name1=wyq
[root@localhost ~]#echo $name1
wyq
[root@localhost ~]#echo name
name
[root@localhost ~]#echo $name
cxk
[root@localhost ~]#echo $name$name1
cxkwyq
[root@localhost ~]#echo ${name1}name
wyqname
#建议带着{}
 
 
弱引用  强引用
[root@localhost ~]#echo "$name1"
wyq
 
[root@localhost ~]#echo '$name1'
$name1
 
[root@localhost ~]#date
2024年 01月 23日 星期二 14:40:50 CST
[root@localhost ~]#date +%F
2024-01-23
[root@localhost ~]#touch `date +%F`
[root@localhost ~]#ls 2024-01-23 
2024-01-23
 
 
 
 
 
 
 
[root@localhost ~]#df 
文件系统                   1K-块    已用     可用 已用% 挂载点
/dev/mapper/centos-root 52403200 5265668 47137532   11% /
devtmpfs                  917604       0   917604    0% /dev
tmpfs                     933524       0   933524    0% /dev/shm
tmpfs                     933524    9208   924316    1% /run
tmpfs                     933524       0   933524    0% /sys/fs/cgroup
/dev/sda1                5232640  182368  5050272    4% /boot
tmpfs                     186708       0   186708    0% /run/user/0
tmpfs                     186708      12   186696    1% /run/user/42
[root@localhost ~]#df |grep sda
/dev/sda1                5232640  182368  5050272    4% /boot
[root@localhost ~]#df |grep sda|tr -s " "|cut -d" " -f5
4%
[root@localhost ~]#df |grep sda|tr -s " "|cut -d" " -f5|tr -d %
4
[root@localhost ~]#use=`df |grep sda|tr -s " "|cut -d" " -f5|tr -d %`
[root@localhost ~]#echo $use 
4
 
 
 
 
 
 
 
[root@localhost ~]#name=root
[root@localhost ~]#grep '$name' /etc/passwd
[root@localhost ~]#grep ''$name'' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]#grep '  ' $name ' ' /etc/passwd

5.变量

 变量的作用

用来存放系统和用户需要使用的特定参数

  • 变量名:使用固定的名称,由系统预设或用户定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

变量的类型

  • 自定义变量:由用户自己定义、修改和使用
  • 特殊变量:环境变量,只读变量,位置变量,预定义变量
[root@localhost ~]#a=wyq
[root@localhost ~]#echo $a
wyq
[root@localhost ~]#a=cxk
[root@localhost ~]#echo $a
cxk

常见的Shell变量的类型

  • 自定义变量:由用户自己定义,修改和使用
  • 预定义变量:Bash中内置的一类变量
  • 环境变量:由系统维护,用于设置工作环境  当前目录  当前主机名  $PATH
  • 只读变脸:只可以读取不可以更改
  • 位置变量:通过命令性给脚本传递参数

系统内置变量:PATH,UID,HOSTNAME,USER

命名要求

  • 区分大小写
  • 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
  • 大驼峰 StudentFirstName
  • 小驼峰 studentFirstName
  • 下划线 student_name

特殊符号

  • 赋值时使用双引号(" ")可以直接调用变量(双引号 弱引用 可以识别变量)
  • 赋值时使用单引号(' ')变量$只会被认为是字符$ 不会调用变量(单引号 强引用 不能识别变量)
  • 赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结 果 和$( ) 用法相同(反撇 调用命令的执行结果 反撇=$())
  • {}可以分隔变量值({ } 定义变量名的范围)
     

定义变量

  • 变量名=变量值

调用变量

  • echo $变量名

取消变量

  • unset 变量名
[root@localhost ~]#a=cxk
[root@localhost ~]#echo $a
cxk
[root@localhost ~]#unset a
[root@localhost ~]#echo $a
 

只读变量

[root@localhost ~]#name=wsc
[root@localhost ~]#echo $name
wsc
[root@localhost ~]#readonly name
[root@localhost ~]#name=cxk
-bash: name: 只读变量
[root@localhost ~]#echo $name
wsc
[root@localhost ~]#unset name
-bash: unset: name: 无法反设定: 只读 variable
[root@localhost ~]#reboot
 
[root@localhost ~]#echo $name
 
#重启之后就会失效

自定义变量(约等于别名)

定义一个新的变量

  • 变量名以字母或下划线开头,区分大小写,建议全大写
  • 变量名=变量值

查看变量值

  • echo $变量名
[root@localhost ~]#myls=ls
[root@localhost ~]#ls
anaconda-ks.cfg       webmin-2.100-1.noarch.rpm  模板  图片  下载  桌面
initial-setup-ks.cfg  公共                       视频  文档  音乐
[root@localhost ~]#$myls
anaconda-ks.cfg       webmin-2.100-1.noarch.rpm  模板  图片  下载  桌面
initial-setup-ks.cfg  公共			 视频  文档  音乐

变量追加值(+=)

[root@localhost ~]#name=wyq
[root@localhost ~]#echo $name 
wyq
[root@localhost ~]#name+=cxk
[root@localhost ~]#echo $name
wyqcxk
 
 
 
#修改环境变量
PATH+=:/data
 
[root@localhost ~]#vim /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data"

交互的定义变量

read -p交互式的输入变量值

[root@localhost ~]#vim test.sh
 
#/bin/bash
read -p "请输入密码:"  number
 
echo $number
 
[root@localhost ~]#bash test.sh 
请输入密码:123
123
 
 
 
 
[root@localhost ~]#vim test.sh
 
#/bin/bash
read -p "请输入ip地址检测主机连通性:"  time
ping -c2 $time
 
 
[root@localhost ~]#bash test.sh 
请输入ip地址检测主机连通性:192.168.241.11
PING 192.168.241.11 (192.168.241.11) 56(84) bytes of data.
64 bytes from 192.168.241.11: icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from 192.168.241.11: icmp_seq=2 ttl=64 time=0.089 ms
 
--- 192.168.241.11 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.062/0.075/0.089/0.016 ms

变量作用范围

  • 默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
  • 可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用

设置变量的作用范围

方法

  • 格式1:export 变量名
  • 格式2:export 变量名=变量值

可以使用pstree 查看shell的环境;

输入bash进入子shell;

ctrl+D组合exit 退出子shel。

[root@localhost ~]#export name
[root@localhost ~]#echo $name 
wyqcxk
[root@localhost ~]#echo $Product $Version
 
[root@localhost ~]#bash
[root@localhost ~]#pstree -p|grep bash
           |-sshd(980)---sshd(1631)---bash(1639)---bash(2370)-+-grep(2409)
[root@localhost ~]#env
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=192.168.241.1 53690 22
SSH_TTY=/dev/pts/0
USER=root
name=wyqcxk
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/root
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
HOME=/root
SHLVL=2
LOGNAME=root
SSH_CONNECTION=192.168.241.1 53690 192.168.241.11 22
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
LESSOPEN=||/usr/bin/lesspipe.sh %s
DISPLAY=localhost:10.0
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
 
 
[root@localhost ~]#exit
 
 
[root@localhost ~]#env
XDG_SESSION_ID=7
HOSTNAME=localhost.localdomain
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.241.1 60953 22
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
SSH_CONNECTION=192.168.241.1 60953 192.168.241.11 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
DISPLAY=localhost:10.0
_=/usr/bin/env

shell脚本第一章_第1张图片

可以在定义的时候加export

也可以在定义完之后 开启子环境之后再加export

6.整数运算

expr——只能进行整数运算(乘*需要加转义\)

[root@localhost ~]#expr 1+2
1+2
[root@localhost ~]#expr 1 + 2
3
[root@localhost ~]#expr 5 - 2
3
[root@localhost ~]#expr 5 / 2
2
[root@localhost ~]#expr 5 * 2
expr: 语法错误
[root@localhost ~]#expr 5 \* 2
10
[root@localhost ~]#expr 6 / 2
3

bc计算器——交互式的进行算数(支持非整数)

[root@localhost ~]#bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1*6
6
2*5
10
1+5+95+5+
(standard_in) 4: syntax error
1+5+95+5
106
9/3
3
6.3+5.8+3.6
15.7

let——只支持整数运算

[root@localhost ~]#let sum=1+6
[root@localhost ~]#echo $sum
7
[root@localhost ~]#let sum=5*5
[root@localhost ~]#echo $sum 
25
[root@localhost ~]#let sum=6*3;echo $sum 
18

((num=x+x))——支持整数运算

[root@localhost ~]#((num=5+5))
[root@localhost ~]#((sum=1+2))
[root@localhost ~]#echo $sum
3
[root@localhost ~]#echo $num
10

sum=$[x*x]——支持整数运算

[root@localhost ~]#sum=$[5*5]
[root@localhost ~]#echo $sum
25
[root@localhost ~]#sum=$[9*6];echo $sum
54

建议使用let和sum$

[root@localhost ~]#let sum=1+9;echo $sum
10
[root@localhost ~]#sum=$[1+9];echo $sum
10

延伸——变量的运算

[root@localhost ~]#a=10
[root@localhost ~]#b=5
[root@localhost ~]#expr $a + $b
15
[root@localhost ~]#let sum=$a*$b;echo $sum
50
[root@localhost ~]#sum=$[a*b];echo $sum
50

 7.RANDOM——随机数生成器

[root@localhost ~]#man bash
 
RANDOM 每次引用这个参数时,都会产生一个        0        到         32767
              之间的随机整数。可以通过向                                 RANDOM
              赋值来初始化随机数序列。如果取消了                         RANDOM
              的定义,它就失去了特殊的意义,即使后来重新定义它。

RANDOM取值范围是0-32767

[root@localhost ~]#echo $RANDOM 
13461
[root@localhost ~]#echo $RANDOM 
12383
[root@localhost ~]#echo $RANDOM 
22935
[root@localhost ~]#echo $RANDOM 
23980
[root@localhost ~]#echo $RANDOM 
27897
[root@localhost ~]#echo $RANDOM 
25217
[root@localhost ~]#echo $RANDOM 
2245

延伸

[root@localhost ~]#echo $[RANDOM%10]
9
[root@localhost ~]#echo $[RANDOM%10]
5
[root@localhost ~]#echo $[RANDOM%10]
8
[root@localhost ~]#echo $[RANDOM%10]
6
[root@localhost ~]#echo $[RANDOM%10]
0
[root@localhost ~]#echo $[RANDOM%10]
9
[root@localhost ~]#echo $[RANDOM%10]
5
 
 
#表示随机生成小于10的数字   范围是0-9
 
 
 
 
[root@localhost ~]#echo $[RANDOM%10+1]
8
[root@localhost ~]#echo $[RANDOM%10+1]
8
[root@localhost ~]#echo $[RANDOM%10+1]
1
[root@localhost ~]#echo $[RANDOM%10+1]
1
[root@localhost ~]#echo $[RANDOM%10+1]
8
[root@localhost ~]#echo $[RANDOM%10+1]
8
[root@localhost ~]#echo $[RANDOM%10+1]
1
[root@localhost ~]#echo $[RANDOM%10+1]
7
[root@localhost ~]#echo $[RANDOM%10+1]
10
[root@localhost ~]#echo $[RANDOM%10+1]
10
 
 
 
#表示随机生成小于10的数字   范围是1-10

8.修改颜色

颜色修改

[root@localhost ~]#echo -e "\E[1;30mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;31mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;32mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;33mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;34mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;35mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;36mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;37mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;38mhello world\E[0m"
hello world

shell脚本第一章_第2张图片

随机颜色

[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world
[root@localhost ~]#echo -e "\E[1;$[RANDOM%7+31]mhello world\E[0m"
hello world

shell脚本第一章_第3张图片延伸——打印当前系统信息

[root@localhost ~]#vim system_info.sh
 
 
 
#/bin/bash
host=`ifconfig ens33|grep netmask|tr -s " "|cut -d " " -f3`
name=`hostname`
cpu=`lscpu|grep 型号名称|tr -s " "|cut -d " " -f2-8`
test=`uname -r`
os=`cat /etc/redhat-release`
disk=`lsblk|grep disk|tr -s " "|cut -d " " -f4`
mem=`free -h|grep Mem|awk '{print $2}'`
 
echo -e "\E[1;32m-------------system info-------------\E[0m"
 
echo "主机名:   $name"
echo "IP地址:   $host"
echo "cpu型号:  $cpu"
echo "内核版本: $test"
echo "系统类型: $os"
echo "磁盘大小: $disk"
echo "内存大小: $mem"
 
 
echo -e "\E[1;36m-------------    end     -------------\E[0m"
 
 
 
 
 
[root@localhost ~]#bash system_info.sh 
-------------system info-------------
主机名:   localhost.localdomain
IP地址:   192.168.241.11
cpu型号:  Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
内核版本: 3.10.0-693.el7.x86_64
系统类型: CentOS Linux release 7.4.1708 (Core) 
磁盘大小: 60G
内存大小: 1.8G
-------------    end     -------------

shell脚本第一章_第4张图片小拓展

[root@localhost ~]#lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    1
座:                 2
NUMA 节点:         1
厂商 ID:           GenuineIntel
CPU 系列:          6
型号:              142
型号名称:        Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
步进:              10
CPU MHz:             1990.571
BogoMIPS:            3984.00
超管理器厂商:  VMware
虚拟化类型:     完全
L1d 缓存:          32K
L1i 缓存:          32K
L2 缓存:           256K
L3 缓存:           8192K
NUMA 节点0 CPU:    0,1
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat
[root@localhost ~]#lscpu |grep 型号名称
型号名称:        Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
[root@localhost ~]#lscpu |grep 型号名称|tr -s " "|cut -d " " -f2
Intel(R)
[root@localhost ~]#lscpu |grep 型号名称|tr -s " "|cut -d " " -f2-8
Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
[root@localhost ~]#lscpu |grep 型号名称|tr -s " "|cut -d ":" -f2-8
型号名称: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
[root@localhost ~]#lscpu |grep 型号名称|tr -s " "|cut -d ":" -f2
型号名称: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz

9.环境变量

  • 由系统提前创建,用来设置用户的工作环境
  • 可以使用env查看环境变量
  • 需要记住的常用环境变量
  • 配置文件:/etc/profile、~/.bash_profile

/etc/profile如果修改此文件会作用于所有用户

~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用户

常见的环境变量:PWD、PATH、USER、SHELL、HOME

[root@localhost ~]#echo $PATH
#表示可执行用户程序的默认路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]#echo $PWD
#表示当前所在工作目录
/root
[root@localhost ~]#echo $USER
#表示用户名称
root
[root@localhost ~]#echo $SHELL
#表示使用SHELL类型
/bin/bash
[root@localhost ~]#echo $HOME
#表示用户的宿主目录
/root

定义环境变量

[root@localhost ~]#export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data"
[root@localhost ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data

环境变量

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
  • 一般只在系统配置文件中使用,在脚本中较少使用

10.位置变量

位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示

[root@localhost ~]#vim test.sh
 
 
#!/bin/bash
echo $1
echo $2
echo $3
 
[root@localhost ~]#bash test.sh  a b c d e
a
b
c
 
[root@localhost ~]#bash test.sh {a..z}
a
b
c
[root@localhost ~]#bash test.sh {1..10}
1
2
3
 
 
 
 
 
 
 
[root@localhost ~]#vim test.sh
 
 
#!/bin/bash
echo $1
echo $2
echo $3
echo ${10}
 
[root@localhost ~]#bash test.sh {1..10}
1
2
3
10
[root@localhost ~]#bash test.sh {1..20}
1
2
3
10
 
 
 
 
 
 
[root@localhost ~]#vim test.sh
 
 
#!/bin/bash
echo $1
echo $2
echo $3
echo ${10}
echo $10
 
[root@localhost ~]#bash test.sh {a..z}
a
b
c
j
a0
 
 
 
 
 
[root@localhost ~]#vim test.sh 
 
 
#!/bin/bash
echo $1
echo $2
echo $3
echo ${10}
echo $10
echo $*
echo $@
 
 
[root@localhost ~]#bash test.sh {a..z}
a
b
c
j
a0
a b c d e f g h i j k l m n o p q r s t u v w x y z
 
[root@localhost ~]#bash test.sh {a..z}
a
b
c
j
a0
a b c d e f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@localhost ~]#bash test.sh {1..10}
1
2
3
10
10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
 
 
 
 
 
[root@localhost ~]#vim test.sh 
 
 
#!/bin/bash
echo $1
echo $2
echo $3
echo ${10}
echo $10
echo $*
echo $@
echo $0
 
[root@localhost ~]#bash test.sh {1..10}
1
2
3
10
10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
test.sh
 
 
 
 
 
 
[root@localhost ~]#vim test.sh 
 
 
#!/bin/bash
echo $1
echo $2
echo $3
echo ${10}
echo $10
echo $*
echo $@
echo $0
echo $#
 
[root@localhost ~]#bash test.sh {1..10}
1
2
3
10
10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
test.sh
10
[root@localhost ~]#bash test.sh {1..20}
1
2
3
10
10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
test.sh
20
[root@localhost ~]# vim 1.sh      
#!/bin/bash
echo "$1"            位置1
echo "$2"            位置2
echo "${10}"         位置10
echo "$10"           位置1和0
echo "$*"            将所有项当成一个值
echo "$@"            所有项
echo "$0"            脚本自身
echo "$#"            后面参数的个数

11.预定义变量

  • $*:表示所有位置参数的内容看成一个整体返回 返回所有
  • $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
  • $#:表示命令行中位置参数的总个数
  • $0:表示当前执行的脚本或程序的名称 当前脚本的名字
  • $$:当前bash的进程id
  • $!: 后台任务最后一个id

12.延伸——()和{}

()

[root@localhost ~]#ls
anaconda-ks.cfg       test.sh                    模板  文档  桌面
initial-setup-ks.cfg  webmin-2.100-1.noarch.rpm  视频  下载
system_info.sh        公共                       图片  音乐
[root@localhost ~]#cd /opt;ls
cxk
[root@localhost opt]#cd
[root@localhost ~]#(cd /opt;ls)
cxk

{}

[root@localhost ~]#ls
anaconda-ks.cfg       test.sh                    模板  文档  桌面
initial-setup-ks.cfg  webmin-2.100-1.noarch.rpm  视频  下载
system_info.sh        公共                       图片  音乐
[root@localhost ~]#(cd /opt;mkdir wyq)
[root@localhost ~]#ls /opt
cxk  wyq
[root@localhost ~]#{ cd /opt;touch wyq }
> ^C
[root@localhost ~]#{ cd /opt;touch wyq; }
[root@localhost opt]#ls
cxk  wyq
[root@localhost opt]#ll
总用量 0
drwxr-xr-x 2 root root 6 1月  23 18:13 cxk
drwxr-xr-x 2 root root 6 1月  23 18:33 wyq
[root@localhost opt]#{ cd /opt;touch wyq1; }
[root@localhost opt]#ls
cxk  wyq  wyq1

总结

()表示执行过,直接显示结果;{}要执行操作,也显示结果;

()不需要结尾;{}需要;结尾;

()会开启子进程;{}不会开启子进程。

[root@localhost ~]#name=cxk
[root@localhost ~]#(name=cxk;echo $name);echo $name
cxk
cxk
 
[root@localhost ~]#{ name=cxk;echo $name; };echo $name
cxk
cxk

你可能感兴趣的:(linux,服务器,运维)