1.运行shell脚本的两种方法
# 第一种
chmod +x 路径(使用文件有执行权限)然后 ./路径
# 第二种
/bin/sh 路径(sh可以是其它编译器)
2.shell变量
a.定义变量:
- 变量名和=号之间不能有空格
- 必须以字母开头
- 不能使用bash里的关键字
- 其它同其它高级语言
b.使用变量:
在变量面前加一个 或 者 或者 或者{}符号即可
最好使用 ${} 这种形式
c.只读变量
myurl="www.baidu.com"
# 使用readonly 将变量设置为只读
readonly myurl
d.删除变量unset
# 不能删除只读变量
unset 变量名
# unset后再取值原变量不会报错,会输出空白
3.字符串
a.字符串定义
- 使用单引号和双引号即可定义字符串,单引号内不能出现单引号,双引号内可以出现转义字符,变量等
b.字符串操作
- 获取长度:在使用变量前加#,如 s=‘test’ echo ${#s} 输出为4
- 提取子串:同python字符分割,如 echo ${m:0:4}即取出m变量的0到4位组成的字符串
- 查找子串个数:
expr index ”$变量“ 子串
最外层为反引号,使用数字1左边键可打出
c.截取子串
- expr命令
- cut命令(主要用于命令输出)
cut option args
# cut -c n1-n2 截取从第n1到n2的字符,从1开始
echo test | cut -c 1-3
#输出
tes
# -d "分隔符" -f 取第几列
# 列是从0开始
echo "test test1 test2 test3" | cut -d " " -f 2
# 输出
test1
- ${}表达式,也可以执行替换操作
expr substr $var1 起始位置 截取长度
#例
var1="centos6.5"
expr substr $var1 1 6
#输出
centos
d.路径分割
- dirname
# 提取路径最后一个/前的路径
$ dirname testdir/testdir2/testdir3
#输出
testdir/testdir2
$ dirname testdir/testdir2/testdir3/test.txt
#输出
testdir/testdir2/testdir3
- basename
#与dirname相反,提取路径最后一个/后的名称
$ basename testdir/testdir2/testdir3/test.txt
# 输出
test.txt
$ basename testdir/testdir2/testdir3
#输出
testdir3
4.数组
不支持多维,只支持一维数组
a.定义数组
数组名=(值1 值2 值3 …)如a=(‘a’ ‘b’ ‘c’),不需要定义数组大小
b.读取数组
${数组名[下标]},当下标为@时,为读取所有数据
c.获取数组长度
- ${#a[@]}
- ${#a[*]}
- 单个元素的长度:${#a[下标]}
$ a=(1 2 3 4 5)
$ echo ${a[@]}
#输出
1 2 3 4 5
$ echo ${#a[@]}
5
$ echo ${#a[*]}
5
5.注释
使用#单行注释
如下方式实现多行注释
```bash
:<<EOF 注释内容… 注释内容… 注释内容… EOF EOF可以换成其它字符
```
6.传递命令行参数
- 脚本内使用$n来获取命令行参数,n从0开始,0为运行的文件名称
- $# 传递到脚本的参数个数
- $* 字符串形式输出所有参数
- $$ 脚本的进程号
- $! 后台运行的最后一个进程号
- @ 与 @ 与 @与*相同,*是将所有参数输出为一个字符串,@将所有参数分别输出多个字符串
- $- 显示shell使用的当前选项
- $? 显示退出状态
7.运算符
expr 是一款表达式计算工具,使用它能完成表达式的求值操作
a.算术运算符
expr $a 运算符 $b
如expr $a + $b
- 运行符与变量之间要有空格
- 乘号的写法为 *
b.比较运算符
- 需要用[]括起来,方括号也要有空格,且符号两边需要有空格
- 如[ $a == $b ],[ $a != $b ]
c.关系运算符
- 只支持数字,不支持字符串,除非字符串为全数字
- -eq 判断两数是否相等 如
expr [$a -eq $b]
判断a是否等于b - -ne 判断两数是否不相等,不相等则返回true
- - -gt 大于,
expr [$a -gt $b]
a小于b就返回true - - -lt 小于
- - -ge 大于等于
- - -le 小于等于
d.字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否为0,不为0返回 true。 | [ -n “$a” ] 返回 true。 |
$ | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
e.文件测试运算符
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
其他检查符:
-S: 判断某文件是否 socket。
-L: 检测文件是否存在并且是一个符号链接。
8.流程控制
a.test用法
test是shell环境中测试条件表达式的实用工具,返回True or False
# test需要和上方的运算符配合使用
if的条件如果使用比较运算符,需要加[],且两边需要加空格
如果使用test则不需要加[]
if test -d ./testdir;
then
echo "is dir"
else
echo "not dir"
fi
a=10
b=2
if [ $a == $b ];
then
echo "=="
b. if 语句
if 条件;then
command1
command2
elif [条件];then
conmand3
command4
else
command5
fi
实例
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi
#输出
两个数字相等
c.for语句
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
#或者
for((i=1;i<=5;i++));do
echo "这是第 $i 次调用";
done;
d.while语句
while 条件
do
command
done
let命令
# 同python java中的自增自减
a=1
let a++ #a=2
a=1
let a+=3 #a=4
let a=5+5 #a=10
e.case语句
case val in
val1)
command
;;
val2)
command
;;
val3)
command
;;
*) #其它选项
command
;;
esac
9.函数
返回状态值 $?为0则表示前一条命令执行成功
$? 只对上一条执行的命令负责,所以在调用函数后最好立即将值保存到变量中,防止函数返回值被改
定义函数
demo(){
commands
return val # 使用 $? 来获取最近调用函数的返回值,只对上一条执行的命令负责
}
调用函数
echo "start"
demo
echo "end"
调用函数不需要加括号
参数传递
同命令行的参数传递,不需要在函数定义时定义参数
# test.txt
test(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
test $@
$ ./test.txt 1 2 3 4 5 6 7 8 9 10 11
#输出
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 10 !
第十一个参数为 11 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 10 11 !