Shell基础
查看Shell
# 查看当前系统所有shell
cat /etc/shells
# 查看当前使用的shell
echo $SHELL
定时任务
定时命令
# 编辑定时任务
crontab -e
# 查看定时任务
crontab -l
# 指定用户
crontab -u root -e
任务格式
#分钟 小时 天 月 周 命令
* * * * * sh /tmp/test.sh
# 每月 每天 每小时 每分钟执行一次命令
* * * * * sh /tmp/test.sh
# 每月 每天 每个 30分钟执行一次命令
*/30 * * * * sh /tmp/test.sh
# 每月 每天 凌晨3.00执行一次命令
0 3 * * * sh /tmp/test.sh
# 每月 15日 30日 凌晨3.00执行一次命令
0 3 15,30 * * sh /tmp/test.sh
# 每月 周三 周日 凌晨3.30执行一次命令
30 3 * * 3,0 sh /tmp/test.sh
# 输出日志到指定文件 2>&1表示错误日志和标准日志一样输出
*/30 * * * * sh /tmp/test.sh >> /tmp/test.log 2>&1
开启日志
Shell脚本
Shell变量
命名规则
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线_
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
变量实例
# 单行注释
:<<EOF
多行注释...
多行注释...
多行注释...
EOF
# 定义变量
test="hello,world!"
# 使用变量
echo $test
echo ${test}
# 只读变量
readonly anon
# 删除变量
unset anon
字符串
""
(双引号)里可以有变量和转义字符''
(单引号)里的任何字符都会原样输出字符串实例
# 定义字符串
test="hello"
# 双引号拼接
hello1="hello, "${test}""
# 单引号拼接
hello2='hello, '$test''
# 获取字符串长度
echo ${#test} #输出5
# 提取字字符串
echo ${test:1:3} #输出ell
# 查找子字符串
echo `expr index "$test" l` #输出2
数组
bash
支持一维数组- 数组元素的下标由
0
开始 数组实例
# 定义数组
test=(1,2,3,4)
# 读取数组单个元素
echo ${test[0]} #输出1
# 读取数组所有元素
echo ${test[@]} #输出1,2,3,4
# 获取数组元素的个数
echo ${#test[@]} #输出4
echo ${#test[*]} #输出4
# 获取数组单个元素的长度
echo ${#test[n]} #输出1
Shell参数传递
参数处理
特殊字符 | 说明 |
---|---|
$0 | 执行的文件名 |
$n | 第n个参数 |
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$* 相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set s命令功能相同 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
参数实例
# 执行的文件名
echo "$0"
# 第一个参数
echo "$1"
# 第二个参数
echo "$2"
# 参数的个数
echo "$#"
# 所有参数
echo "$*"
Shell运算符
Shell支持多种运算符
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
算数运算符
expr
是一款表达式计算工具,使用它能完成表达式的求值操作。
# 定义变量
a=10
b=5
# 计算 a+b
echo `expr $a + $b` #返回15
# 计算 a*b
echo `expr $a \* $b` #返回15
# 比较 a是否等于b
echo `expr $a != $b` #返回1为true
Shell流程控制
IF Else判断
if
开头fi
结尾- 流程控制不能为空
IF Else 实例
a=10
b=20
# []写法
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
# (())写法
if (( $a == $b ))
then
echo "a 等于 b"
elif (( $a > $b ))
then
echo "a 大于 b"
elif (( $a < $b ))
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
for循环
in
列表可以包含数字、字符串、文件名For循环实例
# 循环输出列表中的数字
for loop in 1 2 3
do
echo "The value is: $loop"
done
# 输出内容
The value is: 1
The value is: 2
The value is: 3
# 顺序输出字符串中的字符
for str in I LOVE YOU
do
echo $str
done
# 输出内容
I
LOVE
YOU
While循环
- 条件为
true
时循环 - 一般用于从输入文件中读取数据
While循环实例
- 条件为
# 循环打印int
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
# 无限循环
while true(可选):
do
command
done
Until循环
- 条件为
true
时停止 - 和
while
相反 Until循环实例
- 条件为
# 判断a是否小于10否则一直输出
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
Case...Esac语句
- 多选择语句
- 右圆括号
)
开始 - 两个分号
;;
结束表示break
Case...Esac循环实例
echo '输入数字:'
# 键盘输入
read aNum
# 判断
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
# 无匹配用 * 捕捉
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
跳出循环
# 跳出所有循环
break
# 跳出当前循环
continue