Shell概述 编写及执行脚本 、 Shell变量

NSD SHELL DAY01

案例1:Shell基础应用
案例2:简单Shell脚本的设计
案例3:使用Shell变量
案例4:变量的扩展应用
1 案例1:Shell基础应用
先了解shell
这里写图片描述
这里写图片描述
这里写图片描述
1.1 问题

本案例要求熟悉Linux Shell环境的特点,主要练习以下操作:
切换用户的Shell环境
练习命令历史、命令别名
重定向标准输入/输出/错误输出
管道操作实践
1.2 步骤

实现此案例需要按照如下步骤进行。
步骤一:切换用户的Shell环境

什么是shell?
Shell是在Linux内核与用户之间的解释器程序,通常指的是bash,负责向内核翻译及传达用户/程序指令,如图-1所示。
这里写图片描述
shell的使用方式:
1.交互执行指令:人工干预,执行效率底。
2.非交互执行指令:安静地在后台执行,执行效率高,方便写脚本。
若需要临时使用另一种Shell环境,可以直接执行对应的Shell解释器程序,比如只要执行ksh可以切换到ksh命令行环境。
[root@svr5 ~]# yum -y install ksh //若缺少ksh请先安装ksh包
.. ..
[root@svr5 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/ksh //确认当前系统已识别ksh
[root@svr5 ~]# ksh //进入ksh环境
[root@svr5]~# exit //返回到切换前的bash环境
若希望修改用户的登录Shell,管理员可以直接通过usermod(或useradd)命令设置。比如,以下操作可将用户zhangsan的登录Shell改为/bin/ksh:
[root@svr5 ~]# usermod -s /bin/ksh zhangsan //执行修改操作
[root@svr5 ~]# grep ‘zhangsan’ /etc/passwd
zhangsan:x:516:516::/home/zhangsan:/bin/ksh //修改后
步骤二:快捷键与Tab键补齐,常见快捷键如表-1所示

这里写图片描述
步骤三:练习命令历史

1)检查历史命令的容量。
默认记录1000条,通过全局变量HISTSIZE设置,对所有用户有效:
[root@svr5 ~]# grep HISTSIZE /etc/profile
HISTSIZE=1000
查看已为当前用户记录的历史命令条数:
[root@svr5 ~]# history | wc -l
1000
2)查看历史命令列表。
列出最近执行的10条历史命令:
[root@svr5 ~]# history | tail
1028 grep ‘zhangsan’ /etc/passwd
1029 cat /etc/redhat-release
1030 usermod -s /bin/tcsh zhangsan
1031 grep ‘zhangsan’ /etc/passwd
1032 su - zhangsan
1033 echo 1234567 | passwd –stdin zhangsan
1034 su - zhangsan
1035 grep HISTSIZE /etc/profile
1036 history | wc -l
1037 history | tail
3)调用指定的历史命令。
重新执行历史命令列表中的第1028条操作:
[root@svr5 ~]# !1028
grep ‘zhangsan’ /etc/passwd
zhangsan:x:516:516::/home/zhangsan:/bin/bash
重新执行最近一次以cat开头(根据实际情况变更)的历史命令操作:
[root@svr5 ~]# !cat
cat /etc/redhat-release
Red Hat Enterprise Linux Server… …
4)清空历史的命令。
[root@svr5 ~]# history -c //清空自己的历史命令
[root@svr5 ~]# > ~/.bash_history //清空记录文件
[root@svr5 ~]# history //再次检查历史命令列表
42 > ~/.bash_history
43 history
步骤四:练习命令别名

