Shell脚本编程基础

2018-10-29  本文已影响8人  泡泡龙吐泡泡

1. Shell简介

1.1 什么是Shell

1.2 Shell的种类

sh (Bourne Shell) AT&T Bell实验室的Steve Bourne开发 (最早的)
csh (C Shell) 加州伯克利大学的Bill Joy (更强)
ksh (Korn Shell) AT&T Bell实验室的David Korn开发 (升级)
bash(Bourne Again Shell) 自由软件基金会(GNU)开发的一个Shell (统一)

命令 含义
cat /etc/shells 查看系统支持的shell类型
echo $SHELL 查看当前使用的shell类型
useradd [参数] 用户名(-g 指定用户组,-c 备注,-s 登录执行的命令,-d 家目录) 用户添加
usermod 参数 用户名(以上四个 + -l 改名) 用户编辑
userdel 用户名 用户删除
passwd 用户名 修改密码

例如:修改test用户的登录执行命令种类为bash
sudo usermod -s /bin/bash test1

2. Shell脚本

除了挨个执行命令外,还一个创建一个脚本文件批量处理。
创建脚本并执行的步骤:

vi test.sh 
# 可以不加后缀
#!/bin/bash 
# 指定为bash类型
echo hello  
# 输出字符串hello
编号 方法
方法1 sh 路径及文件名(推荐)
方法2 /bin/bash 路径及文件名
方法3 source 路径及文件名
方法4 . 路径及文件名.sh

3. Shell变量

3.1 本地变量

设置:变量名=变量值(等号不能有空格)
删除:unset 变量名
输出:echo $变量名

MacBook-Pro:~ test$ VAR_T1=123        #定义变量
MacBook-Pro:~ test$ echo $VAR_T1      #输出变量
123
MacBook-Pro:~ test$ echo ${VAR_T1}456      #输出变量,添加{}避免混淆
123456
MacBook-Pro:~ test$ unset VAR_T1      #删除变量
MacBook-Pro:~ test$ echo $VAR_T1

3.2 环境变量

export 变量名=变量值
对所有shell进程都生效:
vi /etc/profile #在该配置文件中定义环境变量
source /etc/profile #让新建立的环境变量立刻生效无需重新启动系统

3.3 局部变量

local 变量名=变量值

MacBook-Pro:~ test$ function a(){
> local VAR_T2=123
> echo $VAR_T2
> }
MacBook-Pro:~ test$ a
123
MacBook-Pro:~ test$ echo $VAR_T2

3.4 位置变量

传参:sh 路径及文件名.sh 参数1 ... 参数n
输出:echo $1 / .. / echo $n

MacBook-Pro:shell test$ cat test3.sh 
#!/bin/bash
echo $[${1}+${2}]  #算数代换
MacBook-Pro:shell test$ sh test3.sh 5 5
10

3.5 特殊变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
变量 应用场景
$n 根据传递的参数安装指定软件
$$ 脚本执行时输出进程编号便于卡死时结束进程(注:sleep 秒数)

3.6 其他

3.6.1 命令代换
MacBook-Pro:shell test$ VARDATE=date
MacBook-Pro:shell test$ echo $VARDATE
date
MacBook-Pro:shell test$ VARDATE=`date`
MacBook-Pro:shell test$ echo $VARDATE
2018年10月29日 星期一 20时12分00秒 CST
MacBook-Pro:shell test$ VARDATE=$(date)
MacBook-Pro:shell test$ echo $VARDATE
2018年10月29日 星期一 20时12分14秒 CST
3.6.2 算术代换
MacBook-Pro:shell test$ echo 8 + 2
8 + 2
MacBook-Pro:shell test$ echo $[8 + 2]
10

4. Shell流程控制(判断)

4.1. 条件测试

语法:test 值1 条件 值2

