shell脚本应用

shell 脚本编程
~shell:逻辑+系统管理命令
一、shell与bash区别
shell 命令解释器:众多解释器的总括ksh、sh、tcsh、csh、bash
bash 命令解释器: 属于某一个人,或属于某家公司开发出来的产品,众多解释器中的一个,具体产品
~存放位置 #cat /etc/shells
/usr/bin/bash快捷键 = /bin/bash
~用户解释器:useradd -s /bin/bash 默认
#usermod -s /bin/tcsh 永久改解释器
#tcsh 回车 临时改解释器
#exit 退出该解释器
~装解释器 yum -y insall kssh 不支持快捷键,没有上下左右键
#cat /etc/shells
#ksh 回车 #ls #ls – color
###############################################
二、bash特点
运维工作,人工—自动化
脚本运行-cpu,内存;用户白天访问,脚本晚上运行较好
@快捷键 ctrl +L +D +W +E命令的行尾 +A 命令的行首
@tab键:命令、路径、文件、选项-默认不支持-要装bash-completion包
公司最小化mini安装默认不支持tab键-要装bash-completion包
公司不允许随便装包改密、装包需先申请–gcc先源码包编译、安装再卸载
@命令历史:方便上下键,默认1000条,50-100条
/etc/profile HISTSIZE=50,history -c清空历史记录
真实机的PXE的安装后脚本Post-scripts、虚拟机的模版里先改命令历史
PXE pre-Scripts
PXE post-Scripts
@别名:#alias 查看默认别名 ; \cp 去掉别名 ; i:interacter交互式;alias 查看=‘ls --color’ 支持中文;
环境变量: /etc/profile 全局文件,对所有用户有效;~/.bash_profile用户文件 ,指定用户有效。
/etc/bashrc放的是 函数、别名
@输入输出:标准输出1> 不写默认、错误输出2、&错误正确都输出
[root@svr5 ~]# mail –s Error root < /etc/passwd
@重定向
#ls anaconda-ks.cfg ttt > 1.log 2> 2.log /分开存放
#vim a.sh
#!/bin/bash
for i in 1 2 33 a g /看个数 循环五次
for i in {1…100} $(cat a.txt) /循环
do
useradd i &gt; &gt; o k . l o g 2 &gt; &gt; e r r o r . l o g / e c h o 123 p a s s w d s t d i n u s e r i &gt;&gt;ok.log 2&gt;&gt;error.log /日志追加写入 echo “123” | passwd --stdin user i &>>2.log
done
#######
ls >1.log 2>&1 = ls &>1 效果等同
#######
mail -s warning root < mail.txt 再将文件发送到手机
监控【CPU】90% 》 邮件

