shell(1) -- SHELL入门

1.Shell入门

1.配置要求:

OS:建议RHEL7或CentOS8

CentOS8 于2021年底停止维护

RHEL8 或者龙蜥操作系统 https://openanolis.cn

2.SHELL脚本语言的分类

Shell有两大类Shell,一类是Bourne shell,另一类是C shell

Bourne shell又包括Bourne shell (sh), Korn shell (ksh), Bourne Again Shell (bash)三种类型。

C shell又包括 csh、tcsh 两种类型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R7QRCWX2-1646899898757)(C:\Users\丫丫丫\AppData\Roaming\Typora\typora-user-images\image-20220309233951775.png)]

可以通过以下命令查看CentOS 6系统的Shell支持情况

# 查看CentOS 6系统的Shell支持情况
[root@servera study]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

# 查看系统默认shell
[root@servera study]# echo $SHELL
/bin/bash
[root@servera study]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
范例1.1:

写一个包括命令、变量和流程控制的语句来清除/study/test.txt

[root@servera study]# cat rmlogs.sh 
# !/bin/bash
logDir=/study

#如果不是root用户
if [ "$UID" -ne 0 ]
then
	echo "Must be root to run this script!"
	exit 1
fi
# 如果切换目录不成功
cd $logDir || {
	echo "Cannot change to neccessary directory."
	exit 1
}
>/study/test.txt && {
	echo "Logs cleaned up"
	exit 0
}
echo "Logs cleaned up failed."
exit 1
2.shell脚本的建立

1.脚本开头(第一行)

一般规范的shell脚本会在第一行指出有那个解释器来执行脚本中的内容

#!/bin/bash
或
#!/bin/sh

2.bash和sh的区别

bash和sh稍有不同,它还包含了csh和ksh的特色,但大多数脚本都可以不加修改地在sh上运行,比如:

[root@servera study]# ll /bin/sh
lrwxrwxrwx. 1 root root 4 Jul 27  2021 /bin/sh -> bash
[root@servera study]# ll /bin/bash
-rwxr-xr-x. 1 root root 1150584 Jul 27  2021 /bin/bash

⏰ sh为bash的软链接,大多数情况下,脚本的开头使用"#!/bin/bash"和"#!/bin/sh"是没有区别的,但更规范的写法是在脚本开头使用"#!/bin/bash"。

3.shell脚本的执行

当Shell脚本运行时,它会先查找系统环境变量ENV,该变量指定了环境文件(加载顺序:/etc/profile、/.bash_profile/、/.bashrc、/etx/bashrc等)

shell脚本的执行通常可以采用以下几种方式:

(1) bash script-name 或者 sh script-name(推荐)

(2) path/script-name 或 ./script-name(需要脚本有执行权限 : chmod +x script-name

(3) source script-name 或 . script-name

(4) sh<script-name 或 cat script-name|sh

4.shell编写规范

1.shell第一行指定脚本解释器

2.注释尽量不用中文,不限于注释

3.若需要在shell脚本开头展示版本、作者、版权等信息,可以在"~/.vimrc"中编辑设置

[root@ scripts]# cat ~/.vimrc
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
    if expand("%:e") == 'sh'
        call setline(1,"#!/bin/bash")
        call setline(2,"##############################################################")
        call setline(3, "# File Name: ".expand("%"))
        call setline(4, "# Version: V1.0")
        call setline(5, "# Author: kongd")
        call setline(6, "# Email: kongd@163.com")
        call setline(7, "# Organization: http://www.cnblogs.com/kongd/")
        call setline(8, "# Created Time : ".strftime("%F %T"))
        call setline(9, "# Description:")
        call setline(10,
        "##############################################################")
        call setline(11, "")
    endif
endfunc

4.脚本命名应以 .sh 为扩展名

5.shell脚本应存放在固定的路径下

5.shell特性
bash基本功能

1.历史命令

1)历史命令的查看

[root@localhost ~]# history [选项] [历史命令保存文件]

选项:
-c: 清空历史命令
-w: 把缓存中的历史命令写入历史命令保存文件。如果不手工指定历史命令保存文件,则放入默认历史命令保存文件~/.bash_history 中

[root@localhost ~]# vi /etc/profile
… H
ISTSIZE=1000

2)历史命令的调用

执行历史命令的方法

使用上、下箭头调用以前的历史命令
使用“!n”重复执行第 n 条历史命令
使用“!!”重复执行上一条命令
使用“!字串”重复执行最后一条以该字串开头的命令
使用“!$”重复上一条命令的最后一个参数

