shell编程

初始shell

程序 语言 编程
----------------------------------
语言
自然语言:汉语、英语
计算机语言:c语言、c++、(java php python go shell)
编译型语言 c c++ java
解释型语言  php python  bash
​
编译型语言:运行编译型语言是相对于解释型语言存在的,编译型语言的首先将源代码编译生成机器语言,再由机器运行机 器码(二进制)。像C/C++等都是编译型语言。
解释型语言:相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码 进行解释运行。比如Python/JavaScript / Perl /Shell等都是解释型语言c 编译型执行 代码需要编译成cpu能认识的二进制码 x86指令集java 编译型执行 , 编译-->字节码,cpu不能直接运行,只能被Java虚拟机执行 shell 解释型执行 慢

shell 定义

Shell 也是一种程序设计语言,它有变量,关键字,各种控制语句,有自己的语法结构,利用shell程序设计语 言可以编写功能很强、代码简短的程序
#! Shebang 定义解释器

shell的分类和切换

[root@linux-server ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
​
默认shell: bash shell
centos中脚本使用的默认shell 为/usr/bin/sh
查看当前正在使用的shell
[root@linux-server ~]# echo $SHELL
/bin/bash
​
shell 的切换
vim /etc/passwd  编辑登录shell

使用场景

什么时候不适合使用Shell编程:1. 资源紧张的项目,特别是那些速度是重要因素的地方(排序,散序,等等)2. 程序要进行很复杂的数学计算,特别是浮点计算,任意精度的计算,或者是复数计算3. 要求交叉编译平台的可移植性(使用C或者是Java代替)4. 需要结构化编程的复杂应用(需要变量类型检查和函数原型等等)5. 对于影响系统全局性的关键任务应用。6. 安全非常重要。你必须保证系统完整性和抵抗入侵,攻击和恶意破坏。7. 项目由连串的依赖的各个部分组成。8. 多种文件操作要求(Bash被限制成文件顺序存取,并且是以相当笨拙,效率低下的逐行的存取方式) 9. 需要良好的多维数组支持。10. 需要类似链表或树这样的数据结构。11. 需要产生或操作图象或图形用户界面。12. 需要直接存取系统硬件。13. 需要端口号或是socket I/O。14. 需要使用可重用的函数库或接口。15. 所有的私有的不开源的应用程序(Shell脚本的源代码是直接可读,能被所有人看到的)
​如果你需要有上面的任意一种应用,请考虑其他的更强大的脚本语言――Perl,Tcl,Python,Ruby,或者可能是其他更 高级的编译型语言,例如C,C++或者是Java
Shell 能做什么?
1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...)
2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
3. 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
4. 日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk)
5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)
7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL) 8. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
9. 自动化扩容(增加云主机——>业务上线)
zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上 线)
10. 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序实现 11. Shell可以做任何运维的事情(一切取决于业务需求)

shell 特性回顾

  • shell常见元素
文件描述符与输出重定向:
在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是: 0: Standard Input (STDIN)
1: Standard Output (STDOUT)
2: Standard Error Output (STDERR)
在标准情况下, 这些FD分别跟如下设备关联:
stdin(0): keyboard 键盘输入,并返回在前端
stdout(1): monitor 正确返回值 输出到前端
stderr(2): monitor 错误返回值 输出到前端
>a.txt
1>a.txt
2>a.txt
&>a.txt
1>&2
2>&1
一般来说, "1>" 通常可以省略成 ">".
1>&2 正确返回值传递给2输出通道 &2表示2输出通道,之前如果有定义标准错误重定向到某log文件,那么标准输出也重 定向到这个log文件,如果此处错写成 1>2, 就表示把1输出重定向到文件2中.
2>&1 错误返回值传递给1输出通道, 同样&1表示1输出通道.
​
例子. 当前目录下只有a.txt,没有b.txt
[root@linux-server ~]# touch a.txt
[root@linux-server ~]# ls a.txt b.txt 1>file.out 2>&1
[root@linux-server ~]# cat file.out
ls: cannot access b.txt: No such file or directory
a.txt
现在, 正确的输出和错误的输出都定向到了file.out这个文件中, 而不显示在前端 =================================
[root@linux-server ~]# cat >> b.txt << !
> ni hao a haha
> !
[root@linux-server ~]# cat b.txt
ni hao a haha
​
注:这里也可以使用EOF需要成对使用即可!

bash 初始化

