1.什么是shell脚本:
shell处于linux内核与用户之间,是命令编译器;用户写shell命令,交给shell编译成二进制,再传递给内核执行;内核执行完后,返回的二进制结果交给shell,shell翻译成用户可以识别的语言,交给用户;
shell脚本是shell命令组成的文本文件。
2.shell注释:
单行注释:#
多行注释::<<EOF
EOF(随便写EOF,只要前后对应就行)
3.知乎连接:
4.变量
会话变量
局部变量(只在当前shell脚本中可用)
环境变量(所有shell脚本都可用)
shell变量(shell程序设置的特殊变量)
5. 变量操作
创建:name=“test”(=两边不可有空格)
使用变量:echo $name 或者 echo
n
a
m
e
推
荐
使
用
大
括
号
;
双
引
号
里
里
可
以
调
用
变
量
而
不
被
当
成
字
符
串
,
和
j
a
v
a
不
一
样
。
常
量
:
r
e
a
d
o
n
l
y
a
注
销
变
量
名
:
u
n
s
e
t
a
不
支
持
浮
点
运
算
,
需
要
a
−
b
∣
b
c
来
支
持
作
用
范
围
:
脚
本
里
的
变
量
只
在
该
脚
本
里
有
用
,
e
x
p
o
r
t
能
导
出
来
6.
字
符
串
变
量
单
引
号
:
v
a
r
=
′
t
e
s
t
′
单
引
号
里
不
能
使
用
变
量
双
引
号
:
v
a
r
=
"
t
e
s
t
"
双
引
号
里
可
以
使
用
变
量
{name} 推荐使用大括号;双引号里里可以调用变量而不被当成字符串,和java不一样。 常量:readonly a 注销变量名:unset a 不支持浮点运算,需要a-b|bc来支持 作用范围:脚本里的变量只在该脚本里有用,export能导出来 6. 字符串变量 单引号:var='test' 单引号里不能使用变量 双引号:var="test" 双引号里可以使用变量
name推荐使用大括号;双引号里里可以调用变量而不被当成字符串,和java不一样。常量:readonlya注销变量名:unseta不支持浮点运算,需要a−b∣bc来支持作用范围:脚本里的变量只在该脚本里有用,export能导出来6.字符串变量单引号:var=′test′单引号里不能使用变量双引号:var="test"双引号里可以使用变量{name}和转义字符
拼接字符串:两个变量直接放到一起就行:“aaa”“bbb"或者’aaa’‘bbb’
获取字符串长度:echo ${#name} 输出结果为4
提取字符串:1:4从第2个字符开始,提取四个echo
n
a
m
e
:
1
:
4
查
找
:
e
c
h
o
‘
e
x
p
r
i
n
d
e
x
"
{name:1:4} 查找:echo `expr index "
name:1:4查找:echo‘exprindex"{name}” params (最外层有反引号,按字母匹配不是全匹配,返回数字)
汉子UTF8和GBK的字符数3或者2
::4 从第一个字符开始,往后截取4个字符echo ${name::4}
数组:
定义数组:array_name=(zhao qian sun li)
数组赋值:array_name[0]=“zhao”
数组变量的使用:#{array_name[0]}
数组全打印:echo ${a[@]}或者echo ${a[*]}
read参数传递
#!/bin/bash
echo ‘请输入数字:’
read a
echo ${a}
结果:
[root@hadoop8 lcs]# ./ceshi.sh
请输入数字:
25
25
布尔型赋值
read a(读取参数)
$0:控制台输入的指令
运算符
1.算数运算符:+ - * / (乘号前需要\转义)需要用expr支持,expr后的算式要加空格val=expr 2 + 2
(最外层有反引号)
2.数学关系运算符(只 + 支持数字):-
-eq:检测两个数字是否相等
-ne:不相等
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
3.字符串运算符
=:检测两个字符串是否相等
!=:不相等
-z:是否为空
-n:是否为非空
$:是否为非空
4.布尔运算符
-a:与
-o:或
!:非
5.逻辑运算符
&&:逻辑and
||:逻辑or
6.文件运算符
-d:检测文件是否为目录directory
-f:检测文件是否为普通文件
-w:是否可写
-r:是否可读
-x:是否可执行
-s:是否为空文件
-e:目录是否存在
流程控制语句
if语句:
if codition then command elif condition then command else condition fi
(括号的用法)添加链接描述
(方括号内各元素之间要加空格)
if test 后面就不用中括号了
case语句:
case 值 in 模式1) command1;;模式2) command2;;*) command3;;esac
(;;可以用break代替,但是break会跳出case外面的while等循环)
while condition do command done
例如:
i=1
while ((i<5))
do
自增:let i++
echo ${i}
done
until condition do command done
for(四种,举例)
类C语句:for((integer=1;integer<5;integer++) )do command done
列表:for variable in 1 2 3 4 5 do command done
或者for variable in {1…5} do command done
(类似增强for循环:
for i in ${a[@]}
do
echo $i
done
)
无列表:for argument do command done(argument需要用户指定值,否则不执行循环体)
括号的用法
(括号的用法)添加链接描述
(方括号内各元素之间要加空格)
if test 后面就不用中括号了
单引号:‘’ 引用字符串,不能包含变量;
双引号:“” 引用字符串,里面可以包含变量;定义变量;
单小括号:() 数组赋值;
单中括号:[] 条件判断
单大括号:{} 包含一段语句块
反引号``、$():命令替换
[
]
、
(
(
)
)
、
[]、(())、
[]、(())、(()):算数运算
双中括号[[]]:逻辑运算
${}:变量替换
编写shell脚本
创建aa.sh脚本:vi aa.sh
首行:#!bin/env bash
for value
do
echo hello
done
保存退出
赋予权限:chmod +x 文件名
执行./aa.sh
不执行循环
执行./aa.sh a b c
执行结果:hello hello hello
shell脚本输入
$1-9是输入几个数,超过10要用{};
$# 传递到脚本的参数个数;
$* 以一个字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID
$@ 显示所有输入的参数
$? 显示最后命令的退出状态,0代表没有错误,其它代表出错
Shell函数(shell脚本相当于函数,shell内部的函数不常用)
[ fuction ] funname[ () ]{
action
return xx
}
Crontab定时任务(以后会用到)
创建格式:***** sh 可执行文件(比如shell脚本)输出到指定文件里
说明:(分时日月周)定时执行该文件,如果有输出的话,放到指定文件里
15**** sh opt/test/func.sh > opt/test/a.txt
(每个小时的15分,func.sh执行的输出结果写入到a.txt里)
crontab [ -u username]
crontab -r 删掉该定时任务(不用的话必须删掉,不然一致执行。关机不执行)