1.20世纪60年代,计算机支持交互式终端。
2.贝尔实验室,Unix操作系统可以从文本文件(称为shell脚本)中读取并执行文件,刚开始只支持一种交互式终端,Bourne Shell(sh)
3.1989年,GNU项目吸收了大量其他用户界面特性,编写出了一种全新的shell,Bourne Again Shell(bash),bash shell与Bourne Shell完全兼容。
4.随着linux成为最流行的类Unix操作系统,bash shell也变成了Unix和Linux中既成事实的标准shell
1.2.1基础知识:
shell通过终端会话同shell环境打交道,打开终端后会有命令提示符,通常为username@hostname$也可以配置成root@hostname#,或者简单显示为$或者# $代表普通用户,#代表管理员用户root,root是权限最高的用户
shell脚本通常以shebang作为起始,是一个文本行,只能在脚本的第一行。shebang就是定义用来解释脚本的解释器
脚本执行有两种方式:
(1)将脚本名作为命令行参数(这种方式可以不用shebang)
bash zhy.sh
(2)授予脚本执行权限,将其变为可执行文件:(这种方式需要用shebang的解释器来解释脚本,内核会读取脚本首行,并注意到shebang为#!/bin/bash,会识别并执行脚本/bin/bash zhy.sh)。
chmod 755 zhy.sh
./zhy.sh(可以用相对路径也可以用绝对路径)
启动shell时会用用户主目录中的脚本文件~/.bashrc(对于登陆shell则是~./bash_profile)来初始化提示文本、颜色等设置。
Bash shell还维护了一个历史记录文件~./bash_history用于保存用户运行过的命令
~表示主目录,通常为/home/user user是用户名,如果是root用户则为/root ,登陆shell是登陆主机后创建的shell,但登陆图形化环境后所创建的终端回话并不是登陆shell,使用GNOME或KDE这类显示管理器登陆后并不会读取.profile或.bash_profile(绝大多数情况下不会),而使用ssh登陆远程系统时会读取.profille。shell使用分号或换行符来分隔单个命令或命令序列
$cmd1;cmd2
$cmd1
$cmd2
这两种写法等价
注释部分以#为起始,一直延续到行尾。注释行通常用于描述代码或在调试期间禁止执行某行代码
1.2.2 实战演练
echo默认情况下每次调用一次之后会添加一个换行符:
$echo "Welcome to Bash"
Welcome to Bash
实现相同效果的另一种方式是使用单引号:
$echo 'text in quotes'
这些方法看起来很相似,但各有优缺点,双引号允许shell解释字符串中出现的特殊字符。单引号不会对其做出任何解释。
$echo "cannot include exclamation - ! within double quotes"
命令输出如下:
bash: !:event not found error
如果需要打印像!这样的特殊字符,就将其放在单引号或者在特殊字符前面加一个反斜线(\)
$echo Hello world!
或者
$echo 'Hello world'
或者
$echo "Hello world \!"
如果不使用引号,无法在echo中使用分号,因为Bash shell中用作命令间的分隔符:
echo hello;hello 这个命令,Bash将echo hello作为一个命令,将hello作为另一个命令
另一个终端可打印命令是printf 和c语言中的printf一样printf "Hello world"
printf命令接受引用文本或由空格分隔的参数。我们可以在printf中使用格式化字符串来指定字符串的宽度、左右对齐方式等。默认情况下,printf并不会自动添加换行符,我们必须手动指定,比如下面的脚本
#!/bin/bash
#文件名:printf.sh
printf "%-5s %-10s %-4s\n" No Name Mark
printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
printf "%-5s %-10s %-4.2f\n"3 Jeff 77.564
得到输出格式如下:
No Name Mark
1 Sarath 80.35
2 James 91.00
3 Jeff 77.56
1.2.3工作原理
%s ,%c,%d,%f都是格式替换符,%-5s指明了一个格式为左对齐且宽度为5的字符串替换(-表示左对齐),如果不指明-,字符串就采用右对齐形式。宽度指定了保留给某个字符串的字符数量。对Name而言,其保留宽度是10,Name字段的保留宽度是10,里面的内容都会被显示在10字符宽的保留区域内,不足10字符用空格填充
最后的浮点数.2f保留两位小数\n是换行
1.2.4内容补充
echo和printf要确保在所有字符串之前,否则Bash会将其视为另一个字符串
1.在echo中转义换行符
默认情况下。echo会在输出文本的尾部追加一个换行符,可以使用-n来禁止这种行为。echo同样接受双包含转义序列的双引号字符串作为参数。在使用转义序列时,需要使用echo -e "包含转义序列的字符串"例如:
echo -e "1\t2\t3"
1 2 3
2.打印彩色输出
脚本可以使用转义序列在终端中生成彩色文本。
文本颜色是由对应的色彩码来描述的。重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37。
要打印彩色文本,可输入如下命令:
echo -e "\e[1;31m This is red text \e[0m" \e[0;30m置换为黑色
\e[1;31m是一个转义字符串,可以将颜色设为红色,\e[0m将颜色重新置回,只需要将31替换成想要的色彩码就可以了。
对于彩色背景,经常使用的颜色码是:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44 ,洋红=45,青色=46,白色=47。
想要设置彩色背景,可以输入下面命令
echo -e "\e[1;42m Green Background \e[0m"