top -P 按cpu排序 -M 按内存排序
uptime
free 看内存 小于哪个值用 if判断
echo“CPU超了” | mail -s warning [email protected]
#######
@管道操作
linux设计思想
small 【优点:快,漏洞少bug】 【缺点:功能少,依赖关系】
用管道可以使出错率减小
who | wc -l 看有多少人连接电脑
[root@svr5 ~]# yum list | grep cluster
####################################################
三、脚本的编写
1.新建文件(.sh)
2.编写内容(#!/bin/bash;#版本号、描述信息;)
3.赋予权限,执行(chmod +x )
执行脚本:有权限的# ./test.sh 相对路径、#/root/test.sh 绝对路径;
无权限的: 1.开子进程的–#bash test.sh #sh test.sh ksh/tcsh/sh #python test.py
2.不开子进程的–#source test.sh # . test.sh (修改系统脚本时,相当于reboot重起可立即生效)
printf “abc” 用python无法解释
which perl/python
#!/bin/bash
o=”chen”
exit
[root@server0 ~]# bash 3.sh
[root@server0 ~]# echo $o //开子进程的方式bash/sh执行此脚本没有任何变化
[root@server0 ~]# source 3.sh
[root@server0 ~]# echo $o //不子进程的方式source 执行此脚本会退出远程
chen
#######
[root@server0 ~]# history | wc -l
58
[root@server0 ~]# . /etc/profile 或 [root@server0 ~]# source /etc/profile
[root@server0 ~]# history | wc -l
10
###############################################################################
四、案例1:配置yum软件源
[root@server0 ~]# vim test.sh
#!/bin/bash
echo -e “\033[31m 准备配置yum源… \033[0m” /红色
sleep 1
rm -rf /etc/yum.repos.d/*
echo " [dvd]
name=dvd
baseurl=http://content.example.com/rhel7.0/x86_64/dvd
gpgcheck=0
enabled=1" > /etc/yum.repos.d/dvd.repo
yum clean all &>/dev/null
echo “yum源配置完成”
echo -e “\033[35m 可用的软件有: \033[0m” /紫色
yum repolist | grep “repolist”

案例2:编写脚本,安装软件,自动启动,开机自起
yum -y install vsftpd systemctl restart vsftpd systemctl enable vsftpd
yum -y install vsftpd &>/dev/null
systemctl restart vsftpd
systemctl enable vsftpd &>/dev/null
echo -e “\033[33m vsftpd服务启动完成,请访问ftp://172.25.0.11 验证 \033[0m”
firefox ftp://172.25.0.11
####################################################
五、变量
自定义变量 1.定义:变量名=变量值 (中间不能有空格、特殊符号、数字开头)
2.调用echo $变量名 #a=12 #b=13 #echo a a b #echo ${a}b
取消自定义变量: unset 变量名 脚本执行完变量会自动失效 # unset a
系统变量
echo $0 当前所在的进程或脚本名
echo $1 第1个参数; echo $2 第2个参数;echo $3 第3个参数
echo $* 所有位置变量的值
echo $# 已加载的位置变量的个数
echo $$ 当前运行进程的PID号 #ps aux | grep PID
echo $? 命令执行后的返回状态,0表示正常,1或其他值表示异常

[root@server0 ~]# vim /bin/myuser
#!/bin/bash
useradd $1
echo “$2” | passwd --stdin KaTeX parse error: Expected 'EOF', got '#' at position 19: …root@server0 ~]#̲ chmod +x /bin/…a” != ' a a&#x27; 反引号` `:等于 () ,引用命令,将该命令的执行结果作为参数
例:每周五使用tar备份一个/var/log
vim /root/test.sh
time=+%Y%m%d%H%M%S
tar -czPf /root/log.$time.tar.gz /var/log &>/dev/null
01 03 * * 5 /root/test.sh &>/dev/null
案例补充:
1 #service vsftpd status
[root@server0 ~]# chen=“chen gui zhen”
2 [root@server0 ~]# set | grep chen
chen=‘chen gui zhen’
3 当前用户的环境变量USER-用户名、LOGNAME-登录名、HOME-宿主目录、SHELL-登录Shell、HOSTNAME-主机名、TERM-终端类型:
[root@server0 ~]# echo $USER $LOGNAME $HOME $SHELL $HOSTNAME $TERM $UID $PATH …
root root /root /bin/bash server0.example.com xterm-256color

4 环境变量PS1表示Shell环境的一级提示符,即命令行提示符(\u 用户名、\h 主机名、\W 工作目录、$ 权限标识):[\u@\h \W]$
环境变量PS2表示二级提示符,出现在强制换行、at任务编辑等场合:# echo $PS2
使用env可查看所有环境变量:# env
使用set可查看所有变量(包括env能看到的环境变量):# set

全局变量:操作系统的变量
P A T H , l s c a t f i n d P A T H = / u s r / l o c a l / s b i n : / u s r / l o c a l / b i n : / u s r / s b i n : / u s r / b i n : / r o o t / b i n P A T H P A T H P A T H = PATH:命令搜索路径(目录),为ls、cat、find等提供路径搜索 ,对所有操作系统都很重要 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 源码装的软件都不会放在PATH路径下,需要自己做个链接,或加到PATH路径下PATH= PATH:/root/
export i=5 或 x=8;export x
局部变量:自己写的变量
i=5 脚本执行完就失效

Top
NSD SHELL DAY01
1.案例1:Shell基础应用
2.案例2:简单Shell脚本的设计
3.案例3:使用Shell变量
4.案例4:变量的扩展应用
1 案例1:Shell基础应用
1.1 问题
本案例要求熟悉Linux Shell环境的特点,主要练习以下操作:
1.切换用户的Shell环境
2.练习命令历史、命令别名
3.重定向标准输入/输出/错误输出
4.管道操作实践
1.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:切换用户的Shell环境
若需要临时使用另一种Shell环境,可以直接执行对应的Shell解释器程序,比如只要执行zsh可以切换到zsh命令行环境。
1.[root@svr5 ~]# yum -y install zsh //若缺少zsh请先安装zsh包
2… …
3.[root@svr5 ~]# cat /etc/shells
4./bin/sh
5./bin/bash
6./sbin/nologin
7./bin/tcsh
8./bin/csh
9./bin/ksh
10./bin/zsh //确认当前系统已识别zsh
11.
12.[root@svr5 ~]# zsh //进入zsh环境
13.[root@svr5]~# help help //尝试查看内部命令help的用法
14.zsh: command not found: help //失败,因为zsh未提供内部命令help
15.[root@svr5]~# exit //返回到切换前的bash环境
若希望修改用户的登录Shell,管理员可以直接通过usermod命令设置。比如,以下操作可将用户zhangsan的登录Shell改为/bin/tcsh:
1.[root@svr5 ~]# grep ‘zhangsan’ /etc/passwd
2.zhangsan❌516:516::/home/zhangsan:/bin/bash //修改前
3.[root@svr5 ~]# usermod -s /bin/tcsh zhangsan //执行修改操作
4.[root@svr5 ~]# grep ‘zhangsan’ /etc/passwd
5.zhangsan❌516:516::/home/zhangsan:/bin/tcsh //修改后
如果需要临时修改登录Shell可以直接在命令行中,输入新的Shell命令即可,如直接通过输入ksh切换:
1.[root@ svr5 ~]# yum –y install ksh //安装新的ksh
2.[root@ svr5 ~]# ksh //切换Shell
3.# //进入新的Shell
步骤二:练习命令历史
1)检查历史命令的容量。
默认记录1000条,通过全局变量HISTSIZE设置,对所有用户有效:
1.[root@svr5 ~]# grep HISTSIZE /etc/profile
2.HISTSIZE=1000
3.export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
查看已为当前用户记录的历史命令条数:
1.[root@svr5 ~]# history | wc -l
2.1000
2)查看历史命令列表。
列出最近执行的10条历史命令:
1.[root@svr5 ~]# history | tail
2. 1028 grep ‘zhangsan’ /etc/passwd
3. 1029 cat /etc/redhat-release
4. 1030 usermod -s /bin/tcsh zhangsan
5. 1031 grep ‘zhangsan’ /etc/passwd
6. 1032 su - zhangsan
7. 1033 echo 1234567 | passwd --stdin zhangsan
8. 1034 su - zhangsan
9. 1035 grep HISTSIZE /etc/profile
10. 1036 history | wc -l
11. 1037 history | tail
3)调用指定的历史命令。
重新执行历史命令列表中的第1028条操作:
1.[root@svr5 ~]# !1028
2.grep ‘zhangsan’ /etc/passwd
3.zhangsan❌516:516::/home/zhangsan:/bin/bash
重新执行最近一次以cat开头(根据实际情况变更)的历史命令操作:
1.[root@svr5 ~]# !cat
2.cat /etc/redhat-release
3.Red Hat Enterprise Linux Server release 5.9 (Tikanga)
4)清空已记录的历史命令。
1.[root@svr5 ~]# history -c //清空自己的历史命令
2.[root@svr5 ~]# > ~/.bash_history //清空记录文件
3.[root@svr5 ~]# history //再次检查历史命令列表
4. 42 > ~/.bash_history
5. 43 history
步骤三:练习命令别名
1)查看已经定义的命令别名列表。
当前的别名列表:
1.[root@svr5 ~]# alias
2.alias cp=‘cp -i’
3.alias l.=‘ls -d .* --color=tty’
4.alias ll=‘ls -l --color=tty’
5.alias ls=‘ls --color=tty’
6.alias mv=‘mv -i’
7.alias rm=‘rm -i’
8.alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde’
别名设置一般存放在用户的.bashrc文件内:
1.[root@svr5 ~]# grep ‘^alias’ ~/.bashrc
2.alias rm=‘rm -i’
3.alias cp=‘cp -i’
4.alias mv=‘mv -i’
2)自定义新的命令别名
添加一个名为lh的命令别名,实际执行的是“ls –lh –color=tty”:
1.[root@svr5 ~]# alias lh=‘ls -lh’ //定义别名命令lh
2.[root@svr5 ~]# alias lh //确认定义结果
3.alias lh=‘ls -lh’
验证别名命令的效果:
1.[root@svr5 ~]# lh /etc/fstab //使用别名
2.-rw-r–r-- 1 root root 733 10-09 15:34 /etc/fstab
3.[root@svr5 ~]# ls -lh /etc/fstab //使用完整的命令
4.-rw-r–r-- 1 root root 733 10-09 15:34 /etc/fstab
3)取消别名
取消单个别名:
1.[root@svr5 ~]# unalias lh //取消名为lh的命令别名
2.[root@svr5 ~]# alias lh //查询时已没有lh
3.-bash: alias: lh: not found
取消所有别名:
1.[root@svr5 ~]# unalias -a //取消所有别名
2.[root@svr5 ~]# alias //查询时已无任何别名
3.[root@svr5 ~]#
步骤四:重定向标准输入/输出/错误输出
标准输入(stdin),描述号为0;标准输出(stdout),描述号为1;标准错误(stderr),描述号为2。
1)重定向标准输出。
使用 > 将命令执行的正常输出重定向到文件:
1.[root@svr5 ~]# ls -l /dev/pts/0 //正常应输出到屏幕
2.crw–w---- 1 root tty 136, 0 12-10 14:04 /dev/pts/0
3.[root@svr5 ~]# ls -l /dev/pts/0 > stdout.txt //重定向到文件
4.[root@svr5 ~]# cat stdout.txt //确认重定向输出的结果
5.crw–w---- 1 root tty 136, 0 12-10 14:04 /dev/pts/0

操作会覆盖目标文件(先清空、再写入):
1.[root@svr5 ~]# echo “I am the king.” > stdout.txt //覆盖目标文件
2.[root@svr5 ~]# cat stdout.txt //确认结果
3.I am the king.
改用 >> 可实现追加重定向输出:
1.[root@svr5 ~]# ls -l /dev/pts/0 >> stdout.txt //追加输出
2.[root@svr5 ~]# cat stdout.txt
3.I am the king. //原有内容还保留
4.crw–w---- 1 root tty 136, 0 12-10 14:08 /dev/pts/0 //新加的内容
2)重定向标准错误。
对于命令执行出错的信息,使用 > 无法保存,仍然会输出到屏幕。比如,可使用ls命令同时查看两个对象(其中nofile并不存在),重定向输出:
1.[root@svr5 ~]# ls -lh nofile.txt /etc/fstab > stderr.txt
2.ls: nofile.txt: 没有那个文件或目录 //出错信息仍显示到屏幕
3.[root@svr5 ~]# cat stderr.txt //正常信息成功重定向到目标文件
4.-rw-r–r-- 1 root root 733 10-09 15:34 /etc/fstab
使用 2> 可重定向错误信息,比如,可执行一个错误的命令:
1.[root@svr5 ~]# ipconfig /all
2.-bash: ipconfig: command not found //正常情况下,错误显示到屏幕
3.[root@svr5 ~]# ipconfig /all 2> stderr.txt //将错误信息重定向到目标文件
4.[root@svr5 ~]# cat stderr.txt //确认重定向结果
5.-bash: ipconfig: command not found
类似的,2>> 可实现追加输出:
1.[root@svr5 ~]# ls nofile 2>> stderr.txt
2.[root@svr5 ~]# cat stderr.txt
3.-bash: ipconfig: command not found
4.ls: nofile: 没有那个文件或目录
若希望将正常输出、错误输出重定向同一个文件,可使用 &> :
1.[root@svr5 ~]# ls -lh nofile.txt /etc/fstab &> stderr.txt
2.[root@svr5 ~]# cat stderr.txt
3.ls: nofile.txt: 没有那个文件或目录
4.-rw-r–r-- 1 root root 733 10-09 15:34 /etc/fstab
3)重定向标准输入。
1.[root@svr5 ~]# mail –s Error root < /etc/passwd
步骤五:管道操作实践
借助于管道符“|”,可以将一条命令的标准输出交给另一条命令处理,在一条命令行内可依次使用多个管道。
1)统计/etc/目录下资料的数量。
1.[root@svr5 ~]# ls -l /etc | wc -l
2.254
2)列出Yum库里名称中含cluster的软件包。
1.[root@svr5 ~]# yum list | grep cluster
2.cluster-cim.x86_64 0.12.1-7.el5 RHEL5-Cluster
3.cluster-snmp.x86_64 0.12.1-7.el5 RHEL5-Cluster
4.… …
2 案例2:简单Shell脚本的设计
2.1 问题
本案例要求编写三个脚本程序,分别实现以下目标:
1.在屏幕上输出一段文字“Hello World”
2.能够为本机快速配好Yum仓库
3.能够为本机快速装配好vsftpd服务
2.2 方案
一个规范的Shell脚本构成包括:
脚本声明(需要的解释器、作者信息等)
注释信息(步骤、思路、用途、变量含义等)
可执行语句(操作代码)
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:编写第一个Shell脚本,输出“Hello World”
1)根据手动任务操作编写脚本文件
1.[root@svr5 ~]# vim /root/first.sh
2.#!/bin/bash
3.echo ‘Hello World’

5.[root@svr5 ~]# chmod +x /root/first.sh //添加可执行权限
2)执行脚本,测试效果
1.[root@svr5 ~]# /root/first.sh
2.Hello World
3)Shell脚本的执行方式:
方法一,作为“命令字”:指定脚本文件的路径,前提是有 x 权限
1.[root@svr5 ~]# ./first.sh //指定相对路径
2.[root@svr5 ~]# /root/first.sh //指定绝对路径
方法二,作为“参数”:使用bash、sh、source或者点号 . 来加载脚本文件
1.[root@svr5 ~]# bash first.sh //开启子进程
2.[root@svr5 ~]# sh first.sh //开启子进程
3.[root@svr5 ~]# source first.sh //不开启子进程
4.[root@svr5 ~]# . first.sh //不开启子进程
步骤二:编写为本机快速配Yum仓库的Shell脚本
1)Yum仓库配置文件的参考内容如下:
1.[root@svr5 ~]# vim /etc/yum.repos.d/rhel6.repo
2.[rhel6]
3.name=Red Hat Enterprise Linux 6
4.baseurl=file:///misc/cd
5.enabled=1
6.gpgcheck=1
7.gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
2)根据参考文件的内容,编写脚本内容如下:
1.[root@svr5 ~]# vim /root/el6repo.sh
2.#!/bin/bash
3.rm -rf /etc/yum.repos.d/.repo
4.echo ‘[rhel-packages]
5.name=Red Hat Enterprise Linux 6
6.baseurl=file:///misc/cd
7.gpgcheck=1
8.gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
9.’ > /etc/yum.repos.d/rhel6.repo
10.[root@svr5 ~]# chmod +x /root/el6repo.sh //添加可执行权限
3)执行脚本,测试效果
执行配置Yum仓库的脚本:
1.[root@svr5 ~]# /root/el6repo.sh
检查配置结果:
1.[root@svr5 ~]# ls /etc/yum.repos.d/
//仓库配置已建立
2./etc/yum.repos.d/rhel6.repo
3.
4.[root@svr5 ~]# yum repolist //Yum仓库已可用
5.rhel-packages | 3.9 kB 00:00 …
6.rhel-packages/primary_db | 3.1 MB 00:00 …
7.repo id repo name status
8.rhel-packages Red Hat Enterprise Linux 6 3,690
9.repolist: 3,690
步骤三:编写快速装配vsftpd服务的Shell脚本
1)编写参考脚本文件如下:
1.[root@svr5 ~]# vim /root/ftpon.sh
2.#!/bin/bash
3.yum -y install vsftpd &> /dev/null
4.service vsftpd restart
5.chkconfig vsftpd on
6.[root@svr5 ~]# chmod +x /root/ftpon.sh //添加可执行权限
3)执行脚本,测试效果
执行快速装配vsftpd服务的脚本:
1.[root@svr5 ~]# /root/ftpon.sh
2.关闭 vsftpd: [失败]
3.为 vsftpd 启动 vsftpd: [确定]
确认脚本执行结果:
1.[root@svr5 ~]# rpm -q vsftpd
2.vsftpd-2.2.2-11.el6_4.1.x86_64
3.
4.[root@svr5 ~]# service vsftpd status
5.vsftpd (pid 45694) 正在运行…
6.
7.[root@svr5 ~]# chkconfig --list vsftpd
8.vsftpd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
3 案例3:使用Shell变量
3.1 问题
本案例要求熟悉Shell变量的使用,主要练习或验证下列内容:
1.定义/赋值/查看变量
2.环境/预定义/位置变量的应用
除了学会建立和引用变量以外,还要认识环境变量PWD、USER、HOME、SHELL,还有预定义变量 0 0、 ?、KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲、,以及位置变量$1、$2、$10、……的作用。
3.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:变量的定义/赋值/查看
1)新建/赋值变量
新建变量SCHOOL,赋值“Tarena IT GROUP”,通过set命令可以检查变量设置:
1.[root@svr5 ~]# SCHOOL=“Tarena IT”
2.[root@svr5 ~]# set | grep SCHOOL
3.SCHOOL=‘Tarena IT’
2)查看变量
通过echo $变量名 可输出变量值:
1.[root@svr5 ~]# echo $SCHOOL
2.Tarena IT
查看变量时,若变量名称与后面要输出的字符串连在一起,则应该以{}将变量名括起来以便区分:
1.[root@svr5 ~]# echo $SCHOOLGroup //无法识别变量名SCHOOL
2.
3.[root@svr5 ~]# echo ${SCHOOL}Group //区分后可以识别
4.Tarena ITGroup
3)撤销自定义变量
若要撤销已有的变量,可使用unset命令:
1.[root@svr5 ~]# unset SCHOOL //撤销变量SCHOOL
2.[root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 152: …1.[root@svr5 ~]#̲ cat /etc/profi…USER
6. MAIL="/var/spool/mail/$USER"
7.fi
8.HOSTNAME=/bin/hostname
9.HISTSIZE=1000
10… …
11.export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
12… …
2)使用环境变量
当前用户的环境变量USER记录了用户名、LOGNAME记录了登录名、HOME记录了宿主目录、SHELL记录了登录Shell、HOSTNAME记录主机名、TERM记录终端类型:
1.[root@svr5 ~]# echo $USER $LOGNAME $HOME $SHELL
2.root root /root /bin/bash
3.[root@svr5 ~]# echo $HOSTNAME
4.svr5.tarena.com
5.[root@svr5 ~]# echo $TERM
6.xterm
环境变量PS1表示Shell环境的一级提示符,即命令行提示符(\u 用户名、\h 主机名、\W 工作目录、$ 权限标识):
1.[root@svr5 src]# echo $PS1 //查看默认的一级提示
2.[\u@\h \W]$
3.[root@svr5 src]#PS1=‘bash-3.2$’ //修改一级提示
4.bash-3.2# //更改结果
5.bash-3.2#PS1=’[\u@\h \W]$ ’ //恢复原有设置
6.[root@svr5 src]#
环境变量PS2表示二级提示符,出现在强制换行、at任务编辑等场合:
1.[root@svr5 ~]# echo $PS2 //查看默认的二级提示
2.>
3.[root@svr5 src]# cd \ //强制换行,观察提示符效果
4.> /root/
5.[root@svr5 ~]# PS2=’=> ’ //手动修改二级提示
6.[root@svr5 ~]# cd \ //再次验证提示符效果
7.=> ~
8.[root@svr5 ~]# PS2=’> ’ //恢复原有设置
3)查看系统变量
使用env可查看所有环境变量:
1.[root@svr5 src]# env
2.HOSTNAME=svr5.tarena.com
3.TERM=xterm
4.SHELL=/bin/bash
5.HISTSIZE=1000
6.SSH_CLIENT=192.168.4.110 59026 22
7.OLDPWD=/root
8.SSH_TTY=/dev/pts/0
9.USER=root
10… …
使用set可查看所有变量(包括env能看到的环境变量):
1.[root@svr5 src]# set
2.BASH=/bin/bash
3.BASH_ARGC=()
4.BASH_ARGV=()
5.BASH_LINENO=()
6… …
步骤三:使用位置变量与预定义变量
1)创建一个测试脚本,用来展示。
1.[root@svr5 ~]# vim location.sh
2.#!/bin/bash
3.echo $0 //脚本的名称
4.echo $1 //第一个参数
5.echo $2 //第二个参数
6.echo $
//所有参数
7.echo $# //所有的综合
8.echo $$ //当前进程的进程号
9.echo $? //上一个程序的返回状态码
10.[root@svr5 ~]# chmod +x location.sh //添加可执行权限
2)执行脚本location.sh,测试结果。
1.[root@svr5 ~]# ./location.sh one 1 2 abc qq 8 7
步骤四:创建账户与修改密码的脚本
1)编写脚本。
1.[root@svr5 ~]# vim /root/user.sh
2.#!/bin/bash
3.useradd $1
4.echo “$2” |passwd --stdin KaTeX parse error: Expected 'EOF', got '#' at position 27: …1.[root@svr5 ~]#̲ ./user.sh jerr…USER’
2.[root@svr5 ~]# echo N O T E 3. : NOTE 3.当前的用户是: USER //单引号内的 $ 被视为普通字符
3)反撇号或 ( ) 使 ()的应用 使用反撇号或 ()时,可以将命令执行的标准输出作为字符串存储,因此称为命令替换。
1.[root@svr5 ~]# tar -czf log-date +%Y%m%d.tar.gz /var/log
步骤二:使用read命令从键盘读取变量值
1)read基本用法
执行后从会等待并接受用户输入(无任何提示的情况),并赋值给变量str:
1.[root@svr5 ~]# read str
2.What’s happen ? //随便输入一些文字,按Enter键提交
3.[root@svr5 ~]# echo $str //查看赋值结果
4.What’s happen ?
为了不至于使用户不知所措、莫名其妙,推荐的做法是结合-p选项给出友好提示:
1.[root@svr5 ~]# read -p “请输入一个整数:” i
2.请输入一个整数:240
3.[root@svr5 ~]# echo $i
4.240
2)stty终端显示控制
将回显功能关闭(stty -echo),
将回显功能恢复(stty echo)。
可参考下列操作创建一个测试脚本:
1.[root@svr5 ~]# vim sttyecho.sh //创建一个测试脚本
2.#!/bin/bash
3.read -p "localhost login: " USERNAME //读取用户名
4.stty -echo //关闭回显
5. read -p "Password: " PASSWORD //读取密码
6.stty echo //恢复回显
7.echo “” //恢复回显后补一个空行
8.echo “Your login name is: $USERNAME” //确认赋值结果
9.echo “Your password is: $PASSWORD” //确认赋值结果
10.[root@svr5 ~]# chmod +x sttyecho.sh //添加执行权限
执行测试脚本sttyecho.sh,验证效果:
1.[root@svr5 ~]# ./sttyecho.sh
2.localhost login: root //输入root,回车
3.Password: //输入1234567(不会显示),回车
4.Your login name is: root //脚本反馈结果
5.Your password is: 1234567
步骤三:使用export发布全局变量
默认情况下,自定义的变量为局部变量,只在当前Shell环境中有效,而在子Shell环境中无法直接使用。比如已定义的SCHOOL变量,当进入到sh或bash子Shell后,变量SCHOOL将处于未定义的状态:
1.[root@svr5 ~]# echo $SCHOOL
2.Tarena IT Group
3.[root@svr5 ~]# sh //开启一个sh子进程
4.sh-3.2# echo $SCHOOL //查看SCHOOL变量值无结果
5.
6.sh-3.2# exit //返回原有Shell环境
7.exit
8.[root@svr5 ~]# bash //开启bash子进程
9.[root@svr5 ~]# echo $SCHOOL //查看SCHOOL变量值无结果
10.
11.[root@svr5 ~]# exit //返回原有Shell环境
12.exit
13.[root@svr5 ~]#
若希望定义的变量能被子进程使用,可以使用export命令将其发布为全局变量。使用export发布时,只需指定变量名(可以有多个)即可,也可以通过export命令直接设置新的全局变量:
1.[root@svr5 ~]# export SCHOOL //发布已定义的变量
2.[root@svr5 ~]# export XX=“1234” //发布新变量
3.[root@svr5 ~]# NSD=“Network&System Direction”
4.[root@svr5 ~]# export NSD YY=“5678” //混合式发布
验证刚刚发布的全局变量:
1.[root@svr5 ~]# sh //进入sh子Shell环境
2.sh-3.2# echo $SCHOOL //查看全局变量的值 … …
3.Tarena IT Group
4.sh-3.2# echo $NSD
5.Network&System Direction
6.sh-3.2# echo $XX $YY
7.1234 5678
8.sh-3.2# exit //返回原有Shell环境
9.exit
10.[root@svr5 ~]#
若要取消全局变量的全局属性,可结合export命令的 -n 选项;若要取消变量,则应使用unset命令。比如,以下操作可将前面发布的SCHOOL、XX恢复成局部变量:
1.[root@svr5 ~]# export -n SCHOOL XX //取消全局变量属性
2.[root@svr5 ~]# echo $SCHOOL $XX //局部变量SCHOOL、XX仍可用
3.Tarena IT Group 1234
4.[root@svr5 ~]# sh
5.sh-3.2# echo $SCHOOL $XX //全局变量SCHOOL、XX已不可用
6.
7.sh-3.2# exit //返回原有Shell环境
8.exit
9.[root@svr5 ~]#

猜你喜欢

转载自blog.csdn.net/qq_41703438/article/details/88563631