1、shell脚本的命名: ****.sh
注释:# this is comment
#!/bin/bash 注意这句不是注释
2、变量
1)、自定义变量:name=zhy
获取变量:#echo $name echo $PATH
2)、解析变量{}
用{}将变量括起来会让系统知道括号中的是一个变量,类似php
name=lisi
Echo {$name} hello
3) 、作用域:
a) 对于普通的变量来说它的作用域只在与当前的层,如果想设置一个变量为全局的变量如下:export关键字设置全局变量
不用export定义的变量只对该shell有效,对子shell也是无效的。export用于bash环境
export name=lisi
保存linux中的所有的shell目录
#/etc/shells
手动开启shell
#/bin/bash
获取shell的层级
#echo $SHLVL
3、输入输出
> >> 输出
< << 输入
<<:制定终止的符号
#cat < &0 表示接受来自键盘的输入
#cat < file 表示接受来自文件的输入
输入输出描述符:
输入:键盘 0
输出:屏幕 1
错误输出: 2
在linux中 /dev/null----虚拟出来的一个字符设备,它可以将你产生的错误回收处理,可以将产生的错误信息输入到该文件,不输出到屏幕上
cat<<END
表示在输入时直到出现END输入自动结束
cat<<END >file
例:
向file文件输入内容,直到输入END退出
read变量值的分配
read a b
1 2 3
这时$a = 1 $b=2 3
read a b c
1 2
这时$a = 1 $b=2 $c=””
每个声明的变量会以你输入的值的中间的空格一个一个的分配给声明的变量,
直到最后一个无论剩下几个值都给将他们拼合到一起给最后一个变量
可作为条件判断的一个变量 $?
$?------表示显示最近一条命令的执行状态
退出状态0:表示成功
退出状态1:表示失败
#ls –l
#echo $? 0
#LS –l
#echo $? 1
$#:参数的总的数量
$*:显示所有参数
$1……$9 这里只能到$9 $10是不存在的等于$1 如果想看到$10的值就需要shift了
shift [n]:将参数向前移n位
默认不加参数会执行一次向前移动一位
看下面两个例题;
1)、Shell脚本
Vi/home/file1.sh
#!/bin/bash
echo"$#:"$#
echo '$*:'$*
echo '$1:'$1
echo"$9:"$9
调用脚本
Vi /home/file2.sh a b c d e f h j
$# 9
$* a b c d e f h j
$1 a
$2 b
.......
$9
2)、 Shell脚本
while ["$#" -gt 0 ]
do
echo $*
shift
done
调用
$ test 1 2 3 4 5 6 7 8 9 0
1 2 3 4 5 6 7 8 9 0
2 3 4 5 6 7 8 9 0
3 4 5 6 7 8 9 0
4 5 6 7 8 9 0
5 6 7 8 9 0
6 7 8 9 0
7 8 9 0
8 9 0
9 0
0
4、测试命令[]和test
test 操作数1 操作符 操作数2
test 1>2
参数:
-a 相当于and
-o 相当于or
测试命令分类
(1)数值类型数据比较
int1 -eq int2 如果 int1 等于 int2,则为真
int1 -ge int2 如果 int1 大于或等于 int2,则为真
int1 -gt int2 如果 int1 大于 int2,则为真
int1 -le int2 如果 int1 小于或等于 int2,则为真
int1 -lt int2 如果 int1 小于 int2,则为真
int1 -ne int2 如果 int1 不等于 int2,则为真
(2)字符串类型数据比较
String 如果string的长度不为零则值为true
-z string 如果string的长度为零则值为true
Str1=str2 如果str1和str2的长度相等为true
Str1!=str2 如果str1和str2的长度不相等为true
(3)文件类型数据比较
-b file 如果文件为一个块特殊文件,则为真
-c file 如果文件为一个字符特殊文件,则为真
-d file 如果文件为一个目录,则为真
-e file 如果文件存在,则为真
-f file 如果文件为一个普通文件,则为真
-g file 如果设置了文件的 SGID 位,则为真
-G file 如果文件存在且归该组所有,则为真
-k file 如果设置了文件的粘着位,则为真
-O file 如果文件存在并且归该用户所有,则为真
-p file 如果文件为一个命名管道,则为真
-r file 如果文件可读,则为真
-s file 如果文件的长度不为零,则为真
-S file 如果文件为一个套接字特殊文件,则为真
-t fd 如果 fd 是一个与终端相连的打开的文件描述符(fd 默认为 1),则为真
-u file 如果设置了文件的 SUID 位,则为真
-w file 如果文件可写,则为真
-x file 如果文件可执行,则为真
[ ] 命令 [ -f file1 ] 注意中括号中括号前后加空格
5、计算
expr 表达式
expr 3 \* 3正确,数值与表达式要分开,表达式要转义
expr 3\*3 错误
$((…..)) echo $((3*3))
需要echo,否则报错bash: 9: command not found
6、流程控制结构
If:
If 条件
Then
执行命令
Elif 条件
Then
。。。
Else
。。。
Case语句
语法
Case 值 in
模式1|模式3) 1) 1|2|3)
命令1
。。。
。。。。
;;
模式2)
Esac
提醒:模式里可以使用通配符
for循环
语法:
for 变量名 in 列表
do
命令1
。。。
done
until
until 条件
do
命令。。。。。
done
while
while 条件
do
命令
done
break:终止当前循环
contine:终止当前次循环