美文网首页
Shell脚本编程基础

Shell脚本编程基础

作者: 泡泡龙吐泡泡 | 来源:发表于2018-10-29 21:37 被阅读8次

1. Shell简介

1.1 什么是Shell

  • 概念: Shell即使一种命令语言,也是一个用C语言编写的程序(命令解析器)。
  • 作用: 主要提供一个借口使用户与内核交操作。
  • 流程: 接受用户输入的命令并且进行解释(转换为计算机可以理解的机器码),然后将命令送入内核去执行,最后将结果返回给用户。
    Linux系统结构.png

1.2 Shell的种类

  • 含义:不同的命令解析器(程序不断升级)
  • 区别:提示符不同、语法不同、展示效果不同等
  • 常用:sh、csh、ksh、bash等

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模式打开:
vi test.sh 
# 可以不加后缀
  • 指定运行脚本文件的命令解析器类型,在脚本文件中写入代码:
#!/bin/bash 
# 指定为bash类型
  • 写入要执行的代码:
echo hello  
# 输出字符串hello
  • 执行脚本语法:
编号 方法
方法1 sh 路径及文件名(推荐)
方法2 /bin/bash 路径及文件名
方法3 source 路径及文件名
方法4 . 路径及文件名.sh

3. Shell变量

3.1 本地变量

  • 概念:只对当前shell进程有效(ps. 对当前进程的子进程和其它shell进程无效)
  • 语法:

设置:变量名=变量值(等号不能有空格)
删除: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 环境变量

  • 概念:对当前shell进程和子进程有效,其他shell进程无效。通过修改配置文件,可以定义全局都生效的环境变量。
  • 语法:

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 命令代换
  • 概念:通过语法反引号或$(名称)实现先解析shell指令,再赋值给变量。
  • 示例:
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或 [] 可以测试一个条件是否成立。
  • 语法:

语法: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

  • 示例1:判断成绩(>=90优秀,>=80良好,>=60及格,>=0不及格):
#!/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
  • 示例2:判断当前执行脚本是否是root用户:
#!/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

  • 需求:执行脚本让用户输入
    yes - installing...
    no - skip
    其他 - Please enter the correct option
#!/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

  • 示例1:输出6个数
#!/bin/bash

for i in 1 2 3 4 5 6
do
  echo $i
Done
  • 示例2:输出指定目录下得所有文件名
#!/bin/bash

cd $1
filenames=$(ls)

for name in $filenames
do
   echo $name
done

5.2 while循环

  • 语法:

while 条件
do
    命令
done

  • 示例1:输出1-10
#!/bin/bash

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

6. 计划任务

6.1. 简介

  • 概念:约定时间执行指定任务(或执行指定脚本文件)
  • 举例1:通过计划任务定时发布文章
  • 举例2:通过计划任务凌晨3点将测试服务器项目代码同步到线上服务器

6.2. 使用

  • 步骤1:通过命令【crontab -e】编写计划任务
  • 步骤2:按【i】键编写,最后按【esc】【:wq】保存并退出

多学一招: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分钟就执行一遍命令
  • 例子:每分钟向tmp.txt文件中写入数字6:
*/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分执行命令,注意:星期几和几号最好不要同时出现,因为他们定义的都是天,非常容易让管理员混乱

相关文章

  • shell脚本基础

    编写脚本 编程基础 shell脚本 创建shell脚本 变量 运算 测试 配置用户的环境

  • 78.shell编程

    shell编程 Shell脚本,是一种为shell编写的脚本程序。 Shell编程跟JavaScript、Pyth...

  • 【linux编程】生信编程-shell脚本编程-数学运算

    shell编程 Shell 脚本中的数学运算 bash shell 的基础运算主要有4种形式: $(( expre...

  • Shell编程极简入门

    Shell编程不花里胡哨,一篇就够~ 一、基础入门 1.1 shell脚本的第一行代码 Linux环境下的任何脚本...

  • Linux运维-day43-综合架构-shell编程基础扩展

    一、shell编程基础扩展 1.1 基本格式: #!/bin/bash  #! 指定脚本用的命令解释器执行脚本  ...

  • Shell脚本编程基础

    1. Shell简介 1.1 什么是Shell 概念: Shell即使一种命令语言,也是一个用C语言编写的程序(命...

  • shell脚本编程基础

    bash中变量的种类 局部变量:生效范围为当前shell进程,对当前shell之外的其它shell进程,包括当前s...

  • shell脚本编程(基础)

    输出字符串hello world shell debug模式 变量定义与引用 ⚠️ 注意点 = 前后不能有空格变量...

  • shell脚本编程基础

    1.脚本解释器的选择,根据编程需要或个人习惯,选择合适的解释器,常见的是/bin/sh和 /bin/bash 2....

  • shell编程

    Shell脚本,是一种为shell编写的脚本程序。 Shell编程跟JavaScript、Python编程一样,只...

网友评论

      本文标题:Shell脚本编程基础

      本文链接:https://www.haomeiwen.com/subject/eikitqtx.html