Shell脚本的第一行“#!”(Shebang)
脚本中的#!行(第一行)用于指示一个解释程序。
#!行的语法格式类似如下所示:
#! INTERPRETER [option] ...
注意:INTERPRETER必须是一个程序的绝对路径。
Shell中的注释
“#”是注释标识符。
Bash的HERE DOCUMENT特性,添加多行的注释内容。
<<COMMENT
comment line 1
comment line 2
comment line n
COMMENT
如何设置脚本的权限和执行脚本
chmod u+x file
Shell变量进阶
$PARAMETER
${PARAMETER}
位置参数 $9之后,${10}
注意:参数名是大小写敏感
间接参数扩展:
${!PARAMETER} 用参数值做参数名。
大小写修改(Bash 4.0的新特性)
${PARAMETER^} 第一个字母大写
${PARAMETER^^} 全部大写
${PARAMETER,} 第一个字母小写
${PARAMETER,} 全部小写
${PARAMETER~} 首字母改变大小写
${PARAMETER~~}全部变换大小写
注意:大小写修改的参数扩展是Bash4.0的新特性,之前的Bash版本中无此参数扩展功能。
变量名扩展:
${!PREFIX*}
${!PREFIX@}
这种参数扩展将列出以字符串PREFIX开头的所有变量名。默认情况下,列出的这些变量名用空格分隔。
字符串移除:
${PARAMETER#PATTERN} 从开始移除,最短匹配
${PARAMETER##PATTERN} 从开始移除,最长匹配
${PARAMETER%PATTERN} 从结尾开始移除,最短匹配
${PARAMETER%%PATTERN} 从结尾开始移除,最长匹配
字符串搜索与替换:
${PARAMETER/PATTERN/STRING} 替换一个匹配
${PARAMETER//PATTERN/STRING} 替换所有匹配
${PARAMETER/PATTERN} 没有指定替换,将删除第一个匹配
${PARAMETER//PATTERN} 没有指定替换,搜友匹配将被删除
字符串长度:
${#PARAMETER}
子字符串扩展:
${PARAMETER:OFFSET}
${PARAMETER:OFFSET:LENGTH}
使用默认值:
${PARAMETER:-WORD}
${PARAMETER-WORD}
指定默认值:
${PARAMETER:=WORD}
${PARAMETER=WORD}
使用替代值:
${PARAMETER:+WORD}
${PARAMETER+WORD}
Bash 的内部变量
$BASH 变量-用于引用Bash实例的全路径名。
$HOME 当前用户的家目录
$IFS 内部字段分隔符
$OSTYPE 操作系统的类型
$SECONDS 脚本已运行的秒数
$TMOUT 超时
$UID 当前账户id
Bash中的位置参数和特殊参数
位置参数N可以被引用为${N}
Bash对一些参数的处理比较特殊。这些参数只能被引用,但不能修改它们的值。这些参数分别是
*、@、#、?、-、$、!、0和_。
*:扩展从1开始的所有位置参数。如果扩展发生在双引号内,即"$*",则扩展为包含每个参数值的单词,每个参数值用特殊变量IFS的第一个字符分隔。
@:也将扩展从1开始的所有位置参数。但当它的扩展发生在双引号内时,每个参数都扩展为分隔的单词。
#:将扩展为位置参数的个数,用十进制表示
?:上一命令执行的状态
$:将扩展为当前shell的进程号
!:扩展为最近一次执行的后台命令的进程号
0:将扩展为Shell或Shell脚本的名称。
_:在shell启动时,它被设为开始运行的Shell或Shell脚本的路径。随后扩展为前一个命令的最后一个参数。
使用declare指定变量的类型
declare命令是Bash的内部命令,用于声明变量和修改变量的属性。它与bash的另一个内部命令typeset的用法和用途完全相同。
直接使用declare命令,不指定变量名,将显示所有变量的值。
-r:declare将变量定义为只读变量,不能被清除和再赋值
-i:定义为整型变量
-x:declare命令将把指定的变量通过环境输出到后续命令
如果不知道某程序执行多长时间,把命令放在后台执行可以使用nohup
nohup COMMOND [ARG]... &
Bash中的数组变量
间接声明数组
ARRAYNAME[INDEX]=value
显示声明一个数组变量是使用Bash的内部命令declare
declare -a ARRAYNAME
declare -a linux=('Debian' 'Redhat' 'Suse' 'Fedora')
ARRAYNAME=(value1 value2 ... valueN)
若要引用数组中某一项的内容,必须要使用花括号{},如果索引编号是“@”或"*",那么数组的所有成员都将被引用.
echo ${linux[@]}
arr1=(one two three)
echo ${arr1[0]} ${arr1[1]} ${arr1[2]}
echo ${arr1[*]}
如果引用时,不指定索引编号,则引用的将是数组中的第一个元素。
使用unset可以消除一个数组或数组的成员变量。