一、基础语法
1.创建shell脚本文件,vim xxx.sh
文本内容首行写上 #!/bin/bash
(在#后面加上!与shell的名称,用来宣告使用的shell类型),脚本中#代表注释.
编写良好的shell脚本的步骤:
①.首先宣告使用的shell是什么类型的脚本。(在/etc/crontab情况下,如果没有宣告使用的shell,会出现错误信息导致脚本无法执行);
②.注明脚本的内同功能、版本信息、作者、编写日期等;
③.注释每个大步骤的主要功能。
2.执行shell脚本(脚本默认是在另外新开的shell中执行的)
方法一: 将脚本文件改成可执行的属性,如chmod 111 xx.sh 然后执行该文档,如 ./xx.sh
方法二:用sh命令执行脚本,如sh xx.sh
方法三"强制在当前shell中执行脚本 source xx.sh
3.位置参数代号 xx.sh 参数1 参数2 参数3 参数4
$0 $1 $2 $3 $4
$0就是脚本文件名称 $1就是第一个附加参数,$2等以此类推
例如:脚本test1.sh内容为
echo "this script's name is $0"
echo "parameters are $1,$2,$3"
执行脚本 sh test1.sh pa1 pa2 pa3
输出 this script's name is test1.sh
parameters are pa1,pa2,pa3
tag:其他特殊变量的意义:
$$ Shell本身的PID(ProcessID)
$! Shell最后运行的后台Process的PID
$? 最后运行的命令的结束代码(返回值)
$- 使用Set命令设定的Flag一览
$* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$# 添加到Shell的参数个数
4.语法关键字
(1) declare 定义变量用的,declare [-afirx] 变量名称
其中参数-a 定义为数组array
-f 定义为函数function
-i 定义为整数integer
-r 定义为只读
-x 定义为透过环境变量输出
如: declare -i A=3 定义了整型变量A初始值为3
(2)引用变量的值要加上$符号,如 echo "A的值为$A"
当Shell遇到一个"$"符时(没有被引用或逃逸),它将认为其后为一变量,引用shell变量时候,可以在变量名字两边$后面加上{},以更加清楚的显示给shell,哪个是真正的变量,以实现字符串的合并等功能
$SUN=sun
$echo ${SUN}day
(3)语句末尾分号;可加可不加
(4)反引号``的作用:①包裹函数名,执行函数 ②字符串中包裹命令 让shell识别命令
1) 在Linux中起着命令替换的作用。命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。
如下,shell会执行反引号中的date命令,把结果插入到echo命令显示的内容中。
[root@localhost sh]# echo The date is `date`
The date is 2014年 12月 18日 星期四 16:15:13
2)可以用$()替代``, 如
ls -l `locate a.txt.txt 等同于 ls -l $(locate a.txt.txt)
(5)双引号""和单引号''的区别:
①单引号内的内容将全部变为字符串
②双引号内可以识别出带$的变量,还能识别转义符\和反引号`
③单引号、双引号用于用户把带有空格的字符串赋值给变量事的分界符,如果没有单引号或双引号,shell会把空格后的字符串解释为命令。
(6)read 接收用户输入
用法 read 变量名称,例如:
#read name
#jack (用户键盘输入jack)
#echo $name
#jack
(6)逻辑判断
1)逻辑运算符
①数值可以使用 -eq、-ne、-lt、-le、-gt 或-ge 进行比较,分别表示等于、不等于、小于、小于或等于、大于、大于或等于。
②字符串可以使用操作符 =、!=、< 和> 分别进行等于、不等于或第一个字符串是在第二个字符串之前还是之后的比较操作。
③ [ ! -e logical.txt ] 判断文件logical不存在时,对文件进行逻辑判断的操作符如下
操作符 | 特性 |
---|---|
-d | 目录 |
-e | 存在(也可以使用 -a) |
-f | 普通文件 |
-h | 符号链接(也可以使用 -L) |
-p | 命名的管道 |
-r | 可以读取 |
-s | 非空 |
-S | Socket |
-w | 可以写入 |
-N | 上次读取之后已经被修改过了 |
2)if...then... fi式条件判断,fi表示if then判断式的结束符
注意:下面的[ 条件 ] 中括号内两侧均含有空格 夹着条件内容
if [ 条件一 ] &&[ 条件二 ];then
执行内容
elif [ 条件三] || [条件四 ];then
执行内容
else
执行内容
fi
例如:if [ "$yn" = "y" ] || [ "$yn"="Y" ]; then
echo "script is running..."
else
echo "stop"
fi
3) case式条件判断,esac表示case判断式的结束符
case 变量 in
值1)
执行内容1
;;
值2)
执行内容2
;;
值3)
执行内容3
;;
*)
其他情况值默认执行内容
esac
(7)循环语句
1)for...do...done循环
for((条件一;条件二;条件三;))
do
操作
done
例如:
declare -i s;
for((i=1;i<=100;i++))
do
s+=i;
done
echo "s累加后值为$s"
2) while...do...done循环
while [ 条件1 ] || [ 条件2 ]
do
操作
done
例如(注意空格)
declare -i a=0;
declare -i s;
while [ $a -ge 0 ] && [ $a 0- 101 ]
do
s+=a
a=a+1
done
echo "s=$s";
3)for ... in ... do...done
$LIST="file1 file2 file3"
for a in $LIST
do
echo $a
done
二、函数
1.函数定义
function XX函数名(){
执行内容
return 返回值
}
说明:function关键字可以不加,return 可以没有
2.执行函数:用函数名不用带括号
①变量调用并接收: xx变量=`xx函数名称` 或 xx变量=$(xx函数名称)
比如 A1=`helloworld` 执行helloworld函数并且用A1接收,但是接收的不是return值,而是执行函数时的标准输出内容
②直接执行: helloworld 或者$helloworld
③$?可以接收函数return的返回值
三、Shell脚本调试技术
1.简单的用sh 进行debug调试:
sh -n xx.sh 不要执行脚本,只是查询脚本内的语法,若有错就列出
sh -v xx.sh 在脚本执行前,先将脚本的源码内容显示在屏幕上
sh -x xx.sh 将执行到的脚本(变量已引用后的)内容显示在屏幕上
2.参考 http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/
学习参考:http://billie66.github.io/TLCL/book/zh/