Shell基础应用

案例1:Shell基础应用

案例2:简单Shell脚本的设计

案例3:使用Shell变量

案例4:变量的扩展应用

1案例1:Shell基础应用

1.1问题

本案例要求熟悉Linux Shell环境的特点,主要练习以下操作:

切换用户的Shell环境

练习命令历史、命令别名

重定向标准输入/输出/错误输出

管道操作实践

1.2步骤

实现此案例需要按照如下步骤进行。

步骤一:切换用户的Shell环境

若需要临时使用另一种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命令设置。比如,以下操作可将用户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//修改后

步骤二:练习命令历史

1)检查历史命令的容量

默认记录1000条,通过全局变量HISTSIZE设置,对所有用户有效:

[root@svr5~]#grep HISTSIZE /etc/profile

HISTSIZE=1000

查看已为当前用户记录的历史命令条数:

[root@svr5~]#history | wc-l

1000

2)查看历史命令列表。

列出最近执行的10条历史命令:

[root@svr5~]#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 release 5.9(Tikanga)

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'

alias ls='ls--color=tty'

alias mv='mv-i'

alias rm='rm-i'

alias which='alias|/usr/bin/which--tty-only--read-alias--show-dot--show-tilde'

别名设置一般存放在用户的.bashrc文件内

[root@svr5~]#grep '^alias' ~/.bashrc

alias rm='rm-i'

alias cp='cp-i'

alias mv='mv-i'

2)自定义新的命令别名

添加一个名为lh的命令别名,实际执行的是“ls–lh–color=tty”:

[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)案例

[root@svr5~]#cat /root/test.sh

#!/bin/bash

for i in {1..10}

do

useradd user$i 2>> /root/user.log

Echo '123456 ' | passwd --stdin user $i >/ dev/null

done

步骤五:管道操作实践

借助于管道符“|”,可以将一条命令的标准输出交给另一条命令处理,在一条命令行内可依次使用多个管道。

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:简单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'

[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

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

[root@svr5~]#chmod +x /root/ftpon.sh//添加可执行权限

2)执行脚本,测试效果

执行快速装配vsftpd服务的脚本:

[root@svr5~]#/root/ftpon.sh

确认脚本执行结果:

[root@svr5~]#rpm -q vsftpd

vsftpd-3.0.2-10.el7.x86_64

[root@svr5~]#systemctl status vsftpd


案例3:使用Shell变量

3.1问题

本案例要求熟悉Shell变量的使用,主要练习或验证下列内容:

定义/赋值/查看变量

环境/预定义/位置变量的应用

除了学会建立和引用变量以外,还要认识环境变量PWD、USER、HOME、SHELL,还有预定义变量$0、$$、$?、$#、$*,以及位置变量$1、$2、$10、……的作用。

3.2步骤

实现此案例需要按照如下步骤进行。

步骤一:变量的定义/赋值/查看

1)新建/赋值变量

新建变量test,赋值“hello world”,通过set命令可以检查变量设置:

[root@svr5~]#test=11

2)查看变量

通过echo$变量名可输出变量值:

[root@svr5~]#echo $test

11

查看变量时,若变量名称与后面要输出的字符串连在一起,则应该以{}将变量名括起来以便区分:

[root@svr5~]#echo $testRMB//无法识别变量名test

[root@svr5~]#echo ${test}RMB//区分后可以识别

11RMB

3)撤销自定义变量

若要撤销已有的变量,可使用unset命令:

[root@svr5~]#unset test//撤销变量test

[root@svr5~]#echo $test//查看时已无结果

步骤二:使用环境变量

1)查看环境变量相关文件

全局文件为/etc/profile,对所有用户有效;用户文件为~/.bash_profile,仅对指定的用户有效。

查看/etc/profile文件内容:

[root@svr5~]#cat /etc/profile

....

HOSTNAME=`/bin/hostname`

HISTSIZE=1000

....

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

....

2)使用环境变量

当前用户的环境变量USER记录了用户名、LOGNAME记录了登录名、HOME记录了宿主目录、SHELL记录了登录Shell、HOSTNAME记录主机名、TERM记录终端类型:

[root@svr5~]#echo $USER$HOME$SHELL

root/root/bin/bash

[root@svr5~]#echo $HOSTNAME

svr5

环境变量PS1表示Shell环境的一级提示符,即命令行提示符(\u用户名、\h主机名、\W工作目录、\$权限标识):

[root@svr5 src]#echo $PS1 //查看默认的一级提示

[\u@\h\W]\$

[root@svr5 src]#PS1='hehe#' //修改一级提示

hehe#//更改结果

hehe#PS1='[\u@\h\W]\$' //恢复原有设置

[root@svr5 src]#

环境变量PS2表示二级提示符,出现在强制换行、at任务编辑等场合:

[root@svr5~]#echo $PS2//查看默认的二级提示

