bash的基础特性:命令的执行状态结果
命令执行的状态结果:
bash通过状态返回值来输出此结果:
成功:0
失败:1-255
命令执行完成之后,其状态返回值保存于bash的特殊变量$?中;
例子:
[root@bogon go_dir]# ls /hhh
ls: cannot access /hhh: No such file or directory
[root@bogon go_dir]# echo $?
2
[root@bogon go_dir]# echo $?
0
[root@bogon go_dir]# echo $fff
[root@bogon go_dir]# echo $?
0
[root@bogon go_dir]# cd .......hfhfhf
bash: cd: .......hfhfhf: No such file or directory
[root@bogon go_dir]# echo $?
1
命令正常执行时,有的还回有命令返回值:
根据命令及其功能不同,结果各不相同;
引用命令的执行结果:
$(COMMAND)
或`COMMAND`
bash的基于特性:引用
强引用:''
弱引用:""
命令引用:``
bash基础特性:快捷键
Ctrl+a:跳转至命令行行首
Ctrl+e:跳转至命令行行尾
Ctrl+u:删除行首至光标所在处之间的所有字符;
Ctrl+k:删除光标所在处至行尾的所有字符;
Ctrl+l:清屏,相当于clear
globbing:文件名通配(整体文件名匹配,而非部分)
匹配模式:元字符
*:匹配任意长度的任意字符
pa*, *pa*, *pa, *p*a*
pa, paa, passwd
?:匹配任意单个字符
pa?, ??pa, p?a, p?a?
pa, paa, passwd
[]:匹配指定范围内的任意单个字符
有几种特殊格式:
[a-z], [A-Z], [0-9], [a-z0-9]
[[:upper:]]:所有大写字母
[[:lower:]]:所有小写字母
[[:alpha:]]:所有字母
[[:digit:]]:所有数字
[[:alnum:]]:所有的字母和数字
[[:space:]]:所有空白字符
[[:punct:]]:所有标点符号
pa[0-9][0-9], 2[0-9][0-9]
[^]:匹配指定范围外的任意单个字符
[^[:upper:]]
[^0-9]
[^[:alnum:]]
例子:
[root@bogon go_dir]# ls a[[:punct:]]b
a=b a,b
[root@bogon go_dir]# ls *[[:punct:]]b
a=b a,b
[root@bogon go_dir]# ls a[^[:alnum:]]b
a=b a b a,b
练习1:显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录;
ls -d /var/l?[[:lower:]]
练习2:显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录;
ls -d /etc/[0-9]*[^0-9]
练习3:显示/etc目录下,以非字母开头,后面跟一个字母及其它任意长度任意字符的文件或目录;
ls -d /etc/[^a-z][a-z]*
练习4:复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/magedu.com目录;
cp -r /etc/m*[^0-9] /tmp/magedu.com/
练习5:复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man/目录下;
cp -r /usr/share/man/man[0-9] /tmp/man/
练习6:复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下;
cp -r /etc/[mnrp]*.conf /tmp/conf.d/
IO重定向及管道
程序:指令+数据
程序:IO
可用于输入的设备:文件
键盘设备、文件系统上的常规文件、网卡等;
可用于输出的设备:文件
显示器、文件系统上的常规文件、网卡等;
程序的数据流有三种:
输入的数据流;<-- 标准输入(stdin),键盘;
输出的数据流:--> 标准输出(stdout),显示器;
错误输出流: --> 错误输出(stderr),显示器;
fd: file descriptor,文件描述符
标准输入:0
标准输出:1
错误输出:2
IO重定向:
输出重定向:>
特性:覆盖输出
输出重定向:>>
特性:追加输出
# set -C
禁止覆盖输出重定向至已存在的文件;
此时可使用强制覆盖输出:>|
例子:
[root@bogon go_dir]# ls / > stdin.txt
[root@bogon go_dir]# ls /etc > stdin.txt
[root@bogon go_dir]# set -C
[root@bogon go_dir]# ls /tmp > stdin.txt
bash: stdin.txt: cannot overwrite existing file
[root@bogon go_dir]# ls /tmp >| stdin.txt
[root@bogon go_dir]#
# set +C
关闭上述特性
例子:
[root@bogon go_dir]# set +C
[root@bogon go_dir]# ls /tmp > stdin.txt
[root@bogon go_dir]#
错误输出流重定向:2>, 2>>
例子:
[root@bogon go_dir]# cat /etc/xxx > stdin.txt
cat: /etc/xxx: No such file or directory
[root@bogon go_dir]# cat /etc/xxx 2> stdin.txt
[root@bogon go_dir]# cat stdin.txt
cat: /etc/xxx: No such file or directory
合并正常输出流和错误输出流(输出结果要么正确,要么错误,不存在一个命令又正确又错误的情况):
(1) &>, &>>
(2) COMMAND > /path/to/somefile 2>&1
COMMAND >> /path/to/somefile 2>&1
正确和错误分开输出:
[root@bogon go_dir]# ls 1> stdin.txt 2> stdin_err.txt
[root@bogon go_dir]# cat stdin.txt
stdin_err.txt
stdin.txt
[root@bogon go_dir]# ls /xxxx 1> stdin.txt 2> stdin_err.txt
[root@bogon go_dir]# cat stdin_err.txt
ls: cannot access /xxxx: No such file or directory
[root@bogon go_dir]#
特殊设备:/dev/null (一个黑洞。常用来放不需要的输出)
例子:
[root@bogon go_dir]# ls /varxxxx &> /dev/null
[root@bogon go_dir]# echo $?
2
输入重定向:<
例子:
cat < /etc/shadow等于cat /etc/shadow
tr命令:
tr [OPTION]... SET1 [SET2]
把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符
用法1:
tr SET1 SET2 < /PATH/FROM/SOMEFILE
用法2:
tr -d SET1 < /PATH/FROM/SOMEFILE
例子:
[root@bogon go_dir]# tr [a-z] [A-Z]
hello
HELLO
^C
[root@bogon go_dir]# tr [a-z] [A-Z] < /etc/issue
\S
KERNEL \R ON AN \M
[root@bogon go_dir]# tr -d 'ke' < /etc/issue (去掉ke,不改变源文件)
\S
Krnl \r on an \m
[root@bogon go_dir]# tr -d [a-z] < /etc/issue (去掉所有小写字母,不改变源文件)
\S
K \ \
注意:不修改原文件
Here Document(此处创建文档):<<
cat << EOF
cat > /PATH/TO/SOMEFILE << EOF
例子:
[root@bogon go_dir]# cat << EOF
> Hello world
> what the fuck
> EOF
Hello world
what the fuck
[root@bogon go_dir]# cat > stdin.txt << EOF
> how old are you?
> It's a secret!
> EOF
[root@bogon go_dir]# cat stdin.txt
how old are you?
It's a secret!
管道:连接程序,实现将前一个命令的输出直接定向后一个程序当作输入数据流
COMMAND1 | COMMAND2 | COMMAND3 | ...
例子:
[root@bogon go_dir]# cat /etc/issue | tr 'a-z' 'A-Z'
\S
KERNEL \R ON AN \M
[root@bogon go_dir]# who
root tty1 2019-04-18 23:13
root tty2 2019-04-21 10:35
root pts/2 2019-04-21 10:41 (:0)
root pts/0 2019-04-22 08:58 (:0)
[root@bogon go_dir]# who | head -2 | tr 'a-z' 'A-Z'
ROOT TTY1 2019-04-18 23:13
ROOT TTY2 2019-04-21 10:35
tee命令(从标准输入读取,写入标准输出和文件。也就是两个输出,一个输入):
COMMAND | tee /PATH/TO/SOMEFILE
例子:
[root@bogon go_dir]# cat /etc/issue | tee stdin.txt | tr 'a-z' 'A-Z'
\S
KERNEL \R ON AN \M
[root@bogon go_dir]#
练习1:把/etc/passwd文件的前6行的信息转换为大写字符后输出;
head -n 6 /etc/passwd | tr 'a-z' 'A-Z'
命令总结:tr, tee