什么是Shell?

  1. Shell 是 Linux 的命令解释器,用于解释用户对操作系统的操作
  2. cat /etc/shells
  3. CentOS 7 默认使用的 Shell 是 bash
  4. 命令执行的具体过程: 由 Shell 接受命令,对命令的选项和参数进行分析。如 ls,会交给文件系统(内核),内核接受命令,将所要查看的目录或文件翻译成硬盘的某个扇区,硬件将查询到的结果返回给内核,内核返回给 Shell ,Shell 返回给用户。
  5. bash 是基于bsh,将其他 shell 好用的功能集成过来,bsh 不好用的省略,a 代表 again重写。

Linux 的启动过程

  1. 系统自带的 Shell 脚本用途
  • 用于 Linux 系统的启动过程
  • Linux 命令

2. Linux 启动过程

BIOS引导 - MBR - BootLoader(grub) - kernel - systemd - 系统初始化 - shell

BIOS基本输入输出系统在主板上,通过BIOS选择引导的介质(硬盘/光盘),来到硬盘,MBR主引导记录部分,可引导则进入grub,启动和引导内核/windows系统,grub用于选择内核和内核版本,启动kernel,内核初始化-加载硬件,一号进程:systemd(CentOS 7)/init(CentOS)

  • 查看MBR:dd if=/dev/sda of=mbr.bin bs=512 count=1
  • hexdump -C mbr.bin.
  • 55 aa 证明扇区引导正确 446bytes
  • 查看 grub: cd /boot/grub2
  • 查看内核版本:grub2-editenv list uname -r
  • 查看 systemd:cd /etc/systemd/system/

Shell 脚本的格式

为了组合命令和多次执行,使用脚本文件保存需要执行的命令。文件拓展名 .sh
赋予该文件的权限 chmod u+rx filename
执行:bash filename.sh  默认命令解释器为 bash 才可以./filename. sh   用系统默认的命令解释器#!/usr/bin/python
#!/bin/bash bash ./filename.sh 被解释为注释./filename.sh 被解释为 /bin/bash 运行

脚本不同执行方式的影响

  • bash ./filename.sh 开启bash子进程执行,无需X权限,运行后回到父进程,不改变环境
  • ./filename.sh 开启sha-Bang子进程运行,必须赋予x权限,运行后回父进程,环境不变
  • source ./filename.sh 当前进程运行,改变环境,无需X权限
  • . filename.sh 当前进程运行,改变环境,无需X权限

内建命令和外部命令的区别

  • 内建命令不需要创建子进程
  • 内建命令对当前shell生效

管道与重定向

  1. 管道:进程通信工具,方便脚本编程两条命令相互通信
  2. 匿名管道(管道符):Shell 编程经常用到的通信工具
  3. 管道符是“|”,将前一个命令的执行结果传递给后面的命令 ps | cat 、 echo 123 | ps,给前后两个命令创建子进程,如果子进程中存在内建命令是不会传递给父进程,所以使用管道符尽量不要使用内建命令。如果子进程是shell,则称为子shell
  4. 重定向:进程运行时会打开stdin stdout stderr 三个文件描述符,标准输出信息输出到文件
输入重定向: '<'   文件代替键盘输入read var < /path/to/a/file
输出重定向: '>'  '>>' '2>' '&>'  文件代替终端输出清空:echo 123 > /path/to/a/file换行追加:echo 123 >> /path/to/a/file错误重定向:echo 123 2> /path/to/a/file全部执行信息重定向:echo 123 &> /path/to/a/file
输入输出重定向组合使用:cat > /path/to/a/file << EOFI am $USEREOF


变量

  1. 变量的赋值
  • 变量名=变量值 abc=123
  • 使用let为变量赋值 let a=10+20
  • 将命令赋值给变量 l=ls
  • 将命令结果赋值给变量 使用$()或者'' letc=$(ls -l /etc)
  • 变量值有特殊字符可以包含在" " 、 ' '中

2.变量的引用

  • ${变量名}称作对变量的引用
  • echo ${变量名} 查看变量的值
  • ${变量名} 在部分情况下可省略为$变量名

3.变量的默认作用范围 :本shell

变量的导出 export 变量名           子进程可以获得父进程的变量值
变量的删除 unset 变量名

4. 环境变量、预定义变量、位置变量

  • 系统环境变量:每一个shell都可以读取到变量值
每一个系统环境变量都经历了export的导出,子shell可以生效
set 和 env 命令
echo $PATH 若想修改PATH 可以 export PATH=$PATH:/new/path,子shell可以生效(bash 产生子shell),平行shell不生效
$PS1

  • 位置变量:$1 $2 .${10}.. $n. 对应入参。若读入值为空可 var=${2-_} echo var
  • 预定义变量:echo $? 上一条命令正确执行 0。错误执行 1
  • echo $$ 显示当前进程Pid
  • echo $0 显示当前进程名称

5. 环境变量的配置文件

etc保存所有用户配置,~家目录保存用户特有配置.

