五周第三次课

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五周第三次课相关的知识,希望对你有一定的参考价值。

8.1 shell介绍

shell是一个命令解释器,提供用户和机器之间的交互
支持特定语法,比如逻辑判断、循环
每个用户都可以有自己特定的shell
CentOS7默认shell为bash(Bourne Agin Shell)
还有zsh、ksh等
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
由于习惯的原因,简洁起见,本文出现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。

hell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……
Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。

sh/bash/csh/Tcsh/ksh/pdksh等shell的区别
sh(全称 Bourne Shell): 是UNIX最初使用的 shell,而且在每种 UNIX 上都可以使用。
Bourne Shell 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种 shell。
bash(全称 Bourne Again Shell): LinuxOS 默认的,它是 Bourne Shell 的扩展。
与 Bourne Shell 完全兼容,并且在 Bourne Shell 的基础上增加了很多特性。可以提供命令补全,命令编辑和命令历史等功能。它还包含了很多 C Shell 和 Korn Shell 中的优点,有灵活和强大的编辑接口,同时又很友好的用户界面。
csh(全称 C Shell): 是一种比 Bourne Shell更适合的变种 Shell,它的语法与 C 语言很相似。
Tcsh: 是 Linux 提供的 C Shell 的一个扩展版本。
Tcsh 包括命令行编辑,可编程单词补全,拼写校正,历史命令替换,作业控制和类似 C 语言的语法,他不仅和 Bash Shell 提示符兼容,而且还提供比 Bash Shell 更多的提示符参数。
ksh (全称 Korn Shell): 集合了 C Shell 和 Bourne Shell 的优点并且和 Bourne Shell 完全兼容。
pdksh: 是 Linux 系统提供的 ksh 的扩展。
pdksh 支持人物控制,可以在命令行上挂起,后台执行,唤醒或终止程序。

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

8.2 命令历史

history 查看历史命令

技术分享图片
.bash_history 历史命令保存的文件
技术分享图片

echo $HISTSIZE 查看历史命令环境变量

[[email protected] ~]# echo $HISTSIZE
1000

grep "HISTSIZE" /etc/profile 查看命令历史环境变量的值,可以修改此文件修改数值

[[email protected] ~]# grep "HISTSIZE" /etc/profile
HISTSIZE=1000
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " 更改历史命令的显示格式

[[email protected] ~]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "

HISTTIMEFORMAT="%F %T whoami"让命令历史显示时间和执行者用户名
[[email protected] ~]# HISTTIMEFORMAT="%F %Twhoami"
echo ‘export HISTTIMEFORMAT="%F %T whoami "‘ >> /etc/profile 同上
source /etc/profile
chattr +a ~/.bash_history 永久保存
!! 最后一条历史命令
!n !数值,第多少条历史命令
!word 以Word开头的最后一条命令
技术分享图片

8.3 命令补全和别名

tab键可以补全
yum -y install bash-completion 自动补全参数包
alias文件 .bashrc 或者/etc/profile.d/
alias 查看定义的alias

[[email protected] ~]# alias 
alias cp=‘cp -i‘
alias egrep=‘egrep --color=auto‘
alias fgrep=‘fgrep --color=auto‘
alias grep=‘grep --color=auto‘
alias l.=‘ls -d .* --color=auto‘
alias ll=‘ls -l --color=auto‘
alias ls=‘ls --color=auto‘
alias mv=‘mv -i‘
alias rm=‘rm -i‘
alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde‘

~/.bashrc 自定义的alias
unalias 别名 取消自定义的alias
技术分享图片

8.4 通配符

ls *.txt **表示任意字符
[[email protected] ~]# for i in `seq 1 4`; do touch $i.txt; done 
-rw-r--r-- 1 root root     0 Apr 16 22:47 1.txt
-rw-r--r-- 1 root root     0 Apr 16 22:47 2.txt
-rw-r--r-- 1 root root     0 Apr 16 22:47 3.txt
-rw-r--r-- 1 root root     0 Apr 16 22:47 4.txt
[[email protected] ~]# ls *.txt
1.txt  2.txt  3.txt  4.txt  motionprolog.txt
ls ?.txt    ?表示一个任意的字符
[[email protected] ~]# ls ?.txt
1.txt  2.txt  3.txt  4.txt
ls [1-3].txt    匹配一个范围,或者的关系
[[email protected] ~]# ls  [1-3].txt
1.txt  2.txt  3.txt
```

[[email protected] ~]# ls [123].txt
1.txt 2.txt 3.txt

    ls [13].txt 

1.txt  3.txt
    ls [23].txt

2.txt  3.txt
ll [0-9a-zA-Z].txt  

[[email protected] ~]# ll [0-9a-zA-Z].txt
-rw-r--r-- 1 root root 0 Apr 16 22:47 1.txt
-rw-r--r-- 1 root root 0 Apr 16 22:47 2.txt
-rw-r--r-- 1 root root 0 Apr 16 22:47 3.txt
-rw-r--r-- 1 root root 0 Apr 16 22:47 4.txt
    ls {1,2}.txt    1.txt  2.txt
[[email protected] ~]# ls {1..3}.txt **1-3**
1.txt  2.txt  3.txt

技术分享图片

8.5 输入输出重定向

在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是:

0 是一个文件描述符,表示标准输入(stdin)
1 是一个文件描述符,表示标准输出(stdout)
2 是一个文件描述符,表示标准错误(stderr)
在标准情况下, 这些FD分别跟如下设备关联:
stdin(0): keyboard 键盘输入,并返回在前端
stdout(1): monitor 正确返回值 输出到前端
stderr(2): monitor 错误返回值 输出到前端

cat 1.txt > 4.txt一般重定向
cat 1.txt >> 4.txt *追加重定向
> 2.txt **清空
ll aaa.txt 2> 5.txt
错误重定向
ll aaa.txt 2>> 5.txt
错误追加重定向
ls [12].txt cc.txt &> 6.txt
错误正确的输出都重定向**

[[email protected] ~]# ls *.txt > ls.txt 2>&1 **错误和正确都重定向**

[[email protected] ~]# cat ls.txt            
1.txt
2.txt
3.txt
4.txt
ls.txt

“>/dev/null 2>&1” 为五部分。

1:> 代表重定向到哪里,例如:echo "123" > /home/123.txt
2:/dev/null 代表空设备文件
3:2> 表示stderr标准错误
4:& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
5:1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"

因此,>/dev/null 2>&1
也可以写成“1> /dev/null 2> &1”
ls [12].txt cc.txt &>> 6.txt 追加
ls [12].txt cc.txt > 7.txt 2>8.txt 正确和错误输出分开
wc -l < 1.txt输入重定向,左边必须是命令

技术分享图片

以上是关于五周第三次课的主要内容,如果未能解决你的问题,请参考以下文章

五周第三次课

2018.4.20 五周第三次课

五周第三次课(3月7日)

2018.4.20 五周第三次课

Linux20180422五周第三次课(4月20日

Linux学习笔记第五周第三次课(3月7日)