一,判断式
1、test命令
参数:
参数 | 代表意义 |
-e | 该文件名是否存在 |
-f | 该文件名是否存在且为文件 |
-d | 该文件名是否存在且为目录 |
-b | 该文件名是否存在且为一个block device设备 |
-c | 该文件名是否存在且为一个character device设备 |
-S | 该文件名是否存在且为一个Socket文件 |
-p | 该文件名是否存在且为一个FIFO文件 |
-L | 该文件名是否存在且为一个连接文件 |
-r | 检测该文件名是否存在且具有“可读”的权限 |
-w | 检测该文件名是否存在且具有“可写”的权限 |
-x | 检测该文件名是否存在且具有“可执行”的权限 |
-u | 检测该文件名是否存在且具有“SUID”的属性 |
-g | 检测该文件名是否存在且具有“GUID”的属性 |
-k | 检测该文件名是否存在且具有“Sticky bit”的属性 |
-s | 检测该文件名是否存在且为“非空白文件” |
-nt | (newer than)判断file1 是否比file2 新 |
-ot | (older than)判断file1 是否比file2 旧 |
-ef | 判断file1与file2是否为同一个文件 |
-eq | 两数值相等 equal |
-ne | 两数值不等 not equal |
-gt | n1 大于 n2 greater than |
-lt | n1小于 n2 less than |
-ge | n1大于等于 n2 greater than or equal |
-le | n1小于等于 n2 less than or equal |
-a | 两个条件同时成立 test -r file -a -x file |
-0 | 任何一个条件成立 test -r file -o -x file |
! | 反向状态 test ! -x file |
2、判断符号[ ]
注意中括号内的空格符,例如: [ "$HOME" == "$MALL" ]
①在中括号内每个组件都需要有空格键来分割;
②在中括号内的变量,最好使用双引号括起来;
③在中括号内的常量,最好使用双引号或者单引号括起来。
例如
#name="My Love"
#[ $name == "My LOVE" ]
就会报错,因为引用了参数后,第二条命令就变成了 [ My Love == "My Love" ] ,很明显的错误了吧。
3、默认变量($0 $1 $2 $3 ....)
$0 代表当前路径,$1,$2,.... 就代表后接的参数。
$#:代表参数的个数
$@:代表“$1”,"$2","$3"...,每个变量是独立的
$*:代表“$1 $2 $3....”
shift :造成参数变量的偏移;
运行一次shift命令,参数除了$0之外向左移动一个,以前的$1舍去,现在的$1代表以前的$2,现在的$2代表以前的$3.。。。。。。
运行一次shift 3命令,参数除了$0之外向左移动3个,以前的$1,$2,$3舍去,现在的$1代表以前的$4,现在的$2代表以前的$5.。。。。。。
4、if...then....if
多条件判断:
if[ 条件一 ] || [ 条件二 ];then
操作
fi
复杂条件判断式:
if[ 条件判断式 ]; then
该条件成立时,进行的操作
elif[ 条件判断式 ]; then
该条件成立时,进行的操作
。。。。
else
以上条件都不成立,进行的操作
fi
5、case .... esac 判断
case $变量名称 in <==关键字为 case ,还有变量前有钱字号 "第一个变量内容") <==每个变量内容建议用双引号括起来,关键字则为小括号 ) 程序段 ;; <==每个类别结尾使用两个连续的分号来处理! "第二个变量内容") 程序段 ;; *) <==最后一个变量内容都会用 * 来代表所有其他值 不包含第一个变量内容与第二个变量内容的其他程序运行段 exit 1 ;; esac <==最终的 case 结尾!『反过来写』思考一下!
6、function功能
语法:
function fname() {
程序段
}
注意:调用function,一定要先定义,后使用。
二、循环
1、while do done, until do done
不定循环常用方法:
当符合condition时,进行循环 while [ condition ] <==中括号内的状态就是判断式 do <==do 是回圈的开始! 程序段落 done <==done 是回圈的结束
当符合condition时,终止循环 until [ condition ] do 程序段落 done
固定循环方法:
for var in con1 con2 con3 ... do 程序段 done
以上面的例子来说,这个 $var 的变量内容在回圈工作时:
- 第一次回圈时, $var 的内容为 con1 ;
- 第二次回圈时, $var 的内容为 con2 ;
- 第三次回圈时, $var 的内容为 con3 ;
- ....
for (( 初始值; 限制值; 运行步阶 )) do 程序段 done例如:
for (( i=1; i<=10; i=i+1 ))
do
s=$(($s+$i))
done
三、shell script调试
sh [-nvx] scripts.sh 选项与参数: -n :不要运行 script,仅查询语法的问题; -v :再运行 sccript 前,先将 scripts 的内容输出到萤幕上; -x :将使用到的 script 内容显示到萤幕上,这是很有用的参数!例如:
[root@www ~]# sh -x sh15.sh + PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/root/bin + export PATH + for animal in dog cat elephant + echo 'There are dogs.... ' There are dogs.... + for animal in dog cat elephant + echo 'There are cats.... ' There are cats.... + for animal in dog cat elephant + echo 'There are elephants.... ' There are elephants....