什么是shell? 为什么要关注shell ?
shell 是Unix上运行的一个程序。shell 的工作就是为用户执行其他程序
1.1 为什么是bash
bash 提供了shell 程序员所需要的编程特性和命令行用户喜爱的各种便利。
1.2 Bash shell
bash 是一种shell,就是命令解释器。bash主要目的是让用户可以同计算机操作系统交互。以便完成想做的任何任务。shell 脚本编程 允许你对此类任务进行自动化以实现易用性、可靠性以及重现性。
1.3 提示符揭秘
$ 通常表明你是以普通用户身份登录的
# 表明你是root, root账户是系统管理员,root 无所不能,可以执行任何操作。
~表示所在的是主目录。
1.4 显示当前位置
pwd : print working directory (打印工作目录)的缩写
-L 显示当前的逻辑路径
-P 显示当前的物理路径
1.5 查看并运行命令
type, which ,apropos, locate, slocate, find and ls
1.6 获取文件的相关信息
使用ls,stat,file或find命令
ls 命令只显示文件名
-l 选项可以提供每个文件更详细的信息。
-a 不隐藏以.(点号)开头的文件
-A 与-a相似,但不显示两个常见的目录.和..,因为每个目录中都有这两项。
-F 文件名结尾以下列类型标识符之一显示文件类型。
/ 表示该文件是目录
* 表示该文件是可执行文件
@ 表示符号链接。
= 表示套接字
| 表示FIFO缓冲。
-l 使用长列表格式
-L 显示链接目标文件的信息,而非符号链接本身
-Q引用名(quote name) (GNU扩展,仅部分系统支持)
-r 逆序排列
-R 递归显示子目录
-S 按照文件大小排序
-l 使用短格式,每行只显示一个文件
1.7 显示当前目录下的所有隐藏(点号)文件
ls -a 可以显示出包含隐藏文件字的文件在内的所有文件,但这种输出往往包含了过多的干扰项,而ls -a .* 的结果也比你想象或需要的更多。
[root@MaxwellDBA linux_learning]# ls -la
total 0
drwxr-xr-x 3 root root 17 Jun 26 21:33 .
drwxr-xr-x. 4 root root 41 Jun 27 18:51 ..
drwxrwxr-x 4 root root 30 Jun 26 21:34 tmp
[root@MaxwellDBA linux_learning]#
1.8 使用shell引用
将字符串放进单引号中,除非字符串中包含需要shell进行插值的元素。
[root@MaxwellDBA linux_learning]# echo A coffee is $5?!
A coffee is ?!
[root@MaxwellDBA linux_learning]# echo "A coffee is $5?!"
A coffee is ?!
[root@MaxwellDBA linux_learning]# echo 'A coffedd is $5?!'
A coffedd is $5?!
[root@MaxwellDBA linux_learning]# echo 'A coffee is $5 for' "$USER" '?!'
A coffee is $5 for root ?!
[root@MaxwellDBA linux_learning]# echo "A coffee is \$5 for $USER?\!"
A coffee is $5 for root?\!
[root@MaxwellDBA linux_learning]# echo "A coffee is \$5 for $USER?! "
A coffee is $5 for root?!
[root@MaxwellDBA linux_learning]#
无法在对一对单引号再嵌入另一个单引号,使用反斜线也不行,因为单引号内不会执行任何插值操作。解决办法: 使用双引号以及转义字符,或者在单引号对之外转义单引号。
# 我们会得到一个示意继续输入的提示符,因为目前的引号并不对称。
[root@MaxwellDBA linux_learning]# echo '$USER won't pay $5 for coffee.'
> ^C
# 错误
[root@MaxwellDBA linux_learning]# echo "$USER won't pay $5 for coffee."
root won't pay for coffee.
# 有效
[root@MaxwellDBA linux_learning]# echo "$USER won't pay \$5 for coffee."
root won't pay $5 for coffee.
#同样有效
[root@MaxwellDBA linux_learning]# echo 'I won'\''t pay $5 for coffee.'
I won't pay $5 for coffee.
[root@MaxwellDBA linux_learning]#
1.9 使用或替换内建命令与外部命令
问题: 你想用自己编写的函数或外部命令替换内建命令,还想知道脚本究竟执行的是哪种命令。(例如: 是/bin/echo还是内建echo)
解决方案:
用type和which命令查看指定命令是否存在,并确定其是内建命令还是外部命令。
[root@MaxwellDBA linux_learning]# type cd
cd is a shell builtin
[root@MaxwellDBA linux_learning]# type awk
awk is /usr/bin/awk
[root@MaxwellDBA linux_learning]# which cd
/usr/bin/cd
[root@MaxwellDBA linux_learning]# which awk
/usr/bin/awk
[root@MaxwellDBA linux_learning]#
内建命令: 内建在shell自身中的命令
外部命令: 由shell运行的外部文件。外部文件可以是二进制文件,也可以是shell脚本。
可以用enable命令来关闭或启用内建命令。不过强烈建议不要这么做,除非你有十足的把握知道自己在做什么。 enable -a 可以列出所有内建命令及其当前的状态(启用或禁用)
内建命令的问题在于你无法使用-h 或--help选项获得使用帮助。
要想避开优先级更高的函数或内建命令,而强制使用外部命令,可以利用enable -n 关闭shell内建命令或用command忽略shell函数。
例如: enable -n test, 然后执行test,此时运行的就不再是内建命令,而是$PATH中的test.
1.10 确定是否处于交互模式
问题: 你手边有些代码,希望仅在处于(或不处于)交互模式时运行
解决方案:
[root@MaxwellDBA ch01]# cat interactive.sh
#! /usr/bin/env bash
# filename : interactive
case "$-" in
*i*) # during interactive, run the code as below in shell
;;
*) # during non-interactive, run the code as below in shell
;;
esac
[root@MaxwellDBA ch01]#