一、shell脚本的定义
1、shell的定义
shell,是一个命令行解释器。在计算机领域中,俗称壳,用来区别于核(如linux是内核,shell则是用户与linux之间的接口),是指提供使用者使用界面的软件(命令解析器)。类似于dos下的command和后来的cmd.exe。shell接收用户命令,然后调用相应的应用程序。--百度百科
shell是脚本语言,即解释型语言。
2、shell几种常见的类型
sh,Bourne Shell的缩写,sh是unix标准默认的shell。
bash,Bourne Again Shell的缩写,bash是linux标准默认的shell,bash完全兼容了sh。
还有ash、csh、tcsh、ksh等
3、shell有2中执行命令的方式
交互式:解释执行用户的命令,用户在界面输入一条命令,shell就执行一条
批处理:用户先把(一条或多条)命令写成一个shell脚本(script),执行sh脚本,shell会一次性把sh脚本的所有命令执行完。
二、shell变量
1、变量的定义、赋值及使用
定义/赋值:variableName=“value”,注:赋值时,变量名与等号之间不能有空格。
使用:${variableName},大括号可省略,但在变量名后面有带其他字符串时,大括号必须保留。如${variableName}Script
2、只读属性
readonly命令可以将变量定义为只读变量。如:readonly variableName
3、删除
unset,删除命令(不能删除只读变量)。unset variableName
4、特殊变量
$0,当前脚本的文件名。如在脚本中echo $0,就可以输出当前脚本的文件名称。
$n,传递给脚本或函数的第n个参数。n是数字。如执行文件时:sh ./test.sh java,则在shell脚本中$1就能获取到java
$#,传递给脚本或函数的参数个数。返回一个数字,参数数量总数。
$*和$@,传递给脚本或函数的所有参数。
在没有双引号包含时,效果等同于$@,都是以"$1""$2"..."$n"的格式输出所有参数,$@有没有双引号都是同样的输出格式。
有双引号包含时,$*是作为一个整体输出,"$1 $2 ... $n"。
$?,上个命令的退出状态(成功返回0,失败返回1或其他数字),或函数的返回值。
$$,当前shell进程ID。
5、变量的替换与转义符
echo命令中,-E选项是禁止转义,默认也是不转义的。-e表示对转义字符进行替换。
如:
a=10
echo -e "Value of a is $a \n" 会输出:Value of a is 10
echo "Value of a is $a \n" 会输出:Value of a is 10 \n
转义符:
\\,反斜杠
\a,警报,响铃
\b,退格(删除键)
\f,换页FF,将当前位置移到下页开头
\n,换行
\r,回车
\t,水平制表符(tab键)
\v,垂直制表符
6、命令替换
命令替换是指shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。
语法:`command` (命令使用反引号包含)
赋值命令替换的时候:赋值是先执行命令,把命令执行后的值赋给变量;而不是把命令本身赋给变量。#! /bin/bash
DATE=`date`
echo "Date is $DATE"将会输出Date is ...(当前日期)
如:
d=`date +%H:%M:%S`
echo "the script begin at $d"
执行结果是(sh –x选项,方便调试,会先打出一行命令,再打出执行命令的结果):
++ date +%H:%M:%S
+ d=16:57:07
+ echo 'the script begin at 16:57:07'
the script begin at 16:57:07
7、变量替换
变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。
${var},变量本来的值
${var:-word},如果变量var为空或已被删除(unset),那么返回word,但不改变var的值。
${var:+word},如果变量var被定义,那么返回word,但不会改变var的值。
${var:=word},如果变量var为空或已被删除(unset),那么返回word,并将var的值设置为word。
${var:?message},如果变量var为空或已给删除(unset),那么将消息message送到标准错误输出,可以用来检测变量var是否可以被正常赋值。若此替换出现在shell脚本中,那么脚本将停止运行。
三、shell运算符
bash可以支持运算符(可使用命令awk、expr),包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。
expr是一款表达式计算工具,使用expr能完成表达式的求值操作。
注:运算时,表达式和运算符之间要有空格。
1、算数运算符,8个
+、-、*、/、%:加减乘除取余,如:val=`expr $a + $b` echo "$val" 输出结果就是a+b的和。其他同理。
=、==:赋值、数字相等则返回true,!= 数字不相等则返回true。a=$b把b的值赋给a;[$a == $b]若相等返回true。
数学计算要用[]括起来,且在外头带一个$。如:sum=$[ $a + $b ]
2、关系运算符,6个
关系运算符只支持数字,不支持字符串。
-eq:两个数字相等则返回true。[ $a -eq $b ],若a、b相等,则返回true。
-ne:两个数字不相等则返回true。[ $a -ne $b ],若a、b相等,则返回false,若不相等则返回true。
-gt:左边大于右边,则返回true。[ $a -gt $b ]
-lt:左边小于右边,则返回true。
-ge:左边大于或等于右边,则返回true。
-le:左边小于或等于右边,则返回true。
3、布尔运算符列表,3个
!:非。[ ! false ]则返回true。
-o:或,or。[ $a -lt 20 -o $b -gt 100 ],两个条件中任一个为true,则表达式就返回true。
-a:与,and。
4、字符串运算符列表,5个
=:两个字符串相等,则返回true。[ $a = $b ]
!=:两个字符串不相等,则返回true。 [ $a != $b ]
-z:字符串长度为0,则返回true。 [ -z $a ]
-n:字符串长度不为0,则返回true。 [ -n $a ]
str:字符串不为空,则返回true。 [ $a ]
5、文件测试运算符列表
-b file:检测文件是否块设备文件,如果是,则返回true。
-c file:若文件是字符设备文件,则返回true。
-d file:若文件是目录,则返回true。
-f file:若文件是普通文件(非目录、非设备文件则是普通文件),则返回true。
-g file:若文件设置了SGID位,则返回true。
-k file:若文件设置了粘着位(Sticky Bit),则返回true。
-p file:若文件是具名管道,则返回true。
-u file:若文件设置了SUID位,则返回true。
-r file:若文件可读,则返回true。-w file:若文件可写,则返回true。-x file:若文件可执行,则返回true。
-s file:若文件大小大于0,则返回true。
-e file:若文件/目录存在,则返回true。
四、字符串
1、单引号
单引号内的任何字符都会原样输出,所以单引号字符串中的变量是无效的。单引号字符串中不能出现单引号,哪怕用了转义符也不行。
2、双引号
双引号内的字符串支持变量、转义字符、命令等。name='world' str="Hello, \" ${name} \" ! \n"
3、字符串操作
获取字符串长度:echo ${#variable_name}
提取子字符串(bash中是从0开始数): echo ${variable:1:4} ,从第一位开始获取长度为4的子字符串。
五、数组
bash支持一维数组(不支持多维数组),bash没有限定数组的大小,数组元素的下标由0开始编号。数组元素用空格或换行分隔。
赋值:array_name=(value0 value1 value2 value3)或 array_name[0]=value0等
读取:${array_name[index]},如:val=${array_name[3]} 或 echo "First Index: ${array_name[0]}"
${array_name[*]} 或 ${array_name[@]} ,可以获取字符数组的所有元素。
六、相关命令数组元素个数:length=${#array_name[@]}
数组单个元素的长度:length_n=${#array_name[n]}
echo:
printf:用于格式化输出,是echo的增强版。printf不自动换行。printf format-string [arguments]
printf %s abc def :会输出 abcdef
if: 格式为 if [...] then ... elif [...] then ... else ... fi
a) if [ $a –lt 5 ] then…… 如果条件使用[],就不能使用< > =这些符号,要使用-lt –gt –le –ge –eq –ne等
b) if ((a<5)); then……
c) for I in `seq 1 5`; do …… seq 1 5表示从1到5 的序列。
case : case $variable_name in ... ;; esac
for循环、while循环、until循环、break跳出循环、continue跳出循环
文件包含:在shell脚本中可以包含外部脚本,将外部脚本合并到当前脚本。使用方式: . filename 或者 source filename (被包含脚本不需要有执行权限)
重定向:
<:输入重定向
<<:表示当前标准输入来自命令行的一对分隔号的中间内容
>:输出重定向,如果文件不存在,会新建一个;如果文件存在,会覆盖
>>:输出重定向,如果文件存在,则追加在该文件的内容后面。
常用文件重定向命令
command > filename 把标准输出重定向到一个新文件中
command >> filename 把标准输出重定向到一个文件中(追加)
command 1 > fielname 把标准输出重定向到一个文件中
command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中
command 2> filename 把标准错误重定向到一个文件中
command 2>> filename 把标准输出重定向到一个文件中(追加)
command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加)
command < filename >filename2 把c o m m a n d命令以f i l e n a m e文件作为标准输入,以f i l e n a m e 2文件作为标准输出
command < filename 把c o m m a n d命令以f i l e n a m e文件作为标准输入
command << delimiter 把从标准输入中读入,直至遇到d e l i m i t e r分界符
command <&m 把文件描述符m作为标准输入
command >&m 把标准输出重定向到文件描述符m中
command <&- 关闭标准输入
参考:http://huaijin.iteye.com/blog/1021339
http://c.biancheng.net/cpp/view/2738.html