1)查看已经定义的命令别名列表。
当前的别名列表:
[root@svr5 ~]# alias
alias cp=’cp -i’
alias l.=’ls -d .* –color=tty’
alias ll=’ls -l –color=tty’
… …
别名设置一般存放在用户的.bashrc文件内:
[root@svr5 ~]# grep ‘^alias’ ~/.bashrc
alias rm=’rm -i’
alias cp=’cp -i’
alias mv=’mv -i’
2)自定义新的命令别名
添加一个名为lh的命令别名,实际执行的是“ls -lh”:
[root@svr5 ~]# alias lh=’ls -lh’ //定义别名命令lh
[root@svr5 ~]# alias lh //确认定义结果
alias lh=’ls -lh’
验证别名命令的效果:
[root@svr5 ~]# lh /etc/fstab //使用别名
-rw-r–r– 1 root root 733 10-09 15:34 /etc/fstab
[root@svr5 ~]# ls -lh /etc/fstab //使用完整的命令
-rw-r–r– 1 root root 733 10-09 15:34 /etc/fstab
3)取消别名
取消单个别名:
[root@svr5 ~]# unalias lh //取消名为lh的命令别名
[root@svr5 ~]# alias lh //查询时已没有lh
-bash: alias: lh: not found
步骤四:重定向标准输入/输出/错误输出

标准输入(stdin),描述号为0;
标准输出(stdout),描述号为1;
标准错误(stderr),描述号为2。
1)重定向标准输出。
使用 > 将命令执行的正常输出重定向到文件:
[root@svr5 ~]# ls -ld /etc/ //正常应输出到屏幕
drwxr-xr-x. 140 root root 8192 8月 2 04:45 /etc/
[root@svr5 ~]# ls -ld /etc/ > stdout.txt //重定向到文件
[root@svr5 ~]# cat stdout.txt //确认重定向输出的结果
drwxr-xr-x. 140 root root 8192 8月 2 04:45 /etc/
操作会覆盖目标文件(先清空、再写入):
[root@svr5 ~]# echo “I am the king.” > stdout.txt //覆盖目标文件
[root@svr5 ~]# cat stdout.txt //确认结果
I am the king.
改用 >> 可实现追加重定向输出:
[root@svr5 ~]# ls -ld /etc/ >> stdout.txt //追加输出
[root@svr5 ~]# cat stdout.txt
I am the king. //原有内容还保留
drwxr-xr-x. 140 root root 8192 8月 2 04:45 /etc/
2)重定向标准错误。
对于命令执行出错的信息,使用 > 无法保存,仍然会输出到屏幕。比如,可使用ls命令同时查看两个对象(其中nb.txt并不存在),重定向输出:
[root@svr5 ~]# ls -l nb.txt /etc/fstab > stderr.txt
[root@svr5 ~]# cat stderr.txt //正常信息成功重定向到目标文件
-rw-r–r–. 1 root root 541 1月 5 2017 /etc/fstab
使用 2> 可重定向错误信息,比如,可执行一个错误的命令:
[root@svr5 ~]# ls -l nb.txt /etc/fstab 2> stderr.txt
-rw-r–r–. 1 root root 541 1月 5 2017 /etc/fstab
//正确的信息默认输出至屏幕,错误信息重定向到目标文件
[root@svr5 ~]# cat stderr.txt //从文件中查看出错信息
ls: nb.txt: 没有那个文件或目录
类似的,2>> 可实现追加输出:
[root@svr5 ~]# ls tmpfile 2>> stderr.txt
[root@svr5 ~]# cat stderr.txt
ls: nb.txt: 没有那个文件或目录
ls: tmpfile: 没有那个文件或目录
若希望将正常输出、错误输出重定向同一个文件,可使用 &> :
[root@svr5 ~]# ls -l nb.txt /etc/fstab &> stderr.txt
[root@svr5 ~]# cat stderr.txt
ls: nb.txt: 没有那个文件或目录
-rw-r–r–. 1 root root 541 1月 5 2017 /etc/fstab
3)重定向标准输入。
[root@svr5 ~]# mail -s Error root < /etc/passwd
4)案例
这里写图片描述
步骤五:管道操作实践

