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