目录
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.延伸——()和{}
()
{}
顺序执行:程序按从上到下顺序执行
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)、
脚本是命令的集合;
将命令一一列出,最后自动执行;
执行需要权限,也可以直接使用路径;
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
重复性操作、定时任务执行:脚本可以放到Crontab -e定时计划任务中执行;
交互性任务:脚本的目的是避免人机交互
批量事务处理:将要执行的命令按顺序保存到一个文本文件进行批量操作
服务运行状态监控:例如过滤80端口的httpd服务
bash (/bin/bash)是目前大多数Linux 版本采用的默认shell
用户登录的Shell
[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
[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
脚本执行逻辑
命令执行如果错误的话,不会影响接下来的命令执行
[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
会影响接下来的命令继续
[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
如果逻辑错误的话只能自己去筛查哪里出错
[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 进行
如果命令出错,立即停止
[root@localhost ~]#vim test.sh
#/bin/bash
set -e
cd /op
rm -rf ./*
[root@localhost ~]#bash test.sh
test.sh: 第 4 行:cd: /op: 没有那个文件或目录
变量出错,立即停止
[root@localhost ~]#vim test.sh
#/bin/bash
set -u
DIR=/opt
rm -rf $DIr/*
[root@localhost ~]#bash test.sh
test.sh:行5: DIr: 为绑定变量
两个可以同时添加
标准输入和标准输出
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:所有的身份验证令牌已经成功更新
双引号 | 弱引用 | 可以识别变量 |
单引号 | 强引用 | 不能识别变量 |
{ } | 定义变量名的范围 | |
''(反撇) | 调用命令的执行结果( 反撇=$() ) |
[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
用来存放系统和用户需要使用的特定参数
变量的类型
[root@localhost ~]#a=wyq
[root@localhost ~]#echo $a
wyq
[root@localhost ~]#a=cxk
[root@localhost ~]#echo $a
cxk
常见的Shell变量的类型
系统内置变量:PATH,UID,HOSTNAME,USER
特殊符号
调用变量
取消变量
[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
#重启之后就会失效
定义一个新的变量
查看变量值
[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
设置变量的作用范围
方法
可以使用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
可以在定义的时候加export
也可以在定义完之后 开启子环境之后再加export
[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
[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
[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
[root@localhost ~]#((num=5+5))
[root@localhost ~]#((sum=1+2))
[root@localhost ~]#echo $sum
3
[root@localhost ~]#echo $num
10
[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
[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
[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
[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
[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 -------------
[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
/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
环境变量
- 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
- 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
- 一般只在系统配置文件中使用,在脚本中较少使用
位置变量也称为位置参数,使用$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 "$#" 后面参数的个数
[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