简介
类Unix操作系统设计令人惊叹,即使是在今天,它们的框架仍旧是最佳设计之一。这种构架最重要的一个特性就是命令行界面或Shell。Shell环境可以使用户与操作系统的核心功能进行交互。我们所说的编写脚本通常是使用某种基于解释器的编程语言。我们能将一系列需要执行的命令写入文件中,通过Shell来执行。
以Bash举例
打开终端的时候会有提示符
username@hostname$:
或
root@hostname#:
用$是普通用户,#则是管理员用户,在Linux中,root是最高权限用户;
一般使用“bash 脚本文件名”来运行脚本文件,当然也可以将脚本文件变成可执行文件直接运行
要是有需要的话,可以利用shebang来实现脚本的独立运行。对此必须设置脚本的可执行权限,这样它就可以使用位于#!之后的解释器路径来运行了。就像这样:
$ chmod a+x script.sh
该命令赋予所有用户script.sh文件的可执行权限。这个脚本能以下列方式执行:
$ ./script.sh #./表示当前目录
或者
$ /home/path/script.sh #使用脚本的完整路径
内核会读取脚本的首行并注意到shebang为#!/bin/bash。它识别出/bin/bash并在内部像这样执行该脚本:
$ /bin/bash script.sh
每个命令可以以“;”来分隔,注释可以用#;
终端打印
命令echo或者使用C语言的printf
通常是使用echo,在单纯的字符串情况下,可以直接输出、加‘’或者“”,这些都可以打印出来;
在某些情况下这些方式是有区别的,特殊符号例如“!”在“双引号”中是打印不出来的:
echo hello world !(这样直接打印可以显示)
或者
echo "hello world \!(前面加上\转义符)
使用不带引号的echo时,没法在所要显示的文本中使用分号(;),因为分号在Bash shell
中被用作命令定界符。
以echo hello;hello为例,echo hello被视为一个命令,第二个hello则被视为另一个命令。
echo会在文末自动添加换行符,printf需要手动添加
example:
printf "%-5s %-10s %-4s\n" No Name Mark
printf "%-5s %-10s %-4.2f\n" 1 Ardee 80.3456
printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
printf "%-5s %-10s %-4.2f\n" 3 Kobe 77.564
可以打印表格
打印补充内容
转义符
如果需要使用转义序列,则采用echo –e "包含转义序列的字符串"这种形式
echo -e "1\t2\t3"
输出:1 2 3
彩色打印
每种颜色都有对应的颜色码。比如:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37。
echo -e "\e[1;31m This is red text \e[0m"
要设置彩色背景,经常使用的颜色码是:重置=0,黑色=40,红色=41,绿色=42,黄色=43, 蓝色=44,洋红=45,青色=46,白色=47。
echo -e "\e[1;42m Green Background \e[0m"
变量
变量可以通过以下方式进行赋值:
var=value
var是变量名,value是赋给变量的值。如果value不包含任何空白字符(例如空格),那么它就不需要使用引号进行引用,否则必须使用单引号或双引号。
注意,var = value不同于var=value。把var=value写成var = value是一个常见的错误, 但前者是赋值操作,后者则是相等操作。
在变量名之前加上$前缀就可以打印出变量的内容:
var="value" #给变量var赋值
echo $var
或者
echo ${var}
example:
#!/bin/bash
#文件名:variables.sh
fruit=apple count=5
echo "We have $count ${fruit}(s)"
补充
- 获得字符串长度
可以用下面的方法获得变量值的长度:
length=${#var}
- 识别当前所使用的shell
可以用下面的方法获知当前使用的是哪种shell:
echo $SHELL
- 检查是否为超级用户
UID是一个重要的环境变量,可以用于检查当前脚本是以超级用户还是以普通用户的身份运行的。例如:
If [ $UID -ne 0 ]; then
echo Non root user. Please run as root.
else
echo Root user
fi