配置文件在打开终端的时候才运行

login in :su - username 执行五个配置文件,加载全面

no login in: su username 执行下面两个配置文件,加载不全

  • /etc/profile
  • /etc/profile.d/
  • ~/.bash_profile
  • ~/.bashrc alias
  • /etc/bashrc

数组

  1. 定义数组: IPTS=(1 2 3)
  2. 显示数组所有元素: echo ${IPTS[@]}
  3. 显示数组元素个数: echo ${#IPTS[@]}
  4. 显示数组的第一个元素: echo ${IPTS[0]}

算术运算符

  1. + - / ** %
  2. 运算 expr 4 + 5. expr只支持整数
  3. num1 = `expr 4 + 5`. ((num1=4+5))

数字常量

  1. let "变量名=变量值"
  2. 0开头为八进制,0x为十六进制
  3. 双圆括号是 let 命令的简化,((a=10)) ((a++)) echo $((10+20))

特殊字符大全

引用:' 完全引用,不进行解释$" 不完全引用,进行解释$` 执行命令

退出与退出状态

  • exit shell 运行成功返回0 失败返回非0 使用 echo $? 查看上一个进程是否正常退出
  • exit 127 返回一个自定义值

测试命令 test

  • test 命令用于检查文件或者比较值
  • test 可以做以下测试:文件测试、整数比较测试、字符串测试
  • test 测试语句可以简化为 []
  • [] 符号还有拓展写法[[]] 支持&&、||、<、>
man test
判断是否为文件:test -f /etc/passwd 存在为0 不存在为1
判断值大小:[5 -gt 4] [[5>4]] gt lt ge le eq
判断目录是否存在:[-e /etc/]
判断字符串是否相等: ["abc"="ABC"] 结果为1,test可以区分大小写


语句

if-then 语句

if [测试条件成立] 或 命令返回值是否为0
then 执行相应命令
fi  结束

if-then-else 语句

if [测试条件成立] 或 命令返回值是否为0
then 执行相应命令
else 测试条件不成立,执行相应命令
fi  结束#!/bin/bash
# if else
if [$USER = root];thenecho "user root"echo $UID
elseecho "other root"echo $UID
fi

if-elif-else 语句

if [测试条件成立] 或 命令返回值是否为0
then 执行相应命令
elif [测试条件成立] 或 命令返回值是否为0
then 执行相应命令
else 测试条件不成立,执行相应命令
fi  结束#!/bin/bash
# if elif else
if [$USER = root];thenecho "user root"echo $UID
elif [$USER = user1];thenecho "user root"echo $UID
elseecho "other root"echo $UID
fi

嵌套if的使用

if [测试条件成立] 或 命令返回值是否为0
then 执行相应命令if [测试条件成立] 或 命令返回值是否为0then 执行相应命令fi  结束
fi  结束

分支语句

case "$变量" in"情况1" )命令...;;"情况2" )命令...;;* )命令...;;
esac

for 循环

for 参数 in 列表
do 执行的命令
done 封闭一个循环使用反引号或者$()方式执行的命令,命令的结果当作列表进行处理for i in {1..9}
doecho $i
donec语言的风格的(awk使用):
for((赋值;判断;变化))
do循环执行的命令
done

while 循环和 util 循环

使用循环处理命令行参数

