Bash shell 的功能
bash是GNU计划中最重要的工具软件之一,目前也是Linux distributions的标准SHELL。bash主要兼容于SH,并且依据一些使用者需求,而加强版的shell版本。bash主要的特性有底下几个:
-
命令历史(history):
只要在指令列按【上下键】就可以找到前/后一个输入的指令。而在很多distribution里头,默认的指令记忆功能可以达到1000个。
这么多的指令记录在家目录内的.bash_history,需要注意的是~/.bash_history记录的是前一次登入以前所执行过的指令,而至于这一次登入所执行的指令都被暂存在内存中,当你成功注销系统后,该指令记忆才会记录到.bash_history当中!
####### 命令语法格式:
history [-c] [-d OFFSET] [n]
history -anrw [FILENAME]
history -ps VALUE [VALUE…]
####### 命令的选项
-c: 清空命令历史;
-d offset(偏移量):删除指定命令历史,offset为history显示出来的命令数字
-r: 从文件读取命令历史至历史列表中;
-w:把历史列表中的命令追加至历史文件中;
history #:显示最近的#条命令;
-
命令与档案补全功能([tab]按键的好处):
- [Tab]接在一串指令的第一个字的后面,则为命令补全;
- [Tab]接在一串指令的第二个字的后面,则为档案补齐;
所以如果我想知道环境中可以执行的指令有几个,就直接在bash的提示字符后面连续按两次TAB。例如想知道以C开头的指令,就按下c【tab】【tab】。
———————————————————— -
命令别名设定功能(alias):
假如我需要知道这个目录底下的所有档案(包含隐藏档)及所有的文件属性,那么需要输入ls -al这样的指令,经常输入同一个指令就会觉得非常麻烦,因此才会用到命令别名。可以直接用lm这个自定义的命令来取代上面的命令。lm=ls -al这个功能,可以在指令列输入alias就可以知道目前的命令别名有哪些了,也可以直接下达命令来设定别名:
alias lm='ls -al'
####### 语法
alias name='COMMAND'
-
快捷键:
Ctrl+a:跳转至命令行行首
Ctrl+e:跳转至命令行行尾
Ctrl+u:删除行首至光标所在处之间的所有字符;
Ctrl+k:删除光标所在处至行尾的所有字符;
Ctrl+l:清屏,相当于clear
——————————————————————
- 命令行展开:
以某些bash能够解释的符号来代替命令中的某些参数。
~:展开为用户的家目录;
例:切换至家目录
cd ~;pwd
/root
{}:可承载一个以逗号分隔的列表,并将其展开为多个路径;
例:在/tmp/d目录下创建f1,f2,f3三个文件
touch /tmp/d/f{1,2,3}
bash
-
命令的执行状态结果:
bash的基础特性之状态值返回:在bash中使用一个特殊的变量$?来保存上一个命令的执行状态结果。
0表示成功,
1-255表示失败
例如:
变量
变量引用:
变量替换:把变量引用符号出现的位置替换为其指向的内存空间中的数据;
bash变量种类:
本地变量:作用域为当前shell进程;不包括其子进程;
环境变量:使用域为当前shell进程及其子进程;
局部变量:
作用域:生效范围,也即可引用到的范围;
本地变量:
变量赋值:NAME=VALUE
变量引用:
-
工作控制、前景背景控制(job contril,foreground,background):
举例来说,我们在登陆 bash 后, 想要一边复制文件、一边进行数据搜寻、一边进行编译,还可以一边进行 vi 程序撰写! 当然我们可以重复登陆那六个文字介面的终端机环境中,不过,能不能在一个 bash 内达成? 当然可以啊!就是使用 job control 啦!
进行工作管理的行为中, 其实每个工作都是目前 bash 的子程序,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash !
或许你会觉得很奇怪啊,既然我可以在六个终端介面登陆,那何必使用 job control 呢? 真是脱裤子放屁,多此一举啊!不要忘记了呢,我们可以在 /etc/security/limits.conf 里面配置使用者同时可以登陆的连线数,在这样的情况下,某些使用者可能仅能以一个连线来工作呢! 所以罗,你就得要了解一下这种工作管理的模式了!
由於假设我们只有一个终端介面,因此在可以出现提示字节让你操作的环境就称为前景 (foreground),至於其他工作就可以让你放入背景 (background) 去暂停或运行。要注意的是,放入背景的工作想要运行时, 他必须不能够与使用者互动。举例来说, vim 绝对不可能在背景里面运行 (running) 的!因为你没有输入数据他就不会跑啊! 而且放入背景的工作是不可以使用 [ctrl]+c 来终止的』!
总之,要进行 bash 的 job control 必须要注意到的限制是:
这些工作所触发的程序必须来自於你 shell 的子程序(只管理自己的 bash);
前景:你可以控制与下达命令的这个环境称为前景的工作 (foreground);
背景:可以自行运行的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
背景中『运行』的程序不能等待 terminal/shell 的输入(input)
-
程序化脚本(shell scripts):
shell脚本执行方式
1.直接当做命令下达:该档案必须有rx权限,然后必须可以找到该命令,即要么通过绝对路径或相对路径,或者利用环境变量PATH
2.以bash程序来执行:通过bash shell.sh或许sh shell.sh来执行(shell.sh是我们写好的脚本)。
-
通配符:
- brace expansion (花括号扩展)
- tilde expansion (波浪号扩展)
- parameter and variable expansion (参数和变量扩展)
- arithmetic expansion (算术扩展)
- command substitution (命令置换)
- word splitting (单词分割)
- filename expansion (文件名扩展)
- process substitution(进程替换)