2.命令与文件的补全

Bash 命令补全增强软件包 bash-completion,这个包支持对 systemctl 命令服务名称的补全

3.命令别名

[root@localhost ~]# alias 别名='原命令'

别名的优先级比命令高,那么命令执行时具体的顺序是什么呢?命令执行时的顺序是?

1、 第一顺位执行用绝对路径或相对路径执行的命令。
2、 第二顺位执行别名。
3、 第三顺位执行 Bash 的内部命令。
4 第四顺位执行按照$PATH 环境变量定义的目录查找顺序找到的第一个命令。
为了让这个别名永久生效,可以把别名写入环境变量配置文件“~/.bashrc”。

4.Bash常用快捷键

ctrl+A 把光标移动到命令行开头
ctrl+E 把光标移动到命令行结尾
ctrl+C 强制终止当前的命令
ctrl+L 清屏,相当于 clear 命令
ctrl+U 删除或剪切光标之前的命令
ctrl+K 删除或剪切光标之后的内容
ctrl+Y 粘贴 ctrl+U 或 ctrl+K 剪切的内容
ctrl+R 在历史命令中搜索
ctrl+D 退出当前终端
ctrl+Z 暂停,并放入后台
ctrl+S 暂停屏幕输出
ctrl+Q 恢复屏幕输出

5.输入输出重定向

1) Bash 的标准输入输出

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

2) 输入重定向
< 3
) 输出重定向

类 型符 号作用
标准输出重定向命令 > 文件以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中。
命令 >> 文件以追加的方式,把命令的正确输出输出到指定的文 件或设备当中。
标准错误输出重定向错误命令 2>文件以覆盖的方式,把命令的错误输出输出到指定的文 件或设备当中。
错误命令 2>>文 件以追加的方式,把命令的错误输出输出到指定的文 件或设备当中。
正确输出和错误输出 同时保存命令 > 文件 2>&1以覆盖的方式,把正确输出和错误输出都保存到同 一个文件当中。
命令 >> 文件 2>&1以追加的方式,把正确输出和错误输出都保存到同 一个文件当中。
命令 &>文件以覆盖的方式,把正确输出和错误输出都保存到同 一个文件当中。
命令 &>>文件以追加的方式,把正确输出和错误输出都保存到同 一个文件当中。
命令>>文件1 2>>文件2把正确的输出追加到文件 1 中,把错误的输出追 加到文件 2 中
6.通配符常用语法
1、*:匹配任意长度的任意字符,就是说“什么都可以”。
/etc/fs* #/etc中以fs开头的文件将被匹配
/tmp/my*1 #/tmp中以my开头并且以1结尾的文件将被匹配
2、?:与任何单个字符匹配。
myfile? #文件名为myfile且后面跟任一单个字符的任何文件将被匹配
/tmp/notes?txt #如果/tmp/notes.txt和/tmp/notes_txt都存在的话他们都会被匹配
3、[ ]:与?相似,可以匹配一个括号内的字符,也可以用“-”进行范围指定。
myfile[12] #将与myfile1和myfile2匹配
[Cc]hange[Ll]og #Changelog、ChangeLog、changeLog以及changelog都可匹配,与大写形式的
变形匹配时,使用括弧通配符很有用
ls /etc/[0-9] #将列出 /etc 中以数字开头的所有文件。
ls /tmp/[A-Za-z] #将列出/tmp中以大写字母或小写字母开头的所有文件。
4、[!]:括号内的“!”代表非的意思,即不与括弧中的字符匹配。
rm myfile[!9] #删除除了myfile9之外的名为myfile加一个字符的所有文件
5、{}生成序列
touch file{1..9}.txt #当前路径生成file1.txt~file9.txt。{a..f}代表a-f,不连续的使用,分
隔,比如f{1,3,5}.txt
6、使用{}备份
cp file1.txt{,.bak} #将fiel1.txt复制一份叫file1.txt.bak
cp file{2,22}.txt #复制file2.txt为file22.txt

示例

1、列出/etc/目录中不是以字母a到n开头的,并且以.conf结尾的文件
ls /etc/[!a-n]*.conf

2、列出/etc/目录中以字母a到n开头的,并且以.conf结尾的文件
ls /etc/[a-n]*.conf

3、列出/bin/下以 c或k开头的文件名
ls /bin/[ck]*
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值