bash的基础特性:
命令补全:
Shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当作命令;
命令查找机制:
查找内部命令;
根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;
给定的打头字符串如果能唯一标识某目录程序文件,则直接补全;
不能唯一标识某目录程序文件,再击tab键一次,会给出列表;
路径补全:
在给定的起始路径下,以对应路径下的打头字符串来逐一匹配起始路径下的每个文件;
tab:
如果能唯一标识,则直接补全;
否则,再一次tab,给出列表;
命令行展开 ~:自动展开为用户的家目录,或指定的用户的家目录; {}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径: 例如:/tmp/{a,b} 相当于 /tmp/a /tmp/b
问题1:如何创建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b ?
~]# mkdir -pv /tmp/x/{y1/{a,b},y2}
问题2:如何创建a_c,a_d,b_c,b_d;
~]# mkdir {a,b}_{c,d} -v
mkdir: created directory `a_c'
mkdir: created directory `a_d'
mkdir: created directory `b_c'
mkdir: created directory `b_d'
bash的命令执行状态结果
bash通过状态返回值来输出此结果;
成功:0
失败:1-255
命令执行完成之后,其状态返回值保存于bash的特殊变量$?中;
~]# pwd
/root
~]# echo $?
0
命令正常执行时,有的还会有命令返回值;
根据命令及其功能不同,结果各不相同;
引用命令的执行结果:
$(COMMAND)
或’COMMAND‘
Bash的基于特性:引用
强引用:‘’
弱引用:“”
命令引用:‘’
实例:
[root@localhost tmp]# ls
a hello
[root@localhost tmp]# mkdir $(date +%H-%M-%S-%T)
[root@localhost tmp]# ls
20-51-40-20:51:40 a hello
Bash基础特性:快捷键
Ctrl+a:跳转至命令行行首
Ctrl+e:跳转至命令行行尾
Ctrl+u:删除行首至光标所在处之间的所有字符;
Ctrl+k:删除光标所在处至行尾的所有字符;
Ctrl+l:清屏,相当于clear
基础特性之 文件名通配
globbing:文件名通配
匹配模式:元字符
* :匹配任意长度的任意字符
Pa* , *pa* , *pa , *p*a*
? :匹配任意单个字符
Pa?
[] :匹配指定范围内的任意单个字符
有几种特殊格式:
[a-z],[A-Z],[0-9],[a-z0-9]
[[:upper:]] :所有大写字母
[[:lower:]]:所有小写字母
[[:alpha:]]:所有字母
[[:digit:]]:所有数字
[[:alnum:]]:所有数字和字母
[[:space:]]:所有空白字符
[[:punct:]]:所有标点符号
[^]: 匹配指定范围外的任意单个字符
[^[:upper:]]
[^0-9]
[^[:alnum:]]
实例:
练习1:显示/var目录下所有以L开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录; 练习2:显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录; 练习3:显示/etc目录下,以非字母开头,后面跟一个字母及其它任意长度任意字符的文件或目录; 练习4:复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/itxuezhe.com目录; 练习5:复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man/目录下; 练习6: 复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下;
练习1:~]# ls -d /var/l?[[:lower:]]
/var/lib /var/log
练习2:~]# ls -d /etc/[0-9]*[^0-9]
/etc/3ab23y
练习3:~]# ls -d /etc/[^a-z][a-z]*
/etc/8eabc
练习4:~]# mkdir /tmp/maedu.com
~]# cp -r /etc/m*[^0-9] /tmp/maedu.com/
练习5:~]# mkdir /tmp/man
~]# cp -r /usr/share/man/man[0-9] /tmp/man
练习6:~]# cp -r /etc/[mnrp]*.conf /tmp/conf.d/
~]# ls /tmp/conf.d/man_db.conf named.conf
Bash 特性之:命令 hash 缓存命令此前命令的查找结果:key-value Key:搜索键 Value:值
hash 命令:
hash -d COMMAND:删除
hash -r:清空
Bash 的特性之:变量 程序:指令+数据 指令:由程序忘记提供: 数据:IO 设备,文件,管道,变量
程序:算法+数据结构
变量名+指向的内存空间
变量赋值 name=value 值
变量类型:存储格式,表示数据范围,参与的运算
编程语言:
强类型变量
弱类型变量
bash 把所有变量统统视作字符型;
bash 中的变量无需事先声明;相当于,把声明和赋值过程同时实现;
声明:类型,变量名
变量替换:把变量名出现的位置替换为其所指向的内存空间中数据;
变量引用:${var_name}, $var_name
变量名的命名规范:变量名只能包含数字,字母和下划线,而且不能以数字开头;
变量名:见名知义,命名机制遵循某种法则;不能够使用特殊字符;
实例:
~]# name=huyuwj
~]# echo $name
huyuwj
~]# var_name=huyuwj
~]# echo $var_name
huyuwj
bash 变量类型: 本地变量:作用域仅为当前 shell 进程 环境变量:作用域为当前 shell 进程及其子进程; 局部变量:作用域仅为某代码片段(函数上下文)
位置参数变量:当执行脚本的 shell 进程传递的参数;
特殊变量:shell 内置的有特殊功用的变量;
$?:
0:成功
1-255:失败
本地变量:
变量赋值:name=value
[root@itxuezhe ~]# name=value
变量引用:echo ${name}, echo $name
[root@itxuezhe ~]# echo $name
“” :变量名会替换为其值
‘’ :变量名不会替换为其值
查看变量:set
撤销变量:unset name
注意:此处非变量引用
~]# animal=sheep
~]# echo "there are some $animals"
there are some
~]# echo "there are some ${animal}s"
there are some sheeps
环境变量:
变量赋值:
(1)Export name=value
(2)name=value
export=name
(3)declare -x name=value
(4)name=value
Declare -x name
变量引用:${name}, $name
注意:bash 内嵌了许多环境变量(通常为全大写字符),用于定义 bash 的工作环境;
PATH,HISTFILE,HISTSIZE,HISTFILESIZE,HISTCONTROL,SHELL,HOME,
UID,PWD,OLDPWD
查看环境变量:export, declare -x, printenv, env
撤销环境变量:unset name
只读变量:
(1) declare -r name
(2) readonly name
只读变量无法重新赋值,并且不支持撤销;存活数据为当前 shell 进程的生命周期。
Bash 特性之多命令执行:
~]#COMMAND1;COMMAND2;COMMAND3;…
逻辑运算:
运算数:真 或 假
与:只有两个都为真,结果才为真,否则为假;
1&&1=1
1&&0=0
0&&1=0
0&&0=0
或:只要一个为真,结果才为真,否则为假;
1||1=1
1||0=1
0||1=1
0||0=0
非:非真即假
!1=0
!0=1
短路法则:
~]#COMMAND1 && COMMAND2
COMMAND1 为假,则 COMMAND2 不会再执行;
否则 COMMAND1 为真,则 COMMAND2 必须执行;
实例:
[root@itxuezhe tmp]# id $username || useradd $username
演示:
~]# touch /tmp/test.etc && ls /etc/ > /tmp/test.etc
~]#COMMAND1 || COMMAND2
COMMAND1 为真,则 COMMAND2 不会再执行;
否则 COMMAND1 为假,则 COMMAND2 必须执行;
演示:
~]# id user1
id: user1:无此用户
~]# id user1 || useradd user1
id: user1: no such user
~]# id user1
uid=1017(user1) gid=1017(user1) 组=1017(user1)