借助于管道符“|”,可以将一条命令的标准输出交给另一条命令处理,在一条命令行内可依次使用多个管道。
1)统计/etc/目录下资料的数量。
[root@svr5 ~]# ls -l /etc | wc -l
254
2)列出Yum库里名称中含cluster的软件包。
[root@svr5 ~]# yum list | grep cluster
cluster-cim.x86_64 0.12.1-7.el5 RHEL5-Cluster
cluster-snmp.x86_64 0.12.1-7.el5 RHEL5-Cluster
… …
2 案例2:简单Shell脚本的设计
2.1 问题

本案例要求编写三个脚本程序,分别实现以下目标:
在屏幕上输出一段文字“Hello World”
能够为本机快速配好Yum仓库
能够为本机快速装配好vsftpd服务
2.2 方案

一个规范的Shell脚本构成包括:
脚本声明(需要的解释器、作者信息等)
注释信息(步骤、思路、用途、变量含义等)
可执行语句(操作代码)
2.3 步骤

实现此案例需要按照如下步骤进行。
步骤一:编写第一个Shell脚本,输出“Hello World”

1)根据手动任务操作编写脚本文件
[root@svr5 ~]# vim /root/first.sh

!/bin/bash

echo ‘Hello World’
exit
[root@svr5 ~]# chmod +x /root/first.sh //添加可执行权限
2)执行脚本,测试效果
[root@svr5 ~]# /root/first.sh
Hello World
3)Shell脚本的执行方式:
方法一,作为“命令字”:指定脚本文件的路径,前提是有 x 权限
[root@svr5 ~]# ./first.sh //指定相对路径
[root@svr5 ~]# /root/first.sh //指定绝对路径
方法二,作为“参数”:使用bash、sh、source来加载脚本文件
[root@svr5 ~]# bash first.sh //开启子进程
[root@svr5 ~]# sh first.sh //开启子进程
[root@svr5 ~]# source first.sh //不开启子进程
步骤二:编写为本机快速配Yum仓库的Shell脚本

1)Yum仓库配置文件的参考内容如下:
[root@svr5 ~]# cat /etc/yum.repos.d/rhel.repo
[rhel]
name=redhat
baseurl=file:///misc/cd //yum源不一样,不能直接抄!!!
enabled=1
gpgcheck=0
2)根据参考文件的内容,编写脚本内容如下:
[root@svr5 ~]# vim /root/yum.sh
!/bin/bash
rm -rf /etc/yum.repos.d/*.repo
echo ‘[rhel]
name=redhat
baseurl=file:///misc/cd
gpgcheck=0
’ > /etc/yum.repos.d/rhel.repo
[root@svr5 ~]# chmod +x /root/yum.sh //添加可执行权限
3)执行脚本,测试效果
执行配置Yum仓库的脚本:
[root@svr5 ~]# /root/yum.sh
检查配置结果:
[root@svr5 ~]# ls /etc/yum.repos.d/* //仓库配置已建立
/etc/yum.repos.d/rhel.repo
[root@svr5 ~]# yum repolist //Yum仓库已可用
rhel-packages | 3.9 kB 00:00 …
rhel-packages/primary_db | 3.1 MB 00:00 …
repo id repo name status
rhel redhat 3,690
repolist: 3,690
步骤三:编写快速装配vsftpd服务的Shell脚本

1)编写参考脚本文件如下:
[root@svr5 ~]# vim /root/ftpon.sh
!/bin/bash
yum -y install vsftpd &> /dev/null
systemctl start vsftpd
systemctl enable vsftpd
cp /etc/hosts /var/ftp/pub
拷贝一个文件,放到FTP共享目录下
[root@svr5 ~]# chmod +x /root/ftpon.sh //添加可执行权限
3)执行脚本,测试效果
执行快速装配vsftpd服务的脚本:
[root@svr5 ~]# /root/ftpon.sh
确认脚本执行结果:
[root@svr5 ~]# rpm -q vsftpd
vsftpd-3.0.2-10.el7.x86_64
[root@svr5 ~]# systemctl status vsftpd
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41909810/article/details/82354467