linux shell --01 终端输入输出
shell脚本是种文件,将一系列需要执行的命令写入其中,然后通过shell来执行这些脚本
$ 表示普通用户, # 表示超级用户(root user)。超级用户是Linux系统中权限最高的用户。shell脚本通常是一个以#! 起始的文本文件,如下所示:
#!/bin/bash
Linux环境下的任何脚本语言, 都是以这样一个被称为shebang1 的特殊行作为起始的。在这行中,字符#! 被置于解释器路径之前。/bin/bash是Bash的路径。
shebang这个词其实是两个字符名称的组合。 在Unix的行话里, 用sharp或hash(有时候是mesh) 来称呼字符“# ”, 用bang来称呼惊叹号“! ”, 因而shebang合起来就代表了这两个字符。有两种运行脚本的方式: 一种是将脚本作为sh 的命令行参数(sh ./dir/pro.sh),另一种是将脚本作为具有执行权限的可执行文件(./dir/pro.sh)。至于脚本的可执行权限, 可以通过以下方式设置:$ chmod a+x script.sh
当打开一个终端的时候, 该终端最初会执行一组命令来定义诸如提示文本、 颜色等各类设置。 这组命令来自位于用户home目录中的.bashrc脚本文件(~/.bashrc) 。Bash还维护了一个历史记录文件~/.bash_history, 用于保存用户运行过的命令。在Bash中, 每个命令或是命令序列是通过使用分号或换行符来分隔的。比如:
$ cmd1 ; cmd2
它等同于:
$ cmd1
$ cmd2
在默认情况下, echo 在每次调用后会添加一个换行符。
$ echo "Welcome to Bash"
Welcome to Bash
只需要使用带双引号的文本, 结合echo 命令就可以将该文本在终端
中打印出来。 类似地, 不带双引号的文本也可以得到同样的输出结
果:
$ echo Welcome to Bash
Welcome to Bash
使用单引号也可以完成同样的任务:
$ echo 'text in quote'
这些方法看起来相似, 但各有一些特殊用途和副作用。 思考下面这行
命令:
$ echo "cannot include exclamation - ! within double quotes"
这条命令将会返回:
bash: !: event not found error
因此, 如果你希望打印! , 那就不要将其放入双引号中, 或者你可以
在其之前加上一个特殊的转义字符(\) 将! 转义。
$ echo Hello world !
或者
$ echo 'Hello world !'
或者
$ echo "Hello world \!" #Escape character \ prefixed.
当在echo 中使用带双引号的文本时,你应该在echo 之前使用set+H ,以便能够正常地显示! 。
如果你希望打印! ,那就不要将其放入双引号中,或者你可以在其之前加上一个特殊的转义字符(\) 将! 转义。
当在echo 中使用带双引号的文本时, 你应该在echo 之前使用set+H ,以便能够正常地显示! 。
每种方法的副作用如下:
使用不带引号的echo 时, 你没法在所要显示的文本中使用分号(; ),因为分号(; ) 在bash shell中被用作命令定界符。以echo hello;hello 为例, echo hello 被视为一个命令,第二个hello 则被视为另一个命令。
使用带单引号的echo 时, Bash不会对单引号中的变量(如$var) 求值,而只是照原样显示。这就意味着: $ echo '$var' 将会返回$var , 而$ echo $var将会根据变量$var 定义与否, 返回$var 的值, 或者什么都不返回。
另一个可用于终端打印的命令是printf 。 printf 使用的参数和C语言中的printf 函数一样。printf 使用引用文本或由空格分隔的参数。 我们可以在printf 中使用格式化字符串。 我们还可以指定字符串的宽度、左右对齐方式等。在默认情况下,printf 并不像echo 命令一样会自动添加换行符,我们必须在需要的时候手动添加, 比如在下面的脚本中:
#!/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
%s 、%c 、%d 和%f 都是格式替代符(format substitution character),其所对应的参数可以置于带引号的格式字符串之后。%-5s 指明了一个格式为左对齐且宽度为5的字符串替代(- 表示左对齐) 。如果不用- 指定对齐方式,字符串则采用右对齐形式。宽度指定了保留给某个变量的字符数。 对Name 而言, 保留宽度是10。 因
此, 任何Name 字段的内容都会被显示在10字符宽的保留区域内,如果内容不足10字符, 余下的则以空格符填充。对于浮点数,我们可以使用其他参数对小数部分进行舍入。对于Mark 字段,我们将其格式化为%-4.2f ,其中.2 指定保留2个小数位。注意,在每行格式字符串后都有一个换行符\n 。
2. 打印彩色输出
我们可以使用转义序列来实现。
每种颜色都有对应的颜色码。比如: 重置=0, 黑色=30, 红色=31, 绿色=32, 黄色=33, 蓝色=34, 洋红=35, 青色=36, 白色=37。
要打印彩色文本, 可输入如下命令:
echo -e "\e[1;31m This is red text \e[0m"
\e[1;31 将颜色设为红色, \e[0m 将颜色重新置回。 你只需要将31 替换成想要的颜色码就可以了。要设置彩色背景, 经常使用的颜色码是: 重置=0, 黑色=40, 红
色=41, 绿色=42, 黄色=43, 蓝色=44, 洋红=45, 青色=46, 白色=47。
注意, var = value 不同于var=value 。 把var=value 写成var =value 是一个常见的错误, 但前者是赋值操作, 后者则是相等操作。
在默认情况下, 有很多标准环境变量可供shell使用。PATH 就是其中之一
UID 是一个重要的环境变量, 可以用于检查当前脚本是以超级用
户还是以普通用户的身份运行的
root用户的UID 是0