Shell脚本自动化管理系统的必备基础:

  • vim编辑器的熟练使用,SSH终端及“.vimrc”的设置等等需要熟悉。
  • 命令基础:Linux的150个常用命令的熟练使用
  • Linux的正则表达式以及三剑客(grep、sed、awk)熟练
  • 常见linux网络服务部署、优化及排错。例如:crond、nfs、rsync、inotify、lanmp,sersync、ssh、memcached、mysql等

shell其实是一个命令解释器,它的作用是解释用户输入的命令和程序,命令和程序可以理解成我们图中的应用程序,我们linux系统中的那些命令其实也都是一个个的小程序,只不过完成的是系统的应用功能。我们在系统的终端中输入一条命令,可以立马看到一条或者几条系统回复我们的信息,其实就是shell在帮我们回复,所以shell可以称之为命令解释器。这种从键盘一输入命令,就可以立马得到相应的回复信息,叫作交互的方式。相当于我们在和电脑交流。Shell存在于系统的最外层,所以算作操作系统的外壳,它之外的应用程序就不能算作操作系统了。我们从输入系统的账户密码开始,到登录系统以后的所有操作都是shell在帮我们解释执行的。

一、shell

Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理,
Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。
下面是流程示意图:
Shell 基本分两大类
  • 图形界面 Shell(GUI Shell)
  • 命令行界面 Shell(CLI Shell
  •  CLI 是在用户提示符下键入可执行指令的界面,用户通过键盘输入指令,完成一系列操作。在 Linux 系统上主流的 CLI 实现是 Bash,

查看系统可用的shell(/etc/shells文件)

Linux系统默认的命令行终端解释器为Bash

 
shell脚本
  当linux命令或者语句不在命令行下执行(严格说,命令行执行的语句也是shell脚本),而是通过一个程序文件执行时,该程序就被称为shell脚本或者shell程序。
类似DOS系统下的批处理程序(扩展名*.bat)
 
shell脚本语言是弱类型语言
 
编写shell要学会过关环节:
  • 必须要root才能执行脚本,否则退出;
  • 成功切换目录,否则退出;
  • 清理日志(cat /dev/null > messages),清理成功,再输出;
  • 通关。。。(echo 输出)

二、Shell脚本文件的格式:

  1. 第一行(一般必须写明):指定脚本使用的shell(若不写明也不影响脚本的执行,系统会自动以sh解析脚本)。"#!/bin/bash"声明文件内的语法使用bash的语法,当这个程序被执行时,加载bash的相关环境配置文件(一般是non-login shell中的~/.bashrc文件)。
  2. 第二部分的注释(可写):程序内容的说明。shell脚本中,井号#用作批注(除第一行的"#!"外),shell不会解释以#开头的行(除第一行bash声明外)。
  3. 主要环境变量的声明(可写)
  4. 脚本的程序部分。
  5. 程序执行结束,回传一个数值给系统告知执行的结果(可写。默认命令执行成功返回数值0)。

脚本文件test1.sh的执行方式:

  1. 以sh(bash)进程来执行脚本文件(用户不必拥有对脚本文件的x权限)(在子进程中执行)

    sh -x:实现shell脚本逐条语句的跟踪

    sh -n:不执行脚本,仅进行语法的检查

    sh -v:执行脚本前,先将脚本的内容输出到屏幕上

  2. 通过绝对或相对路径来执行脚本文件(用户须拥有对脚本文件的x权限)

    (Linux系统中一切都是文件。后缀名.sh仅提示用户该文件是一个脚本文件,并不代表该文件是可以被用户执行的。文件是否可以被执行在于用户是否拥有对该文件的x权限)(在子进程中执行)

  3. 将脚本文件所处的目录添加到PATH环境变量中,通过输入脚本文件名来直接运行(用户须拥有对脚本文件的x权限)(在子进程中执行)

  4. 通过source命令或小数点(.)来执行脚本文件(在父进程中执行)

    用方式①/②/③执行test2.sh脚本,执行完成后回到命令行模式(父进程)输出脚本中设置的变量,发现变量并不存在

    (通过上述①/②/③方式(bash(sh)、绝对/相对路径或者将路径添加到$PATH中)来运行脚本时,该script会使用一个新的bash环境(子shell、子进程)来执行脚本内的命令。当子进程完成后(脚本执行结束),子进程内的各项变量或操作将会消失而不会传回给父进程中。)

    若通过source命令或小数点(.)来执行脚本,该script会在父进程中执行。因此,父进程拥有脚本内设置的变量、操作等。

bash shell中的数学运算:在方括号内计算数学公式 [ operation ],结果赋值为result=$[ operation ]。

数学运算浮点解决方案:使用bc命令(bash的内建计算器)。

选项

作用

-q

不显示bc计算器的欢迎信息

输入quit或组合键ctrl+d可退出bc计算器

浮点运算是由内建变量scale(数值范围)控制的,须将这个值设置为希望在计算结果中保留的小数位数,默认值为0。

在脚本中使用bc命令,通过命令替换$(),将输出结果赋值给一个变量:

基本格式为 variable=$(echo "options; expression" | bc)

使用内联输入重定向<<,在命令行中重定向数据(特别适用于进行大量运算):

基本格式为 varible=$(bc << EOF

options

statements

expressions

EOF

)

EOF字符串标识了重定向给bc命令的数据的终止。

bash计算器中创建的变量只在bash计算器中有效。

Shell中运行的每个命令都使用退出状态码告诉shell它运行完毕。退出状态码:0-255的整数值,在命令结束运行时由命令传给shell。变量$?用于保存上个已执行命令的退出状态码。退出状态码可配合exit命令使用。

状态码

描述

0

命令成功结束

1

一般性未知错误

2

不适合的shell命令

126

命令不可执行

127

没找到命令

128

无效的退出参数

128+x

与Linux信号x相关的严重错误

130

通过ctrl+c终止的命令

255

正常范围之外的退出状态码

   三、参数变量

Shell script的的默认变量(接受用户参数的变量)

  • $0:当前Shell脚本程序的名称;
  • $#:参数的个数;
  • $*:所有位置的参数被看作一个字符串(当成一个整体);
  • $@: 每个位置参数被看做独立的字符串(参数当成个体);
  • $?:返回上一条命令是否执行成功,并返回一个值,0代表成功,非0代表执行失败;
  • $1、$2、$3……:第N个位置的参数值。注:第10参数值需要{}来限定区域即${10}
  • $$ :当前进程PID
  • $! :上一条运行后台进程的PID

四、文件测试表达式 (man  test即可)

test(测试):判断条件表达式是够成立。格式:test [参数]。单独执行test命令后不会显示任何信息。

可通过echo $?输出上一条命令(test命令)执行后的返回结果,若为0则表示执行(判断)成功

或通过&&、||来显示相关结果

  • 文件测试所用的参数

操作符

作用

-e file1

测试file1文件是否存在(exist)

-d file1

测试file1文件是否为目录类型,且是否存在(directory)

-f file1

测试file1文件是否为一般文件,且是否存在(file)

-r file1

测试当前用户对file1文件是否有读取权限(read)

-w file1

测试当前用户对file1文件是否有写入权限(write)

-x file1

测试当前用户对file1文件是否有执行权限(execute)

file1-nt file2

测试file1是否比file2新(newer than)(检查文件日期)

file1-ot file2

测试file1是否比file2旧(older than)

  • 整数测试所用的参数

操作符

作用

n1 -eq n2

检查n1是否等于n2(equal)

n2 -ne n2

检查n1是否不等于n2(not equal)

n1-gt n2

检查n1是否大于n2(greater than)

n1 -lt n2

检查n1是否小于n2(less than)

n1 -le n2

检查n1是否等于或小于n2(less equal)

n1 -ge n2

检查n1是否大于或等于n2(greater equal)

[ $num1 -eq $num2 ]  #注意空格  整数比较不需要加双引号

(( $num1>$num2))   #无需空格,常规数学比较符号

Shell中不应使用"=="和"!="进行整数的比较(会将整数当作字符串来比较)

来自 <http://blog.csdn.net/zbw18297786698/article/details/77460786>

  • 字符串测试所用的参数

    • 字符串或字符串变量比较都要加双引号之后再比较
    • 字符串或字符串变量比较,比较符号两段最好都要跑有空格

操作符

作用

str1 == str2

比较str1与str2字符串的内容是否相同

str1 != str2

比较str1与str2字符串的内容是否不同

-z str1

判断str1字符串长度是否为0(或未被定义)

-n str1

判断str1字符串长度是否为非0

str1 > str2

判断str1是否比str2大(逐位比较字符串的每个字符,按字典顺序比较大小)

str1 < str2

判断str1是否比str2小

(使用>、<(大于号、小于号)进行判断时必须搭配转义字符/使用,否则shell会误认为是重定向符号,把后字符串误当成文件名)(比较字符串顺序大小的测试中,大写字母会被认为是小于小写字母的(与sort命令恰恰相反,在英语环境下sort命令会认为大写字母是大于小写字母的,即排序结果中小写字母优先于大写字母出现))

  • 多重条件判断

操作符

作用

test1 -a test2

类似于&&,两个测试条件同时成立时才回传true(and)

test1 -o test2

类似于||,任一测试条件成立就回传true(or)

! test1

反向状态(取反)

[](中括号):判断符号。bash shell提供的另一种条件测试方法,作用同等与test命令,常用于if…then条件判断式中。

  • 中括号的两端、每个组件间都需要有空格符来分隔。

  • 中括号内的变量、常量,最好都以双引号或单引号括起来。

[ "$yn" == "Y" -o "$yn" == "y" ] 也可写成 [ "$yn" == "Y" ] || [ "$yn" == "y" ] (布尔逻辑能将可能的返回值简化为TRUE或FALSE类型)

 
 
 
转自链接:https://www.cnblogs.com/dayoyan/p/8652318.html
 

shell基础之一的更多相关文章

  1. Shell基础学习小结

    0 shell基础概念 Shell是解释性语言,使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象:缺点是它们的效率通常不如编译型语言.Shell命令有本 ...

  2. Shell基础-环境变量配置文件

    Shell基础-环境变量配置文件 source 配置文件 或者 . 配置文件: 把环境变量写入配置文件后,需要用户重新登陆才能生效,而是用source命令,则能直接生效 主要的配置文件: /etc/p ...

  3. shell基础二十篇 一些笔记

    shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...

  4. shell基础(转)

    shell基础1:文件安全与权限 http://bbs.chinaunix.net/forum/viewtopic.php?t=434579&highlight=wingger 附:Linux ...

  5. Linux实战教学笔记17:精简shell基础

    第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...

  6. shell基础及变量

    一 Shell概述 1.Shell的作用——命令解释器,“翻译官” shell作为一个人机接口,用于解释用户输入的命令,将命令解释为Linux内核可以执行的2进制代码,并将执行的结果返回在标准终端上. ...

  7. Shell 基础教程

    一个比较好的shell基础教程: http://www.runoob.com/linux/linux-shell.html

  8. Linux基础学习(10)--Shell基础

    第十章——Shell基础 一.Shell概述 1.Shell是什么: (1)Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来 ...

  9. Linux Shell基础(下)

    Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...

  10. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

随机推荐

  1. 怎样理解xhr.overrideMimeType()和xhr.responseType

    一般情况下, 我们会通过 xhr.responseType 告诉服务器我们想要什么类型的返回数据. 然后xhr.response 会根据xhr.responseType属性值来自动解析返回值. 但有时 ...

  2. 使ul中的li居中

    1.如果li设置了float:left; 解决办法: 1.ul父元素的标签设置:text-align: center; 2.ul设置: display: inline-block; 2.li不设置fl ...

  3. EFcore的 基础理解<二> shadow 特性

    接着上一篇.在MyEFTestContext 类中添加这个方法 protected override void OnModelCreating(ModelBuilder modelBuilder) { ...

  4. [转载]Java序列化与反序列化

    [转载]Java序列化与反序列化 来源: https://www.cnblogs.com/anitinaj/p/9253921.html 序列化和反序列化作为Java里一个较为基础的知识点,那你能说一 ...

  5. json树迭代

    getArray(data){ for (var i in data) { if(data[i].disabled){ data[i].disabled = false } if(data[i].ch ...

  6. CUDA中使用多维数组

    今天想起一个问题,看到的绝大多数CUDA代码都是使用的一维数组,是否可以在CUDA中使用一维数组,这是一个问题,想了各种问题,各种被77的错误状态码和段错误折磨,最后发现有一个cudaMallocMa ...

  7. github 提交和更新代码

    …or create a new repository on the command line   echo "# flutterPluginsWorks" >> RE ...

  8. 如何上传HTML5应用到SAP云平台的Cloud Foundry环境下

    先使用WebIDE创建一个HTML5应用.New->Project from Template: 从可选模板里选择SAPUI5 Application: 创建一个HTML5 Module,取名为 ...

  9. 【loj#6220】sum

    题目传送门:https://loj.ac/problem/6220 题意:对于一个序列$a$,找出它的一个子序列$b$,使$\sum_{a_i \in b}a_i \equiv 0 \pmod n$ ...

  10. 虚拟机不能桥接联网 vmnet0上的网桥当前未运行

    win10家庭版更新到内测版后,原来可以正常桥接工作的虚拟机ubuntu不能在桥接模式下联网和ssh连接了,因为获取不到IP地址了. 上网搜索一下,发现直接粗暴的方法--修复VMware Workst ...