bash shell编程的基本概念
- 程序流程控制
- 函数和过程
- 深入文件重定向
1.程序流程控制
- if 条件测试;then
- 命令内容
- elif 条件测试2;then
- 语句
- else
- 命令内容
- fi
条件测试的写法
- 关键字[ [ ] ]表达式
- 判断式放回0为真,非0为假
- 内置命令test或[ ]
- 内的逻辑表达式参数-a、-o
- 命令间逻辑表达式符号&、||
几个常用判断符号: -gt(大于)!(不等于,取反) -n(是否为空)
if条件测试
[root@master xiaosi]# if [ -n $a ];then echo ok; else echo fail;fi
ok
[root@master xiaosi]# echo $a
[root@master xiaosi]# if [ ! 2 -gt 1 ];then echo ok; else echo fail;fi
fail
man test 出来的的用法说明
普通术语比较
//!表示取反
EXPRESSION1 **-a** EXPRESSION2
both EXPRESSION1 and EXPRESSION2 are true
//表达式1和表达式2为真
EXPRESSION1 **-o** EXPRESSION2
either EXPRESSION1 or EXPRESSION2 is true
//表达式1或达式2为真
**-n** STRING
the length of STRING is nonzero
//字符长度是否为0
STRING equivalent to -n STRING
**-z** STRING
the length of STRING is zero
//字符长度是否为0
STRING1 **=** STRING2
the strings are equal
//字符长度是否相等
STRING1 **!=** STRING2
the strings are not equal
//字符长度是否不相等
INTEGER1 **-eq** INTEGER2
INTEGER1 is equal to INTEGER2
//字符长度是否相等
INTEGER1 **-ge** INTEGER2
INTEGER1 is greater than or equal to INTEGER2
//大于等于号
INTEGER1 **-gt** INTEGER2
INTEGER1 is greater than INTEGER2
//大于号
INTEGER1 **-le** INTEGER2
INTEGER1 is less than or equal to INTEGER2
//小于等于号
INTEGER1 **-lt** INTEGER2
INTEGER1 is less than INTEGER2
//小于号
INTEGER1 **-ne** INTEGER2
INTEGER1 is not equal to INTEGER2
//不等于号
两个文件比较判断:
FILE1 **-ef** FILE2
FILE1 and FILE2 have the same device and inode numbers
//文件1比文件2有相同的设备和节点号
FILE1 **-nt** FILE2
FILE1 is newer (modification date) than FILE2
//两个文件比较新
FILE1 **-ot** FILE2
FILE1 is older than FILE2
//两个文件比较老
单个文件判断:
-b FILE
FILE exists and is block special
-c FILE
FILE exists and is character special
**-d** FILE
FILE exists and is a directory
// 判断文件是否为目录
**-e** FILE
FILE exists
// 判断文件是否为空
-f FILE
FILE exists and is a regular file
//路径下是否有这个文件 如:[-f ./file]
-g FILE
FILE exists and is set-group-ID
-G FILE
FILE exists and is owned by the effective group ID
-h FILE
FILE exists and is a symbolic link (same as -L)
-k FILE
FILE exists and has its sticky bit set
-L FILE
FILE exists and is a symbolic link (same as -h)
-O FILE
FILE exists and is owned by the effective user ID
-p FILE
FILE exists and is a named pipe
-r FILE
FILE exists and read permission is granted
//文件是否可读
-s FILE
FILE exists and has a size greater than zero
-S FILE
FILE exists and is a socket
-t FD file descriptor FD is opened on a terminal
-u FILE
FILE exists and its set-user-ID bit is set
-w FILE
FILE exists and write permission is granted
//文件是否可写
-x FILE
FILE exists and execute (or search) permission is granted
//文件是否可执行
例子:
[root@master xiaosi]# if [ ! 2 -gt 1 ] || [ 1 -eq 1 ];then echo ok; else echo fail;fi
ok
[root@master xiaosi]# if [ ! 2 -gt 1 ] && [ 1 -eq 1 ];then echo ok; else echo fail;fi
fail
[root@master xiaosi]# if [ ! 2 -gt 1 -a 1 -eq 1 ];then echo ok; else echo fail;fi
fail
[root@master xiaosi]# if [ ! 2 -gt 1 -o 1 -eq 1 ];then echo ok; else echo fail;fi
ok
[root@master xiaosi]# ls
file foo1.sh foo2.sh foo3.sh foo4.sh foo.out foo.sh if.sh sh1.sh xiaosi xiaosi1
[root@master xiaosi]# if [ -x ./foo3.sh ] ;then echo ok;else echo fail;fi
ok
[root@master xiaosi]# echo $?
0
[root@master xiaosi]# if [ 1 -eq $? ];then echo ok ;else echo fail;fi
fail
[root@master xiaosi]# if [ 0 -eq $? ];then echo ok ;else echo fail;fi
ok
case语法
-
case 测试 in
-
样式串行 命令区域1;;
-
…
-esac -
样式 = 字符串 + 通配符 (区分大小写)
-
几行的话要隔开
-
字符 | 有 " 或 ”的意思
例子:
[root@master xiaosi]# vi case.sh
#!/bin/sh
read -p "Input A=" A
case $A in
a | b )
echo "\$A = a | b ";;
aa | bb | BB )
echo "\$A = aa | bb | BB"
echo "$A--end" ;;
a* | b* | B* | A* )
echo "\$A = $A" ;;
*)
echo 'imput *';;
esac
[root@master xiaosi]# bash case.sh
Input A=a
$A = a | b
[root@master xiaosi]# bash case.sh
Input A=aa
$A = aa | bb | BB
aa--end
[root@master xiaosi]# bash case.sh
Input A=a
$A = a | b
[root@master xiaosi]# bash case.sh
Input A=a8^H
$A = a8
[root@master xiaosi]# bash case.sh
Input A=k
imput *
[root@master xiaosi]# vi case.sh
#!/bin/sh
echo "\$A = $1"
A=$1
case $A in
a | b )
echo "\$A = a | b ";;
aa | bb | BB )
echo "\$A = aa | bb | BB"
echo "$A--end" ;;
a* | b* | B* | A* )
echo "\$A = $A" ;;
*)
echo 'imput *';;
esac
[root@master xiaosi]# bash case.sh
$A =
imput *
[root@master xiaosi]# bash case.sh a
$A = a
$A = a | b
[root@master xiaosi]# bash case.sh aa
$A = aa
$A = aa | bb | BB
aa--end
[root@master xiaosi]# bash case.sh b
$A = b
$A = a | b
for循环:
步骤:
- for 变量 in 内容
- do
- 命令
- done
例子:
运用{1…10}遍历
[root@master xiaosi]# for a in {1..10};do echo $a;done
1
2
3
4
5
6
7
8
9
10
运用seq 1 10
[root@master xiaosi]# for a in $(seq 1 10);do echo $a;done
1
2
3
4
5
6
7
8
9
10
类似c的循环方式((i= 0;i<$num ;i++))
[root@master xiaosi]# for (( i = 1 ;i < 10 ; i++ ));do echo $i;done
1
2
3
4
5
6
7
8
9
用*删除文件问开头问a的文件:
[root@master xiaosi]# for i in a* ; do rm -rf $i;done
while控制流程:
- whlie
- do
- 命令行
- done
[root@master xiaosi]# while [ ! "$String" = "exit" ] ; do echo $String ]; read -p "input String:" String ;done
b ]
input String:a
a ]
input String:b
b ]
input String:c
c ]
input String:d
d ]
input String:exit
[root@master xiaosi]# while read line ; do echo $line ; done
abc
abc
abf
abf
^C #ctrl +c 退出
[root@master xiaosi]#
从文件读取;
[root@master xiaosi]# while read line ; do echo "line=" $line;sleep 1 ; done < /etc/passwd
line= root:x:0:0:root:/root:/bin/bash
line= bin:x:1:1:bin:/bin:/sbin/nologin
line= daemon:x:2:2:daemon:/sbin:/sbin/nologin
line= adm:x:3:4:adm:/var/adm:/sbin/nologin
line= lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
line= sync:x:5:0:sync:/sbin:/bin/sync
line= shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
^C
[root@master xiaosi]#
util循环
与while条件不同的式,while测真值,until测假值。
- until 条件
- do
- 命令内容
- done
break 和continue(和C语言一眼用法)
[root@master xiaosi]# vi fooo.sh
#!/bin/sh
for i in {0..10} ;do
for j in {0..10};do
for n in {0..10};do
echo \$=$i \$=$j \$n=$n
read -p "input a" a
case $a in
1 ) break 1 ;;
2 ) break 2 ;;
* ) break : ;;
esac
done
echo $j............
done
echo $n .........
done
~
~