用户登录时相关的bash配置文件 (登录脚本)
全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置文件~/.bsah_profile~/.bashrc
profile类的文件: 设定环境变量,运行命令或脚本
bashrc类的文件: 定义命令别名
​
用户登录时加载bash配置文件的过程
登录式shell加载配置文件过程/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非登录式shell加载配置文件过程~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
用户的初始化脚本环境变量 修饰用户工作环境变量
这些文件为系统的每个用户设置环境信息Shell设置文件:/etc/profile(系统级)启动时执行 这是系统最主要的shell设置文件,也是用户登陆时系统最先检查的文件,有关重要的环境变量都定义在此,其中包括 PATH,USER,LOGNAME,MAIL,HOSTNAME,HISTSIZE,INPUTRC等。而在文件的最后,它会检查并执 行/etc/profile.d/*.sh的脚本。~/.bash_profile(用户级)离开时执行 这个文件是每位用户的bash环境设置文件,它存在与于用户的主目录中,当系统执行/etc/profile 后,就会接着读取此 文件内的设置值。在此文件中会定义USERNAME,BASH_ENV和PATH等环境变量,但是此处的PATH除了包含系统的$PATH变 量外加入用户的“bin”目录路径.~/.bashrc(用户级)离开时执行接下来系统会检查~.bashrc文件,这个文件和前两个文件(/etc/profile 和~.bash_profile)最大的不同是,每次 执行bash时,~.bashrc都会被再次读取,也就是变量会再次地设置,而/etc/profile,~./bash_profile只有在登陆 时才读取。就是因为要经常的读取,所以~/.bashrc文件只定义一些终端机设置以及shell提示符号等功能,而不是定义环 境变量。~/.bash_login(用户级)离开时执行 如果~.bash_profile文件不存在,则系统会转而读取~.bash_login这个文件内容。这是用户的登陆文件,在每次用户登 陆系统时,bash都会读此内容,所以通常都会将登陆后必须执行的命令放在这个文件中。~/.bash_logout 离开时执行 如果想在注销shell前执行一些工作,都可以在此文件中设置。 例如:
#vi ~.bash_logout
clear
仅执行一个clear命令在你注销的时候
​~/.bash_history(用户级) 这个文件会记录用户先前使用的历史命令。

  • bash shell 特性
补全
历史
别名
快捷键
前后台作业
重定向
管道
命令排序执行: ; && ||
&&:逻辑与,前面执行成功,后面才执行。前面命令执行失败,后面命令也不执行
||:逻辑或,前面执行失败,后面执行,前面命令执行成功,后面不执行。
;:从左往右按顺序执行,不管前面执行成功与否,后面都执行
通配符:[] {} ? *
正则表达式 脚本

  • 历史命令
查看历史命令
[root@linux-server ~]# history
调用历史命令 上下健!关键字!历史命令行号!! 执行上一条命令!$ 上一条命令的最后一个参数esc . 上一条命令的最后一个参数Ctrl+r 在历史命令中查找,输入关键字调出之前的命令
别名
查看别名
[root@linux-server ~]# alias
设置别名
临时设置
[root@linux-server ~]# aa=88
[root@linux-server ~]# echo $aa
88
永久设置# vim /root/.bashrc
小小技巧:显示历史命令执行时间
1.设置变量:
[root@linux-server ~]# vim /etc/profile    #在最后添加
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S"
[root@linux-server ~]# source /etc/profile  #让设置的环境变量生效
2.再次执行history查看结果

  • Bash 部分快捷键
    Ctrl+a 切换到命令行开始(跟home一样,但是home在某些unix环境下无法使用)           Ctrl+e 切换到命令行末尾Ctrl+u 清除剪切光标之前的内容Ctrl+k 清除剪切光标之后的内容ctrl+y 粘贴刚才所删除的字符Ctrl+r 在历史命令中查找,输入关键字调出之前的命令

  • 通配符置换
在 Shell命令中,通常会使用通配符表达式来匹配一些文件*,?,[],{}
例:
字符          含义                     实例
*       匹配 0 或多个字符               a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。
?       匹配任意一个字符                a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。
[list]  匹配 list 中的任意单一字符       a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
[!list] 匹配 除list 中的任意单一字符      a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿 拉伯数字, 如axb, aab, a-b。
[c1-c2] 匹配 c1-c2 中的任意单一字符      如:[0-9] [a-z] a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b... a9b。
{string1,string2,...} 匹配 sring1 或 string2 (或更多)其一字符串 a{abc,xyz,123}b a与b之间只 能是abc或xyz或123这三个字符串之一。
[root@linux-server tmp]# rm -rf ./*
[root@linux-server tmp]# touch aabcb axyzb a012b ab acb
[root@linux-server tmp]# ls
a012b  aabcb  ab  acb  axyzb
[root@linux-server tmp]# ls a*b
a012b  aabcb  ab  acb  axyzb
[root@linux-server tmp]# ls a?b
acb
​
[root@linux-server tmp]# rm -rf ./*
[root@linux-server tmp]# touch axb ayb azb axyb
[root@linux-server tmp]# ls
axb  axyb  ayb  azb
[root@linux-server tmp]# ls a[xy]b
axb  ayb
[root@linux-server tmp]# ls a[!xy]b
azb
[root@linux-server tmp]# ls a[!x]b
ayb  azb
​
[root@linux-server tmp]# rm -rf ./*
[root@linux-server tmp]# touch a0b a1b a9b
[root@linux-server tmp]# ls a[0-9]b
a0b  a1b  a9b
​
[root@linux-server tmp]# rm -rf ./*
[root@linux-server tmp]# touch aabcb axyzb a012b ab
[root@linux-server tmp]# ls a{abc}b
ls: cannot access a{abc}b: No such file or directory
[root@linux-server tmp]# ls a{abc,xyz}b
aabcb  axyzb
[root@linux-server tmp]# ls a{abc,xyz,012}b
a012b  aabcb  axyzb

python shell 运行时不打印日志_shell编程相关推荐

  1. python运行不了、显示警告_如何消除Shell运行时显示的警告MatplotlibDeprecationWarning?...

    为了方便大家观察只截取了关键部分的代码块. 程序运行时没有错误,只是每次脚本运行到这个函数的时候 from bisect import bisect_right import networkx as ...

  2. 【解决】Python程序运行时所占内存越来越大

    1.问题描述 最近在用Python(Pyqt5)编写一个可以获取gpu信息(功耗.显存占用.利用率等)并将这些信息保存成csv文件的程序.在程序编写完成后,运行时却发现,随着程序的运行,所占用的内存每 ...

  3. 使用Conda Pack打包Python独立运行时环境

    使用Conda Pack打包Python独立运行时环境 版本说明: python=2.7 Conda 的Pack工具,可以说是让我发现了新大陆.之前有个项目使用它解决了一个棘手的问题,一直没有整理相关 ...

  4. IDEA 启动tomcat 项目时控制台打印日志中文乱码

    在做一个新项目的时候发现,IDEA 启动tomcat 项目时控制台打印日志中文乱码 解决方案:点击Help-->Edit Custom VM Options 将   -Dfile.encodin ...

  5. python程序运行结果不停_关于python:在进程运行时不断打印Subprocess输出

    要从我的python脚本启动程序,我使用以下方法: def execute(command): process = subprocess.Popen(command, shell=True, stdo ...

  6. 解决多个py模块调用同一个python的logging模块,打印日志冲突问题

    前期对python中的logging模块进行了封装,这样自动化测试框架中的多个测试脚本(py)就可以使用同一个封装后的日志系统,这样各脚本中只需要引用一下即可,方面快捷.那么当我使用unittest框 ...

  7. linux内核启动时添加打印日志并验证的方法

    一.相关信息 内核版本: 5.0.1 方法名:pr_info(): 添加位置: linux-5.0.1/init# vim main.c 537 asmlinkage __visible void _ ...

  8. java slf4j日志级别_java - 在slf4j中设置运行时消息的日志级别 - 堆栈内存溢出

    ===============>>#1 票数:41 已采纳 使用slf4j无法做到这slf4j . 我想,缺少这个功能的原因是,几乎不可能为slf4j构建一个Level类型,它可以有效地映 ...

  9. python清理日志脚本_Python日志:如果在程序运行时删除了日志文件,则创建新的日志文件(RotatingFileHandler)...

    我有一个python程序在运行,它使用timedrotingfilehandler连续记录到一个文件.有时我想在不关闭程序的情况下获取日志文件,所以我只需将日志文件剪切并粘贴到不同的位置.在 程序不会 ...

  10. python shell运行当前程序、可以按下_Python下调用Linux的Shell命令的方法

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...

最新文章

  1. 深度丨如果机器人三定律被打破,我们可以做些什么?
  2. php-fpm进程数优化方法
  3. spring加载顺序
  4. WinAPI: Pie - 绘制饼图
  5. JavaScript 学习随记——==和===及常见元素的真假值
  6. 产品案例:这些呼声很高功能,微信为何还不做?
  7. RFID芯片有什么用
  8. 如何在Ubuntu-16.04 / 18.04上为 RTX 2080 Ti GPU 安装Nvidia驱动和cuda-10.0
  9. DB2 SQL执行计划
  10. 各种LINUX资源链接
  11. 五分钟科普:微信 PC 端多开的秘密
  12. 百度爬虫robots.txt文件规范
  13. matlab44矩阵,如何在MATLAB中将2X2矩阵转换为4X4矩阵?
  14. 你工作经验欠缺,如何能胜任这项工作?
  15. 公钥秘钥及加签验签那些事儿
  16. QPalette调色板
  17. 【PHP】PHP7新特性
  18. Windows Phone 7.5及诺基亚Lumia 800使用感受
  19. 仿六间房网页视频聊天室 网页视频直播系统源码
  20. 实现阿里云OSS文件上传

热门文章

  1. 《Crazy sand》感人的沙画艺术
  2. 给老师的作文:育儿经验-父母是孩子最好的老师
  3. 23.TCP/IP 详解卷1 --- TCP的保活定时器
  4. 5.CND技术详解---全局负载均衡工作原理及实现
  5. 24. yii2 表单赋值 model-load(), model-attributes 方法
  6. 32. iostat
  7. 10.数据管理(内存,文件锁)
  8. 5. Linux 设备文件名
  9. 49. 精简 JavaScript(10)
  10. css中绝对定位和浮动的异同