命令行参数可以使用 $1 $2 $3 ${10} $n进行读取
$0 代表脚本名称
$@ 和 $*可以代表所有位置的参数
$#代表位置参数的数量for pos in $*
do if ["$pos"="help"];thenecho $pos $posfi
donewhile [$# -ge 1]
do if ["$1"="help"];then echo $1 $1fishift                  //可以参数左移
done

自定义函数

 自定义函数:function fname(){                        //function 可省略命令}
函数的执行:fname函数作用范围的变量: local 变量名
删除函数:unset fname
----------------------------------
cdls(){cd $1ls
}调用:cdls /tmp  进入tmp并进行查看
----------------------------------
每个进程对应在/proc/pid目录下checkpid(){local ifor x in $* ;do[-d "/proc/$x"] && return 0donereturn 1
}执行: checkpid 1echo $?

系统函数库介绍

系统自建了函数库,可以在脚本中引用   /etc/init.d/functions
自建函数库: 使用source函数脚本文件"导入"函数


脚本资源配置

脚本优先级控制

  1. 可以使用 nice 和 renice 调整脚本优先级
  2. 避免出现不可控的死循环(cpu 占用高/死机)
查看限制:ulimit -a                  root用户中的很多限制不生效 可能会产生fork炸弹 .() {. | .&}; .

信号捕获

捕获信号脚本的编写:kill 默认会发送15号信号给应用程序
ctrl +c 默认会发送2号信号给应用程序
9号信号不可阻塞#!/bin/bash
#capture signaltrap "echo sig 15" 15      //  kill -15 pid
trap "echo sig 2" 2          // ctrl+cecho $$                        // 打印进程号while :                      //  死循环
do :
done

计划任务

一次性计划任务 at

at 指定时间
echo hello > /tmp/hello.txt
ctrl+d 提交查看计划任务:atq周期性计划任务

周期性计划任务

配置方式: crontab -e
每分钟运行显示系统的日期:* * 7 7 1-5 /usr/bin/date >> /tmp/date.txt。   七月七日,若在周一到周五范围内,每分钟执行一次
查看任务:    cd /var/log.       tail -f cron
查看现有的计划任务: crontab -l
每个用户周期性计划任务文件: /var/spool/cron/
配置格式:分钟 小时 日期 月份 星期执行的命令

计划任务加锁 flock

如果计划 1:30 完成某个计划任务,但在 1:25 宕机 则可以使用此解决方案
即,计算机不能按照预期时间运行anacontab 延时计划任务flock 锁文件flock -xn "tmp/f.lock" -c "root/task_shell_file".     排它  保证一次只能运行一个实例


shell 中diff返回值_LINUX(中)相关推荐

  1. linux wget返回值_Linux中curl命令和wget命令的使用介绍与比较

    原文链接: 这篇文章主要给大家介绍了Linux中curl命令和wget命令使用以及这两者之间的区别比较,curl和wget命令都是Linux下的工具,可以用来下载文件.文中介绍的非常详细,相信对大家具 ...

  2. linux wget返回值_Linux中的Wget命令与示例

    GNU Wget是用于从Web下载文件的命令行实用程序.使用Wget,您可以使用HTTP,HTTPS和FTP协议下载文件. Wget提供了许多选项,使您可以下载多个文件,恢复下载,限制带宽,递归下载, ...

  3. java中return返回值_Java中return的用法

    展开全部 一.return语句总是用在方法中,有两个作用. 一个是返回方法指定类型的值(这个值总62616964757a686964616fe59b9ee7ad9431333366306434是确定的 ...

  4. linux wget返回值_Linux中wget用法

    Wget简介: Linux系统中wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器.wget支持HTTP,HTT ...

  5. 获取存储过程返回值及代码中获取返回值

    获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_b ...

  6. c# mysql executenonquery_C#中ExecuteNonQuery()返回值注意点分析

    本文实例讲述了C#中ExecuteNonQuery()返回值注意点.对于C#数据库程序设计有一定的借鉴价值.分享给大家供大家参考之用.具体分析如下: 首先,在查询某个表中是否有数据的时候,我们通常用E ...

  7. [转载]Asp.net MVC中Controller返回值类型

    Asp.net MVC中Controller返回值类型 在mvc中所有的controller类都必须使用"Controller"后缀来命名 并且对Action也有一定的要求: 必须 ...

  8. 获取存储过程返回值及代码中获取返回值(转)

    获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_b ...

  9. c++中带返回值函数没写return能通过编译但运行时会出现奇怪问题

    c++中带返回值函数没写return能通过编译但运行时会出现奇怪问题 例如: string myFunc(){ theLogics(); } 发现调用: myFunc(); 崩溃. 但调用: cout ...

最新文章

  1. 翻译Python编程无师自通——专业程序员的养成
  2. windows2008下VS2008发布失败
  3. freemarker 教程
  4. 2021年1月10日停电感慨
  5. java获取当前周一_Java互联网架构-Spring IOC源码分析
  6. docker快速搭建RabbitMQ集群
  7. 14门教程带你全面入门Linux
  8. Oracle 数据库字典 sys.obj$ 表中关于type#的解释
  9. [置顶] 【cocos2d-x入门实战】微信飞机大战之二:别急,先处理好CCScene和CCLayer的关系...
  10. perl-我的第一个程序
  11. Java List集合排序 Java8 List集合排序方法 Java Lambda集合排序
  12. Sketch for Mac汉化破解教程含汉化包
  13. 黑桃符号java怎么打印出来_java入门基础(四)
  14. 在家快发霉了?数据告诉你,网友们都怎么打发时间 | DT数说
  15. BIOS入口地址:FFFF:0000是指什么意思?在物理上是指内存条的什么位置?
  16. datawindow技巧
  17. 最优性理论(无约束)
  18. 2016年之前目标跟踪算法总结
  19. html界面前台拼接base64加密后的图片
  20. kubernetes(k8s) 安装 Prometheus + Grafana

热门文章

  1. 供SAPI中TTS功能用使的Win8.1语言包安装
  2. testNG的DataProvider返回IteratorObject[]的妙用
  3. Win32程序开发流程--《深入浅出MFC》
  4. java学习笔记—校验码的实现(15)
  5. C#,silverlight中 将颜色字符串的RRGGBB转换成为颜色
  6. 苹果CEO 斯蒂夫.乔布斯:我如何工作
  7. memcached 的Linux安装
  8. MVC专题研究(三)——数据绑定和传送
  9. 《C#高级编程》既不高级,也不基础,东拼西凑的味道十足。。。
  10. for vue 一行2列_vue常见面试题汇总