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使用的当前选项,与sets命令功能相同
$?显示最后命令的退出状态。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