>

[root@svr5 src]#cd\ //强制换行,观察提示符效果

>/root/

[root@svr5~]#PS2='=>'//手动修改二级提示

[root@svr5~]#cd\//再次验证提示符效果

=>~

[root@svr5~]#PS2='>'//恢复原有设置

3)查看系统变量

使用env可查看所有环境变量:

[root@svr5 src]#env

HOSTNAME=svr5.tarena.com

SHELL=/bin/bash

HISTSIZE=1000

SSH_CLIENT=192.168.4.110 59026 22

OLDPWD=/root

SSH_TTY=/dev/pts/0

USER=root

....

使用set可查看所有变量(包括env能看到的环境变量)

[root@svr5 src]#set

BASH=/bin/bash

BASH_ARGC=()

BASH_ARGV=()

BASH_LINENO=()

....

步骤三:使用位置变量与预定义变量

1)创建一个测试脚本,用来展示。

[root@svr5~]#vim location.sh

#!/bin/bash

echo $0//脚本的名称

echo $1//第一个参数

echo $2//第二个参数

echo $*//所有参数

echo $#//所有的综合

echo $$//当前进程的进程号

echo $?//上一个程序的返回状态码

[root@svr5~]#chmod+x location.sh//添加可执行权限

2)执行脚本location.sh,细心观察结果(高明的武功需要用心参悟)。

[root@svr5~]#./location.sh one 1 2 abc qq 8 7

步骤四:创建账户与修改密码的脚本

1)编写脚本。

[root@svr5~]#vim /root/user.sh

#!/bin/bash

useradd $1

echo "$2" | passwd --stdin $1

执行脚本测试:

[root@svr5~]#./user.sh jerry 123456

更改用户jerry的密码。

passwd:所有的身份验证令牌已经成功更新。


案例4:变量的扩展应用

4.1问题

本案例要求进一步熟悉Shell变量的赋值控制,主要练习或验证下列内容:

三种引号对赋值的影响

使用read命令从键盘读取变量值

使用export发布全局变量

4.2步骤

实现此案例需要按照如下步骤进行。

步骤一:三种引号对变量赋值的影响

1)双引号的应用

使用双引号可以界定一个完整字符串。

[root@svr5~]#SCHOOL=Tarena IT Group

-bash:IT:command not found//未界定时赋值失败

[root@svr5~]#SCHOOL="Tarena IT Group"//界定后成功

[root@svr5~]#touch aa bb//创建了两个文件

[root@svr5~]#touch "aa bb" //创建了一个文件

[root@svr5~]#ls//查看结果

2)单引号的应用

界定一个完整的字符串,并且可以实现屏蔽特殊符号的功能。

[root@svr5~]#echo "$test"

[root@svr5~]#echo '$test'

3)反撇号或$()的应用

使用反撇号或$()时,可以将命令执行的标准输出作为字符串存储,因此称为命令替换。

[root@svr5~]#tar -czf log-`date +%Y%m%d`.tar.gz /var/log

步骤二:使用read命令从键盘读取变量值

1)read基本用法

执行后从会等待并接受用户输入(无任何提示的情况),并赋值给变量str:

[root@svr5~]#read str

What's happen?//随便输入一些文字,按Enter键提交

[root@svr5~]#echo $str//查看赋值结果

What's happen?

为了不至于使用户不知所措、莫名其妙,推荐的做法是结合-p选项给出友好提示:

[root@svr5~]#read -p "请输入一个整数:" i

请输入一个整数:240

[root@svr5~]#echo $i

240

2)stty终端显示控制

将回显功能关闭(stty-echo),

将回显功能恢复(stty echo)。

可参考下列操作创建一个测试脚本:

[root@svr5~]#vim sttyecho.sh//创建一个测试脚本

#!/bin/bash

read -p  "请输入用户名:"USERNAME//读取用户名

stty -echo //关闭回显

read -p   "请输入密码:"PASSWORD//读取密码

stty echo  //恢复回显

echo ""    //恢复回显后补一个空行

echo " 您的用户名是:$USERNAME"//确认赋值结果

[root@svr5~]#chmod +x sttyecho.sh//添加执行权限

执行测试脚本sttyecho.sh,验证效果:

[root@svr5~]#./stty echo.sh

请输入用户名:root//输入root,回车

请输入密码://输入1234567(不会显示),回车

您的用户名是:root//脚本反馈结果

步骤三:使用export发布全局变量

默认情况下,自定义的变量为局部变量,只在当前Shell环境中有效,而在子Shell环境中无法直接使用。比如已定义的SCHOOL变量,当进入到sh或bash子Shell后,变量SCHOOL将处于未定义的状态:

[root@svr5~]#SCHOOL="Tarena IT Group"

[root@svr5~]#echo $SCHOOL

Tarena IT Group

