shell是用户和linux操作系统沟通的桥梁,linux的shell种类很多,这里学习的是用的最多的bash。
文件名通常是.sh后缀。
#!bin/bash
#是注释
a.sh
这样的话需要保证脚本具有执行权限并且在环境变量PATH中有(.),这样在执行的时候会先从当前目录查找
./a.sh
只要保证这个脚本具有执行权限即可
/usr/local/a.sh
只要保证这个脚本具有执行权限即可
bash a.sh
直接可以执行,甚至这个脚本文件中的第一行都可以不引入/bin/bash,它是将hello.sh作为参数传给bash命令来执行的
bash的单步执行
bash -x /path/to/aa.sh
bash语法检查
bash -n /path/to/aa.sh
变量不需要声明,初始化不需要指定类型
变量命名
1:只能使用数字,字母和下划线,且不能以数字开头
2:变量名区分大小写
3:建议命令要通俗易懂
注意:变量赋值是通过等号(=)进行赋值,在变量、等号和值之间不能出现空格。
显示变量值使用echo命令(类似于java中的system.out) ,加上
变
量
名
,
也
可
以
使
用
变量名,也可以使用
变量名,也可以使用{变量名}
例如:echo $JAVA_HOME
或者echo ${JAVA_HOME}
对于变量:
本地变量
环境变量
局部变量
位置变量
特殊变量
本地变量:
只对当前shell进程有效,对当前进程的子进程和其它shell进程无效。
定义:VAR_NAME=VALUE
变量引用:${VAR_NAME}
取消变量:unset VAR_NAME
相当于java中的私有变量(private),只能当前类使用,子类和其他类都无法使用。
环境变量:
自定义的环境变量对当前shell进程及其子shell进程有效,对其它的shell进程无效
定义:export VAR_NAME=VALUE
对所有shell进程都有效需要配置到配置文件中
vi /etc/profile
source /etc/profile
相当于java中的protected修饰符,对当前类,子孙类,以及同一个包下面可以共用。
和windows中的环境变量比较类似
局部变量:
在函数中调用,函数执行结束,变量就会消失
对shell脚本中某代码片段有效
定义:local VAR_NAME=VALUE
相当于java代码中某一个方法中定义的局部变量,只对这个方法有效。
位置变量:
$1,$2,…$10…
test.sh 3 89
$0:脚本自身
$1:脚本的第一个参数
$2:脚本的第二个参数
相当于java中main函数中的args参数,可以获取外部参数。
特殊变量:
$?:接收上一条命令的返回状态码
返回状态码在0-255之间
$#:参数个数
∗
:
或
者
*:或者
∗:或者@:所有的参数
$$:获取当前shell脚本的进程号(PID)(可以实现脚本自杀)(或者使用exit命令直接退出也可以 exit [num])
''单引号不解析变量
echo '
c
r
x
y
′
"
"
双
引
号
会
解
析
变
量
e
c
h
o
"
crxy' ""双引号会解析变量 echo "
crxy′""双引号会解析变量echo"crxy"
``反引号是执行并引用一个命令的执行结果,类似于
(
.
.
.
)
e
c
h
o
‘
(...) echo `
(...)echo‘crxy`
for循环:
#!/bin/bash
for((i=0;i<10;i++))
do
echo $i
done
#!/bin/bash
for i in 0 1 2 3 4 5 6 7 8 9
do
echo $i
done
#!/bin/bash
for i in {0…9…2}
do
echo $i
done
bash条件测试:
格式:
test EXPR
[ EXPR ]:注意中括号和表达式之间的空格
整型测试:
-gt:大于:例如[ $num1 -gt $num2 ]或者test $num1 -gt
n
u
m
2
−
l
t
:
小
于
−
g
e
:
大
于
等
于
−
l
e
:
小
于
等
于
−
e
q
:
等
于
−
n
e
:
不
等
于
字
符
串
测
试
:
=
:
等
于
,
例
如
判
断
变
量
是
否
为
空
[
"
num2 -lt:小于 -ge:大于等于 -le:小于等于 -eq:等于 -ne:不等于 字符串测试: =:等于,例如判断变量是否为空 [ "
num2−lt:小于−ge:大于等于−le:小于等于−eq:等于−ne:不等于字符串测试:=:等于,例如判断变量是否为空["str" = “” ] 或者[ -z $str ]
!=:不等于
while语句:
#!/bin/bash
while [ $1 -eq 2 ]
do
echo yes
sleep 1
done
if 语句:
#!/bin/bash
if [ $1 -eq 1 ]
then
echo one
fi
#!/bin/bash
if [ $1 -eq 1 ]
then
echo one
elif [ $1 -eq 2 ]
then
echo two
elif [ $1 -eq 3 ]
then
echo three
else
echo none
fi
date:
显示当前时间
格式化输出 +%Y-%m-%d
格式%s表示自1970-01-01 00:00:00以来的秒数
指定时间输出 --date=‘2009-01-01 11:11:11’
指定时间输出 --date=‘3 days ago’
read命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。
格式
read VAR_NAME
read如果后面不指定变量,那么read命令会将接收到的数据放置在环境变量REPLY中
read -p “Enter your name:” VAR_NAME
read -t 5 -p “enter your name:” VAR_NAME
read -s -p "Enter your password: " pass
获取长度:${#VAR_NAME}
字符串截取
v
a
r
i
a
b
l
e
:
o
f
f
s
e
t
:
l
e
n
g
t
h
或
者
{variable:offset:length}或者
variable:offset:length或者{variable:offset}
取尾部的指定个数的字符
v
a
r
i
a
b
l
e
:
−
l
e
n
g
t
h
:
注
意
冒
号
后
面
有
空
格
大
小
写
转
换
小
−
−
>
大
:
{variable: -length}:注意冒号后面有空格 大小写转换 小-->大:
variable:−length:注意冒号后面有空格大小写转换小−−>大:{variable^^}
大–>小:${variable,}
标准输入、输出、错误可以使用文件描述符0、1、2引用
使用重定向可以把信息重定向到其他位置
ls >file 或者 ls 1>file(ls >>file)
lk 2>file(lk是一个错误命令)
ls >file 2>&1
ls > /dev/null(把输出信息重定向到无底洞)
例子:nohup command >/dev/null 2>&1 &
在脚本后面加一个&
test.sh &
这样的话虽然可以在后台运行,但是当用户注销(logout)或者网络断开时,终端会收到Linux HUP信号(hangup)信号从而关闭其所有子进程
nohup命令
不挂断的运行命令,忽略所有挂断(hangup)信号
使用nohup test.sh &
nohup会忽略进程的hangup挂断信号,所以关闭当前会话窗口不会停止这个进程的执行。
nohup会在当前执行的目录生成一个nohup.out日志文件
linux下的定时任务
编辑使用crontab -e
一共6列,分别是:分 时 日 月 周 命令
查看使用crontab -l
删除任务crontab -r
查看crontab执行日志
tail -f /var/log/cron
必须打开rsyslog服务cron文件中才会有执行日志(service rsyslog status)
查看cron服务状态
service crond status
启动cron服务
service crond start
vi常用的命令:
查找字符串
/string
查找下一个,按“n”即可
查找某一行
:10(直接跳转到第10行)
复制粘贴
yy(复制当前行)
2 yy(从当前行开始,复制2行)
p(粘贴)
删除
dd(删除当前行)
跳到文件最后一行
G