预备知识
shell脚本通常以shebang①起始:
#!/bin/bash
- 其中
#!
位于解释器路径之前。/bin/bash
是Bash的解释器命令路径。 - 脚本中只有第一行可以使用shebang来定义解释该脚本所使用的解释器。
脚本的执行方式有两种:
-
将脚本名作为 bash命令 的命令行参数
$ bash myScript.sh
如果将脚本作为bash的命令行参数来运行,那么就用不着使用shebang了。
-
授予脚本执行权限,将其变为可执行文件
$ chmod 755 myScript.sh $ ./myScript.sh # 使用相对路径或全路径皆可
注释部分以#
为起始,一直延续到行尾。
echo 命令
echo是用于终端打印的最基本命令。
默认情况下, echo在每次调用后会添加一个换行符。
ming@ming-Aspire-E5-572G:~$ echo "Welcome to Bash"
Welcome to Bash
ming@ming-Aspire-E5-572G:~$
使用单引号、双引号或两者都不使用都可以:
ming@ming-Aspire-E5-572G:~$ echo Welcome to Bash
Welcome to Bash
ming@ming-Aspire-E5-572G:~$ echo 'text in quotes'
text in quotes
ming@ming-Aspire-E5-572G:~$
这些方法看起来相似,但各有特定的用途及副作用。双引号允许shell解释字符串中出现的特殊字符。而单引号不会对其做任何解释,且变量替换不会在单引号中执行。
ming@ming-Aspire-E5-572G:~$ name=kenny
ming@ming-Aspire-E5-572G:~$ echo "hello, $name"
hello, kenny
ming@ming-Aspire-E5-572G:~$ echo 'hello, $name'
hello, $name
ming@ming-Aspire-E5-572G:~$
如果需要打印特殊字符,那就不要将其放入双引号中,而是使用单引号,或是在特殊字符之前加上一个反斜线。
如果不使用引号,我们无法在echo中使用分号,因为分号在Bash shell中用作命令间的分隔符:
ming@ming-Aspire-E5-572G:~$ echo hello; hello
hello
Command 'hello' not found, but can be installed with:
sudo apt install hello
sudo apt install hello-traditional
ming@ming-Aspire-E5-572G:~$
默认情况下, echo会在输出文本的尾部追加一个换行符。可以使用选项-n
来禁止这种行为。
echo同样接受包含转义序列的双引号字符串作为参数。在使用转义序列时,需要使用echo -e
"包含转义序列的字符串"这种形式。
ming@ming-Aspire-E5-572G:~$ echo -e "1\t2\t3"
1 2 3
ming@ming-Aspire-E5-572G:~$ echo "1\t2\t3"
1\t2\t3
printf 命令
另一个可用于终端打印的命令是printf。该命令使用的参数和C语言中的printf函数一样。
printf命令接受引用文本或由空格分隔的参数。我们可以在 printf 中使用格式化字符串来指定字符串的宽度、左右对齐方式等。默认情况下, printf 并不会自动添加换行符,我们必须在需要的时候手动指定。
ming@ming-Aspire-E5-572G:~$ printf "%-5s %-10s %-4s\n" No Name Mark
No Name Mark
ming@ming-Aspire-E5-572G:~$ printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
1 Sarath 80.35
%s、 %c、 %d和%f都是格式替换符( format substitution character),它们定义了该如何打印后续参数。 %-5s指明了一个格式为左对齐且宽度为5的字符串替换( -表示左对齐)。如果不指明-,字符串就采用右对齐形式。宽度指定了保留给某个字符串的字符数量。对Name而言,其保留宽度是10。因此,任何Name字段的内容都会被显示在10字符宽的保留区域内,如果内容不足10个字符,余下的则以空格填充;如果内容大于10个字符,不会发生截断。
对于Mark字段,我们将其格式化为%-4.2f,其中.2指定保留两位小数。注意,在每行的格式字符串后都有一个换行符( \n)。
打印彩色输出
打印不同颜色的核心格式为:<ESC>[{attr};{fg};{bg}m。其中,在ascii中也用“^[”表示,在shell脚本中为 “\”字符。
attr表示显示字体的属性,如加粗、下划线、闪烁等。值如下:
0 Reset All Attributes (return to normal mode)
1 Bright (Usually turns on BOLD)
2 Dim
3 Underline
5 Blink(文字闪烁)
7 Reverse(前景色和背景色反转)
8 Hidden(看不见文字)
fg是前景颜色,即字体颜色,值如下:
30 Black
31 Red
32 Green
33 Yellow
34 Blue
35 Magenta
36 Cyan
37 White
bg是背景颜色,值如下:
40 Black
41 Red
42 Green
43 Yellow
44 Blue
45 Magenta
46 Cyan
47 White
其中 \e[0m 将颜色重新置回。