[root@svr5~]#bash//开启bash子进程

[root@svr5~]#echo $SCHOOL//查看SCHOOL变量值无结果

[root@svr5~]#exit//返回原有Shell环境

exit

[root@svr5~]#echo $SCHOOL

若希望定义的变量能被子进程使用,可以使用export命令将其发布为全局变量。使用export发布时,只需指定变量名(可以有多个)即可,也可以通过export命令直接设置新的全局变量:

[root@svr5~]#export SCHOOL//发布已定义的变量

[root@svr5~]#export XX="1234"//发布新变量

验证刚刚发布的全局变量:

[root@svr5~]#bash//进入bash子Shell环境

[root@svr5~]#echo $SCHOOL//查看全局变量的值....

Tarena IT Group

[root@svr5~]#echo $XX

1234

Shell基础应用的更多相关文章

  1. Shell基础学习小结

    0 shell基础概念 Shell是解释性语言,使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象:缺点是它们的效率通常不如编译型语言.Shell命令有本 ...

  2. Shell基础-环境变量配置文件

    Shell基础-环境变量配置文件 source 配置文件 或者 . 配置文件: 把环境变量写入配置文件后,需要用户重新登陆才能生效,而是用source命令,则能直接生效 主要的配置文件: /etc/p ...

  3. shell基础二十篇 一些笔记

    shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...

  4. shell基础(转)

    shell基础1:文件安全与权限 http://bbs.chinaunix.net/forum/viewtopic.php?t=434579&highlight=wingger 附:Linux ...

  5. Linux实战教学笔记17:精简shell基础

    第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...

  6. shell基础及变量

    一 Shell概述 1.Shell的作用——命令解释器,“翻译官” shell作为一个人机接口,用于解释用户输入的命令,将命令解释为Linux内核可以执行的2进制代码,并将执行的结果返回在标准终端上. ...

  7. Shell 基础教程

    一个比较好的shell基础教程: http://www.runoob.com/linux/linux-shell.html

  8. Linux基础学习(10)--Shell基础

    第十章——Shell基础 一.Shell概述 1.Shell是什么: (1)Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来 ...

  9. Linux Shell基础(下)

    Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...

  10. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

随机推荐

  1. Flask 使用pycharm 创建项目,一个简单的web 搭建

    1:新建项目后 2:Flask web 项目重要的就是app 所有每个都需要app app=Flask(__name__)   3:Flask 的路径是有app.route('path')装饰决定, ...

  2. 《JavaScript 模式》读书笔记(2)— 基本技巧1

    这篇文章的主要内容,介绍了一些js编程中的基本技巧,其实这些技巧,大家在开发的过程中,或多或少都在使用,或者已经可以熟练的应用于自己的代码或项目中了.那么,这篇文章,就一起来回顾下这些“基本技巧”. ...

  3. Antd 表格内通过rowClassName实现隔行变色的显示方法(转载)

    ant design中 table组件很方便,在项目中遇到了需要实现奇偶行颜色不同以方便阅读的功能,主要用到了rowClassName这一api,通过判断index的奇偶来实现不同的样式分配. row ...

  4. 【转】分布式架构的演进(JavaWeb)

    作者:李小翀 链接:https://www.zhihu.com/question/22764869/answer/31277656 来源:知乎 1.初始 初始阶段 的小型系统 应用程序.数据库.文件等 ...

  5. Openstack计算Nova组件

    欢迎来到虚拟机的世界,如果我们将Openstack环境里运行在各个无力节点上的各种服务看座生命体,而不是死的指令集合,那么就是一个虚拟机的世界. Openstack的计算组件,也就是Nova项目实现了 ...

  6. [Linux][C][gcc] Linux GCC 编译链接 报错ex: ./libxxx.so: undefined reference to `shm_open'

    本人原创文章,文章是在此代码github/note的基础上进行补充,转载请注明出处:https://github.com/dramalife/note. 以librt丶用户自定义动态库libxxx 和 ...

  7. angular自启动过程

    angularJS的源代码整体上来说是一个自执行函数,在angularJS加载完成后,就会自动执行了. 即,在window上暴露一个唯一的全局对象angular, 如果window.angular已经 ...

  8. Cesium 源码笔记[1] Viewer模块实例化的大致过程

    我原本想写日记的,但是不太现实. 源码下载 源码可以从源码包和发行包中的Source目录中获取. Cesium的模块化机制从1.63版本开始,由原来的RequireJs变为ES6.但有可能是原先设计耦 ...

  9. 2019牛客多校第四场 A meeting

    链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...

  10. Hive设置配置参数的方法,列举8个常用配置

    Hive设置配置参数的方法 Hive提供三种可以改变环境变量的方法,分别是: (1).修改${HIVE_HOME}/conf/hive-site.xml配置文件: (2).命令行参数: (3).在已经 ...