前言

本篇是讲解linux服务器下的shell脚本编写以及常用命令
分以下几个篇章

  • Shell基础
  • Bash变量
  • Shell运算符
  • 流程控制语句
  • 正则表达式

一、简介

Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理, Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。

bash:是Linux标准默认的shell。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40个。
sh: 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。
另外还有:ash、 csh、 ksh等。

二、Bash变量

2.1、什么是变量

  • 变量是值可以改变的量
  • 变量让你能够把程序中准备使用的每一段数据都赋给一个简短易记的名字,因此他们十分有用。

变量命名规则

  • 变量名必须以字母或者下划线打头,名字中间只能由字母、数字和下划线组成
  • 变量长度不可超过255个字符
  • 变量名在有效范围内必须是唯一
  • 在Bash中,变量的默认类型都是字符串类型
  • 在任何系统,目录名、文件名、变量名都要有含义、意义

2.2、变量分类

  • 用户自定义变量:变量自定义。
  • 环境变量:这种变量主要保存的是和系统操作环境相关的数据。可自定义,但对系统生效的环境变量名和变量作用是固定的。
  • 位置参数变量:这种变量主要是用来想脚本中传递参数或者数据,变量名不能自定义,变量作用是固定的。
  • 预定义变量:Bash中已经定义好了的变量,变量名不可自定义,作用也是固定的

2.3、用户自定义变量

  • 变量名=变量
# 等于号两边没有空格,有空格代表系统变量
name="jie cao"

变量调用

  • echo $变量名
echo $name

变量叠加

x=123
x="$x"456
x=${x}789

变量查看

  • set (查看所有变量)
    -u 如果设定此选项,调用未声明变量会报错(默认无任何提示)
  • env (查看环境变量)

变量删除

  • unset 变量名(没有$)

环境变量

环境变量和自定义变量区别?

  • 环境变量:全局(当前shell以及子shell)
  • 自定义变量:局部(当前shell)

如何设置环境变量

  • export 变量名=变量值
  • 变量名=变量值
    export 变量名

常用环境变量

  • HOSTNAME 主机名

  • SHELL 当前shell

  • TERM 终端环境

  • HISTSIZE 历史命令条数

  • SSH_CLIENT 当前环境是ssh连接的,这里记录客户端ip

  • SSH_TTY ssh连接终端时pts/1

  • USER 当前登陆用户

  • PATH 系统查找命令的路径(冒号分割)

  • echo $PATH 查看PATH环境变量

  • PATH = "$PATH":/root/sh 给PATH变量增加搜索的命令

永久生效需要去对应文件修改

当前语系查询

  • locale 查询当前系统语系
  • LANG:定义系统主语系的变量
  • LC_ALL:定义整体语系的变量
  • echo $LANG 查看系统当前语系
  • locale -a | more 查看linux支持所有语系

修改默认语系文件路径

  • cat /etc/sysconfig/i18n

位置参数变量

位置参数变量作用实例
$nn为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要大括号包括,如${10}文件名后带参数,$n就是代表第几个位置的参数
$*这个变量也代表命令中所有参数,不过$@把每个参数看成一个整体循环中会打印一次,因为会当成一个整体
$@这个变量也代表命令中所有参数,不过$@把每个参数区分对待循环中会打印多次
$#这个变量代表命令行中所有参数的个数输出参数个数

预定义变量

预定义变量作用
$?最后一次执行的命令的返回状态,如果这个变量为0,证明上一个命令正确执行;如果这个变量值为非0(具体是哪个数,由命令自己决定),则证明上一个命令执行错误了
$$当前进程的进程号(PID)
$!后台运行最后一个进程的进程号

接收键盘输入

  • read [选项] [变量名]
  • 选项:
  • -p "提示信息" :等待你输入信息
  • -t 秒数:指定等待多少时间
  • -n 字符数:只能接受指定大小的字符数
  • -s 隐藏输入的信息,适用于机密等信息
!/bin/bash
  
read -p "请输入你的名字:" -t 30 name
echo $name

read -p "请输入密码:" -s password
echo -e "\n"

echo $password

read -p "请输入你的性别:" -n 1 sex

echo -e "\n"
echo $sex

三、流程控制语句

本小节包括:条件判断式语句、单分支if语句、双分支if语句、多分支if语句、case语句、for循环、while循环和until循环等

  • 按照文件类型判断
  • 按照文件权限进行判断
  • 两个文件之间进行比较
  • 两个整数之间比较
  • 字符串的判断
  • 多重条件判断(逻辑判断)
    判断格式 [ 需要进行判断的语句 ]

3.1、IF

  • 3.1.1、单分支if条件语句
if [ 条件判断式 ];then
    程序
fi

或者

if [ 条件判断式 ]
    then
    程序
fi

注意,在if(空格)[(空格)条件判断式(空格)]中的空格

  • 3.1.2、双分支if条件语句
if [ 条件判断 ]
    then
    条件成立时,执行的程序
    else
    条件不成立时,执行的另一个程序
fi

实例:计算跟分区使用情况

#!/bin/bash

amount=$(df -h | grep /dev/sda6 | awk '{print $5}' | cut -f 1 -d "%")

if [ $amount -gt 10 ]
    then
    echo "跟分区使用量:"$amount
else
    echo "跟分区已使用:"$amount
fi
  • 3.1.3、多分支语句
if [ 条件判断1 ]
    then
    程序
    elseif [ 条件判断2 ]
        then
        程序
    else
        程序,当所有条件都不成立时,最后运行此程序
fi

3.2、case

case语句和if···elif···else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

case $变量名 in
	"值1")
		变量值等于值1,则执行程序1
	;;
	"值2")
		变量值等于值2,则执行程序2
	;;
	......其他分支
	*)
		如果变量的值都不是以上值,则执行该程序
;;

例子

#!/bin/bash

read -p "请输入[yes/no]:" input

case $input in
    "yes")
        echo "yes"
        ;;
    "no")
        echo "no"
        ;;
    *)
        echo "other"
        ;;
esac

3.3、for

  • shell中的 for 循环中可以使用 break 和 continue 关键字来跳出循环, 和java 用法一致。
#语法一
for 变量 in 值1 值2 值3 ···	  #这里面的起始值和终止值必须是纯数字,不能是$a,即不能是变量的值
	do
		程序
	done
#语法二
for   变量    in     `命令`
	do
        	循环主体
	done
#语法三
for   ((初始值;循环控制;变量变化))
	do
        	循环主体
	done


例子

#!/bin/bash

for((i=1;i<=10;i=i+1))
    do
        echo hello world >> /home/yang/temp.log
    done    

3.4、while循环

while循环是不定循环,也称做条件循环,只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。

while   条件
do
          循环主体
done

3.4、until

until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程度。一旦循环条件成立,则终止循环。