Shell是一个命令解释器。与Python,R等脚本语言类似,我们既可以在命令解释器上把命令一行一行敲出来执行,也可以把很多行保存到一个文件(即脚本/script),再让命令解释器执行这个文件。Window里管这个叫批处理(Batch)。因此凡是可以在终端上运行的命令,都可以写到shell脚本里。另外,shell支持变量、分支语句、循环、自定义函数,因此可以用shell脚本实现比较复杂的操作,从而将常规系统管理的操作变成可复用的模块。Shell编程是Linux运维人员必备能力。通过本实验仅能掌握其基本语法,但是想达到企业级应用的水平,需要掌握更多命令,尤其是文本处理命令sed和awk最为重要,以及计划任务、各种系统管理命令等。
编写第一个shell脚本
新建一个shell脚本文件,请注意,文件名后缀一定为.sh。
vi hello.sh
打开vi编辑模式
#!/bin/sh
echo 'Hello World!'
echo命令用于将一个字符串在终端上打印出来。
有两种方法可以用来执行这个脚本。
最简单的方法,用sh命令去解释它。
sh hello.sh
当然,也可以把它作为一个可执行程序运行,但需要添加可执行权限。
chmod +x hello.sh
./hello.sh
Sharp-Band(#!)和注释
Shell脚本的首行要写上“#!/bin/sh”,前面最开始的两个字符“#!”正好组成一个16bit的幻数即0x2321。在unix中执行一个可执行程序时,操作系统将查看该文件的前几个字节,即所谓的“幻数”。它可以用来决定程序的格式以及如何执行它。“#!/bin/sh”表明该script由/bin/sh进行解释执行。——当然,对于大部分Linux系统,你不写同样可以顺利执行,但100%建议你一定要写。
和其他脚本语言一样,Shell脚本只支持单行注释,以“#”开头。
#!/bin/sh
#My first shell script
echo 'Hello World!'
分号的作用
使用分号可以将本应写在两行的内容写在一行上,除此之外并没有使用的必要。
变量
shell中的变量只有一种,就是字符串(当然稍后我们会讲也可以将其作为数值处理)。脚本语言的变量不需要声明,直接赋值即可。
HELLO='Hello World'
注意,“=”的两边绝对不能出现空格。shell脚本是逐句、直接进行解释,如果写了空格,就会被shell认为是一个命令。
单引号和双引号
在shell里,字符串通常并不需要用引号引用才能表示。但如果字符串包含空格的话,就需要引号了,否则就会被认为是多个字符串——语法就会发生错误。
单引号和双引号都可以用来表示字符串,区别在于单引号引用的字符串中的全部字符,包括shell中的特殊字符/语法,都作为普通字符进行处理。而用双引号引用的字符串中的shell符号/语法会进行转义/解释。
变量的引用和打印变量
用$ {变量名}或 $ 变量名引用一个变量。而且可以用${变量名:index:length}轻松地截取字串。
注意$HELLO是我们上面赋值过的那个“Hello World”字符串,而HELLO只是一个内容为“HELLO”的字符串。
echo用来在终端上打印一个字符串。
echo ${HELLO}
echo $HELLO
echo ${HELLO:0:5}
echo ${HELLO:2:5}
echo ${HELLO:2}
请大家通过运行以上命令,自己掌握字符串截取。
set命令可以显示当前工作空间全部的变量和它们的值。
unset 变量名用来清除一个变量。
特殊的变量
变量 | 说明 |
---|---|
$# | 参数的个数 |
$number | 第number个参数,例:./my.sh abc,$0的值就是./my.sh,$1的值就是abc |
$$ | 当前进程的PID |
$? | 上一次命令的exit值(0-255),0代表没有错误,其他值(1-255)代表有错误 |
$@ | 代表了参数的内容 |
$! | Shell最后运行的后台Process的PID |
变量的组合
把字符串放在一起就可以了: $ {variable-name1}${variable-name2}。
例:
TMP_VAR1='Hello, '
TMP_VAR2='World'
echo ${TMP_VAR1}${TMP_VAR2}
变量的默认值/自动初始化
如果变量已经被初始化,则使用它;如果没有被初始化,则使用默认值,但不会对该变量进行初始化。语法:${variable:-value}
例:
echo "This color is ${COLOR:-green}"
#可以打印出green,但是COLOR并没有初始化
echo $COLOR
COLOR=blue
echo "This color is ${COLOR:-green}"
#这次会打印出blue
如果希望使用默认值的同时又进行初始化,则使用:${COLOR:=green}。
要一直使用绝对路径
要一直使用绝对路径,并应该用一个变量保存它。因为你的脚本可能会被移动,或是在其他机器上使用。通过绝对路径及变量,增加你的脚本的可重用性。
例:
SRC_FILE='/tmp/message1'
DST_FILE