Shell脚本的基本元素:
#!/bin/bash //第一行
# //表示单行注释如果是多行注释呢,应该如何操作?多行注释如下所示:
:<<BLOCK
中间部分为要省略的内容
BLOCK
Shell脚本的第一行均包含一个以#!为起始标志的文本行,这个特殊的起始标志表示当前文件包含一组命令,需要提交给指定的Shell解释执行。紧随#!标志的是一个路径名,指向执行当前Shell脚本文件的命令解释程序。比如:
#!/bin/bash
再比如:
#!/usr/bin/ruby如果Shell脚本中包含多个特殊的标志行,那么只有一个标志行会起作用。
Shell特殊字符
下面来看看Shell特殊字符。
•双引号":用来使Shell无法认出除字符$、`、之外的任何字符或字符串,也称之为弱引用。
•单引号':用来使Shell无法认出所有的特殊字符,也称之为强引用。
•反引号`:优先执行当前命令。
•反斜杠:有两种作用,一种是用来使Shell无法认出其后的字符,使其后的字符失去特殊的含义,如有特殊含义的字符$,也称为转义符。另外,如果放在指令前,有取消别名的作用,例如在“ m/home/yhc/*.log”中,rm指令前加上,作用是暂时取消别名的功能,将rm指令还原。
•分号;:允许在一行上放多个命令。
•&:将命令放于后台执行,建议带上nohup。
•括号():创建成组的命令。
•大括号{}:创建命令块。
•<>&:重定向。
•*?[]!:表示模式匹配。
•$:变量名的开头。
•#:表示注释(第一行除外)。
•空格、制表符、换行符:当作空白。
变量和运算符
变量是放置在内存中的某个存储单元,这个存储单元里存放的是这个单元的值,这个值是可以改变的,我们称之为变量。
其中,本地变量是在用户现有的Shell生命周期的脚本中使用的,用户退出后变量就不存在了,该变量只用于该用户。
下面都是跟变量相关的命令,这里只是大致地说明下,后面的内容里会有详细的说明,如下所示:
变量名="变量"
readonly 变量名="变量"表示设置该变量为只读变量,这个变量不能被改变。
echo $变量名
set 显示本地所有的变量
unset 变量名 表示清除变量
readonly 显示当前Shell下有哪些只读变量环境变量用于所有用户进程(包括子进程)。Shell中执行的用户进程均称为子进程。不像本地变量只用于现在的Shell。环境变量可用于所有的子进程,它包括编辑器、脚本和应用。
环境变量主目录如下:
$HOME/.bash_profile(/etc/profile)设置环境变量,例句如下:
export test="123"
查看环境变量,命令如下:
env
或者用如下命令:
export
本地变量中包含环境变量。环境变量既可以运行于父进程,也可以运行于子进程中。本地变量则不能运行于所有的子进程中。
变量清除命令如下:
unset 变量名
调试Shell脚本
使用bash-x可以调试Shell脚本,bash会先打印出每行脚本,再打印出每行脚本的执行结果,如果只想调试其中几行脚本,可以用set-x和set+x把要调试的部分包含进来,命令如下:
set -x
脚本部分内容
set +x
这个时候可以直接运行脚本,而不需要再执行bash-x了。这个功能在实际工作中非常有用,可以帮助我们调试变量,找出bug点,总之是非常有用的功能,希望大家掌握。
退出或出口状态
一个Unix进程或命令运行终止时,将会自动地向父进程返回一个出口状态。如果进程成功执行完毕,将会返回一个数值为0的出口状态。如果进程在执行过程中出现异常而未能正常结束时,将会返回一个非零值的出错代码。
在Shell脚本中,可以利用“exit[n]”命令在终止执行Shell脚本的同时,向调用脚本的父进程返回一个数值为n的Shell脚本出口状态。其中,n必须是一个位于0~255范围内的整数值。如果Shell脚本是以不带参数的exit语句结束执行的,则Shell脚本的出口状态就是脚本中最后执行的那条命令的出口状态。
在Unix系统中,为了测试一个命令或Shell脚本的执行结果,$?内部变量将返回之前执行的最后一条命令的出口状态,这些状态中,0才是正确值,其他非零的值都表示是错误的。