前言
Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理,
Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。
Shell是运维工程师最基础也是最常用脚本语言,可以大大的提高批处理效率。当然,随着技术的发展,新生了更多批处理工具,如ansible,当然也包含当下大热的Python。
一、常用的shell小知识
变量
自定义变量:直接定义,只在当前shell才能生效
环境变量:export加变量,在所有shell中生效
如果 1.sh 要使用 2.sh 里面的变量,可直接在 1.sh 中添加 source 2.sh
或者 .2.sh
位置变量:
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
预定义变量:
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值 0 表示成功
字符串长度判断
*注:使用-z 或-n 判断字符串长度时,变量要加双引号*
[ -z "$a" ] # 字符串长度为0
[ -n "$a" ] # 字符串长度不为0
字符串截取
abc="abc-123-df-11-192.168.1.1"
echo "${abc#*-}" # 左边最小匹配(截取出较长部分)
123-df-11-192.168.1.1
echo "${abc##*-}" # 左边最大匹配(截取出较短部分)
192.168.1.1
echo "${abc%-*}" # 右边最小匹配
abc-123-df-11
echo "${abc%%-*}" # 右边最大匹配
变量判断、赋值
${varia-value} :假如$varia没有设定,则使用value作传回值。(空值及非空值时不作处理)
${varia:-value} :假如$varia没有设定或为空值,则使用value作传回值。(非空值时不作处理)
${varia+value} :假如$varia设为空值或非空值,均使用value作传回值。(没设定时不作处理)
${varia:+value} :若$varia为非空值,则使用value作传回值。(没设定及空值时不作处理)
${varia=value} :若$varia没设定,则使用value作传回值,同时将$varia赋值为value 。(空值及非空值时不作处理)
${varia:=value} :若$varia没设定或为空值,则使用value作传回值,同时将$varia赋值为value 。(非空值时不作处理)
${varia?value} :若$varia没设定,则将value输出出至STDERR。(空值及非空值时不作处理)
${varia:?value} :若$varia没设定或为空值,则将value输出至STDERR。(非空值时不作处理)
整数运算
$[]
小数运算:bc工具
echo 'scale=2;10/3' |bc # 用 scale 保留两位小数点
expr # 可进行加减乘除运算,数字与运算符之间必须有空格,使用乘号'*',必须用\反斜杠
expr 1 \*
shell中各括号用途
() | 用途 1:在运算中,先计算小括号里面的内容 用途 2:数组 用途 3:匹配分组 |
(( )) | 用途 1:表达式,不支持-eq 这类的运算符。不支持-a 和-o,支持<=、>=、<、>这类 比较符和&&、 |
$( ) | 执行 Shell 命令,与反撇号等效 |
$(( )) | 用途 1:简单算数运算用途 2:支持三目运算符 $(( 表达式?数字:数字 )) |
[ ] | 条件表达式,里面不支持逻辑判断符 |
[[ ]] | 条件表达式,里面不支持-a 和-o,不支持<=和>=比较符,支持-eq、<、>这类比较符。支持=~模式匹配,也可以不用双引号也不会影响原意,比[]更加通用 |
$[ ] | 简单算数 |
{ } | 对逗号(,)和点点(…)起作用,比如 touch {1,2}创建 1 和 2 文件,touch{1…3}创建 1、2 和 3 文件 |
${ } | 用途 1:引用变量 用途 2:字符串 |
echo输出
echo -e 可以解释"\t \n"
echo 本身输出带换行
echo -n 不换行输出
颜色输出
echo -e "\e[1;31m请输入你的选择: \e[0m" # 31-37前景色41-47背景色 0m是恢复
字体颜色 字体背景颜色 显示方式
30:黑 40:黑 0:终端默认设置
31:红 41:深红 1:高亮显示
32:绿 42:绿 4:下划线
33:黄 43:黄色 5:闪烁
34:蓝色 44:蓝色 7:反白显示
35:紫色 45:紫色 8:隐藏
36:深绿 46:深绿
37:白色 47:白色
终端更改
export PS1="\[[\[\e[5;31m\]\u\[\e[0m\]@\h \W \]]\\$ ">>/$home/.bashrc
清空屏幕打印
printf "\e[2J\e[H"
日期相关
获取日期:
date "+%F %T"
date "+%Y-%m-%d %H:%M:%S"
获取几天前的日期:
date -d "n days ago" +%Y-%m-%d (+%F) n为天数
把日期和时间转换成时间戳:
date -d "2016-12-15 18:00:00" +%s
把时间戳转成时间:
date -d '@1481842800' '+%F %T'
生成随机字符串
生成随机字符串(包含数字、大小写英文、符号)
cat /dev/urandom | strings -n C | head -n L # C表示字符串的字符数,L表示要生成多少行字符
生成随机字符串(包含数字和字母)
echo $RANDOM |md5sum |cut -c 1-10
openssl rand -hex 5 随机产生10长度字符串
生成随机数字
date +%N |cut -c 1-8
比较
[ 1 -gt 10 ] 大于
[ 1 -lt 10 ] 小于
[ 1 -eq 10 ] 等于
[ 1 -ne 10 ] 不等于
[ 1 -ge 10 ] 大于等于
[ 1 -le 10 ] 小于等于
信号
trap "" signal
HUP(1) 挂起,通常因终端掉线或用户退出而引发
INT(2) 中断,通常因按下Ctrl+C组合键而引发
QUIT(3) 退出,通常因按下Ctrl+/组合键而引发