语法: [ 值1 条件 值2 ]
脚下留心:0-代表结果成立,1-代表结果不成立;中括号内部两端必须加空格

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
参数 说明
-e 文件名 文件存在则为真
-r 文件名 文件存在且可读则为真
-w 文件名 文件存在且可写则为真
-x 文件名 文件存在且可执行则为真
-s 文件名 文件存在且至少有一个字符则为真
-d 文件名 文件存在且为目录则为真
-f 文件名 文件存在且为普通文件则为真
参数 说明
= 相等则为真
!= 不相等则为真

4.2. if...elif...else语句

if 条件1
then
    命令1
elif 条件2
then
    命令2
else
    命令3
fi

#!/bin/bash
#接受分数
SCORE=$1
#判断
if [ $SCORE -ge 90 ]
then
    echo "优秀"
elif [ $SCORE -ge 80 ]
then
    echo "良好"
elif [ $SCORE -ge 60 ]
then
    echo "及格"
elif [ $SCORE -ge 0 ]
then
    echo "不及格"
else
    echo "分数不合法"
fi
#!/bin/bash
WHO=$(whoami)

if [ $WHO != 'root' ]
then
    echo "Error: You must be root to run this script!"  
    exit 1
fi

4.3. case语句

case $变量名 in
     "值1")
          如果变量的值等于值1,则执行程序1
    ;;
     "值2")
          如果变量的值等于值2,则执行程序2
    ;;
    ....
     *)
         如果以上都不成立,则执行此程序
    ;;
esac

#!/bin/bash

read -p "Please Input yes/no: " Select_Id
case $Select_Id in
  "yes")
    echo 'installing...'
    ;;
  "no")
    echo 'skip'
    ;;
  *)
    echo 'Please enter the correct option'
    ;;
esac

5. Shell循环

5.1 for循环

for 变量名 in 值1 ... 值N
do
    命令
done

#!/bin/bash

for i in 1 2 3 4 5 6
do
  echo $i
Done
#!/bin/bash

cd $1
filenames=$(ls)

for name in $filenames
do
   echo $name
done

5.2 while循环

while 条件
do
    命令
done

#!/bin/bash

i=1
while [ $i -le 10 ]
do
    echo $i
    i=$(($i+1))
done

6. 计划任务

6.1. 简介

6.2. 使用

多学一招:crontab -e语法同vi编辑器命令 (-e edit缩写)
通过crontab -l 可以查看已有的任务 (-l list缩写)
通过crontab -r 可以移除已有的任务 (-r remove缩写)

6.3. 语法

* * * * * 任务
分 时 日期 月 星期几

项目 含义 范围
第一个“*” 一小时中的第几分钟 0-59
第二个“*” 一天中的第几小时 0-23
第三个“*” 一月中的第几天 1-31
第四个“*” 一年中的第几天 1-12
第五个“*” 一周中的星期几 0-7(0和7代表星期天)
特殊符号 含义
* 代表任何时间。比如第一个“*”就代表一小时中的没分钟都执行一次
, 代表不连续的时间,比如“0 8,12,16 * * *”就代表在每天的8点0分,12点0分,16点0分都执行一次命令
- 代表连续的时间范围。比如“0 5 * * 1-6”代表在周一到周六的凌晨5点0分执行命令
*/n 代表每隔多久执行一次。比如“*/10 * * * *”,代表每隔10分钟就执行一遍命令
*/1  *  *    *   *  echo 9 >> /tmp.txt

其他案例:

   时          间    含义
45 22 * * * 在每天22点45分执行命令
0 17 * * 1 每周1的17点0分执行命令
0 5 1,15 * * 每月1号和15号的凌晨5点0分执行命令
40 4 * * 1-5 每周一到周五的凌晨4点40分执行命令
*/10 4 * * * 每天的凌晨4点,每个10分钟执行一次命令
0 0 1,15 * 1 每月1号和15号,每周一的0点0分执行命令,注意:星期几和几号最好不要同时出现,因为他们定义的都是天,非常容易让管理员混乱
上一篇下一篇

猜你喜欢

热点阅读