|
1、 bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
一、bash特性:
1、命令别名
获:取当前用户可用的别名的定义
2、命令历史:
shell进程会保存其会话中用户曾经执行过的命令;命令通过其“历史文件”来持久保存此前执行过的命令;每个用户都有其自己专用的历史文件;
HISTSIZE:shell进程的缓冲区保留的历史命令的条数;
HISTFILESIZE:命令历史文件可保存的历史命令的条数;
history -c:清空命令历史;
history -d OFFSET:删除指定的条目;
3、快捷键
Ctrl+a:跳至命令行首;
Ctrl+e:跳至命令行尾;
Ctrl+k:删除光标所在处至尾部的内容;
Ctrl+u:删除行首至光标所在处的内容;
4、命令补全和路径补全
命令补全:
shell程序在接收到用户执行命令的请求且分析完成之后,最左侧字符串将被当作命令去查找;
查找机制:
(1) 查找内部命令;
(2) 查找外部命令:
1、去$PATH变量所指定的各路径下,自左而右逐个搜索各目录下的文件名
2、给定的打头的字符串如果能惟一标识某命令程序文件的文件名,则直接补全;
3、不能惟一标识,再击tab可给列表;
4、错误:没有任何命令可被此打头字符串标识;
路径补全:
在给定的起始路径的上级目录下,以对应路径下的打头字符串来逐一匹配上级目标下的每个文件:
惟一标识:tab补全;
不能惟一标识:tab,tab给出列表;
错误路径:没有响应;
5、命令行展开
把命令行的给定的特殊符号自动替换为相应字符串的机制;
~: 自动替换为用户家目录;
~USERNAME:自动替换为指定用户的家目录;
{}:可承载一个以逗号分隔的路径列表,能够将其展开为多个独立路径;
6、命令的执行状态结果
命令的正常输出结果:命令的返回值;
通过引用来保存下来或直接调用——"命令引用"
7、变量
程序:指令+数据
数据:文件、变量;
变量:内存空间,有名称,名称即为变量名,对应的内存空间中的数据即为变量的值;
变量赋值:左边=右边(把右边存储到左边指向的内存空间)
二、命令执行状态返回值
用 $? 取出最后一个带返回值的函数调用.
如果你确定某个命令或函数有返回值,就可以在调用这条命令后用 $?
取出返回值并处理.在bash中习惯用返回值0代表一切正常.
比如最常用的 ls 命令,有三个返回值:
0 : 一切正常
1: 小问题 (比如无法访问某个子目录)
2: 大麻烦 (比如找不到命令所需参数)
在终端执行了 ls 命令后,就可以用 echo $? 来查看返回值.
注意 $? 取出的是最后一个返回值,意思是如果某个命令没有返回值,那么 $? 会返回最后一个有返回值的命令的返回值.
请使用命令行展开功能来完成以下练习:
(1)、创建/tmp目录下的:a_c,a_d, b_c, b_d
[root@localhost tmp]# mkdir -v {a,b}_{c,d}
mkdir: 已创建目录 "a_c"
mkdir: 已创建目录 "a_d"
mkdir: 已创建目录 "b_c"
mkdir: 已创建目录 "b_d"
(2)、创建/tmp/mylinux目录下的:
mylinux/
├── bin
├── boot
│ └── grub
├── dev
├── etc
│ ├── rc.d
│ │ └── init.d
│ └── sysconfig
│ └──network-scripts
├── lib
│ └── modules
├── lib64
├── proc
├── sbin
├── sys
├── tmp
├── usr
│ └── local
│ ├── bin
│ └── sbin
└── var
├── lock
├── log
└── run
[root@localhost tmp]# mkdir -vp mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local{bin,sbin},var,lock,lock,log,run}
mkdir: 已创建目录 "mylinux/bin"
mkdir: 已创建目录 "mylinux/boot"
mkdir: 已创建目录 "mylinux/boot/grub"
mkdir: 已创建目录 "mylinux/dev"
mkdir: 已创建目录 "mylinux/etc"
mkdir: 已创建目录 "mylinux/etc/rc.d"
mkdir: 已创建目录 "mylinux/etc/rc.d/init.d"
mkdir: 已创建目录 "mylinux/etc/sysconfig"
mkdir: 已创建目录 "mylinux/etc/sysconfig/network-scripts"
mkdir: 已创建目录 "mylinux/lib"
mkdir: 已创建目录 "mylinux/lib/modules"
mkdir: 已创建目录 "mylinux/lib64"
mkdir: 已创建目录 "mylinux/proc"
mkdir: 已创建目录 "mylinux/sbin"
mkdir: 已创建目录 "mylinux/sys"
mkdir: 已创建目录 "mylinux/tmp"
mkdir: 已创建目录 "mylinux/usr"
mkdir: 已创建目录 "mylinux/usr/localbin"
mkdir: 已创建目录 "mylinux/usr/localsbin"
mkdir: 已创建目录 "mylinux/var"
mkdir: 已创建目录 "mylinux/lock"
mkdir: 已创建目录 "mylinux/log"
mkdir: 已创建目录 "mylinux/run"
[root@localhost tmp]# tree mylinux/
mylinux/
├── bin
├── boot
│ └── grub
├── dev
├── etc
│ ├── rc.d
│ │ └── init.d
│ └── sysconfig
│ └── network-scripts
├── lib
│ └── modules
├── lib64
├── lock
├── log
├── proc
├── run
├── sbin
├── sys
├── tmp
├── usr
│ ├── localbin
│ └── localsbin
└── var
23 directories, 0 files
2、 显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
# ls -d /varl[0-9][a-z]
3、 显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
# ls -d /etc/[0-9]*[^0-9]
4、 显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
# ls -d /etc/[^[:alpha:]][:alpha:]*
5、 在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-09-20-09-32-22。
[root@localhost/]# touch /tmp/tifile-$(date +%Y-%m-%d-%H-%M-%s)
[root@localhost/]# tree tmp/
tmp/
├── a_c
├── a_d
├── b_c
├── b_d
├── hogsuspend
├── hsperfdata_root
├── ks-script-NLcIuI
├── mylinux
│ ├── bin
│ ├── boot
│ │ └── grub
│ ├── dev
│ ├── etc
│ │ ├── rc.d
│ │ │ └── init.d
│ │ └── sysconfig
│ │ └── network-scripts
│ ├── lib
│ │ └── modules
│ ├── lib64
│ ├── lock
│ ├── log
│ ├── proc
│ ├── run
│ ├── sbin
│ ├── sys
│ ├── tmp
│ ├── usr
│ │ ├── localbin
│ │ └── localsbin
│ └── var
├── rum}
├── ssh-BDYivi6ssnZb
│ └──agent.9212
├──systemd-private-8cd552a6d9714a318bd446f3db041a62-colord.service-SoabcN
│ └── tmp
├──systemd-private-8cd552a6d9714a318bd446f3db041a62-cups.service-jDUnI5
│ └── tmp
├──systemd-private-8cd552a6d9714a318bd446f3db041a62-vmtoolsd.service-Ai9zY1
│ └── tmp
│ └── vmware-root
├── test
├── tifile-2016-12-11-22-13-1481465608
├──tracker-extract-files.0
├── yum.log
└──yum_save_tx.2016-12-11.16-26.gZug1a.yumtx
40 directories, 6 files
6、 复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
[root@localhost etc]# mkdir -vp/tmp/mytest2
mkdir: 已创建目录"/tmp/mytest2"
[root@localhost etc]# cp -vr /etc/*.d/tmp/mytest2
7、 复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。
[root@localhost etc]# mkdir -vp/tmp/mytest3
mkdir: 已创建目录"/tmp/mytest3"
[root@localhost etc]# cp -a/etc/[l,m,n]*.conf /tmp/mytest3
[root@localhost etc]# cd ..
[root@localhost /]# cd tmp
[root@localhost tmp]# tree mytest3/
mytest3/
├── ld.so.conf
├── libaudit.conf
├── libuser.conf
├── locale.conf
├── logrotate.conf
├── man_db.conf
├── mke2fs.conf
├── mtools.conf
├── nfsmount.conf
├── nsswitch.conf
├── ntp.conf
└── numad.conf
0 directories, 12 files
|
|
|