设为首页 收藏本站
查看: 859|回复: 0

Linux Bash基础特性之Shell脚本编程

[复制链接]

尚未签到

发表于 2018-8-22 11:20:20 | 显示全部楼层 |阅读模式

  •   编程基础
  程序:指令+数据
  过程式:以指令为中心,数据服务于指令
  对象式:以数据为中心,指令服务于数据
  Shell程序:提供了编程能力,解释执行
  计算机:运行二进制指令
  编程语言
  低级语言
  汇编语言
  高级语言
  编译型:高级语言-->编译器-->目标代码    如Java,C#
  解释型:高级语言-->解释器-->机器代码   shell,perl,python
  编程逻辑处理方式:
  顺序执行
  循环执行
  选择执行
  shell编程:过程式,解释执行

  •   shell脚本基础知识
  shell脚本基础
  命令的堆砌,包含一些命令或声明,并符合一定格式的文本文件
  格式要求:首行shebang机制
  #!/bin/bash
  #!/bin/python
  #!/usr/bin/perl
  shell脚本用途
  自动化常用命令
  执行系统管理和故障排除
  创建简单的应用程序
  处理文本或文件
  创建shell脚本
  第一步:使用文本编辑器来创建文件
  第一行必须包括shell声明序列:#!
  #!/bin/bash
  添加注释
  注释以#开头
  第二步:运行脚本
  给予执行权限,在命令行上指定脚本的绝对或相对路径
  直接运行解释器,将脚本作为解释器程序的参数运行
  脚本规范
  代码开头约定
  1.第一行一般为调用使用的语言
  2.程序名,避免更改文件名为无法找到正确的文件
  3.版本号
  4.更改后的时间
  5.作者相关信息
  6.该程序的作用,及注意事项
  7.最后是各版本的更新简要说明
  脚本的基本结构
  #!SHEBANG
  CONFIGURATION_VARIABLES
  FUNCTION_DEFINITIONS
  MAIN_CODE
  脚本示例
DSC0000.jpg

  脚本调试
  检测脚本中的语法错误    bash -n  /path/to/some_script
  调试执行          bash -x   /path/to/some_script

  •   变量
  变量:命令的内存空间
  强类型:变量不经过转换,它永远是这个数据类型,不允许隐式的类型转换。一般定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误   如Java,C#
  弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用   如bash(不支持浮点数),php
  变量赋值
  NAME='VALUE'
  value:
  字符串
  name='string'
  变量引用
  name=“$USER"
  命令引用
  name=`COMMAND`
  name=$(COMMAND)
  "  ":弱引用,变量会被替换为变量值
DSC0001.jpg

  '   ':强引用,变量不会被替换,保持原有字符串
DSC0002.jpg

  变量引用
  $VAR_NAME
  $(VAR_NAME)
  ${VAR_NAME}
  变量命令规则:
  1.由字母、数字、下划线组成且不能以数字开头
  2.不能使用程序中的保留字 if或for等
  3.见名知意
  4.统一规则,骆峰命名法
  显示所有变量  set
  删除变量   unset Var_name
  bash中变量的种类
  局部变量(普通变量)
  生效范围为当前shell进程
  环境变量(全局变量)
  生效范围为当前shell进程及其子进程
  声明:
  export var_name=VALUE
  declare -x var_name=VALUE
  显示所有环境变量
  export
  declare -x
  env
  printenv
  本地变量
  生效范围为当前shell进程中某代码片断,通常指函数
  位置变量   用于让脚本代码中调用通过命令行传递给它的参数
  $1,$2,$3,...:传递给脚本的第一个参数,第二个,第三个,...
  shift [n]:向左整体移动位置参数   可以指定移n位,默认移一位
  set -- 清空所有位置变量
  特殊变量
  $#:传递给脚本的参数个数
  $0:命令本身
  $*:传递给脚本的全部参数,全部参数合为一个整体字符串
  $@:传递给脚本的全部参数,每个参数是独立的字符串
  $*和$@只有在被“ ”引起来时才有差异
  只读变量(常量)
  只能使用,不能修改和删除
  声明:
  Readonly Var_name
  declare -r Var_name
  显示只读变量
  readonly
  declare -r
  bash内建的环境变量
  PATH
  SHELL
  SHLVL
  USER
  UID
  HOME
  LANG
  MAIL
  HISTSIZE
  HOSTNAME
  —
  执行状态返回值
  0:成功
  非0(1-255):失败
  bash自定义退出状态码
  exit [n] 自定义退出状态码
  脚本中遇到exit命令,脚本会立即终止,终止退出状态取决于exit命令后面的数字
  如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本执行最后一条命令的状态码

  •   运算
  算术运算
  bash中的算术运算有:
  +,-,*,/,%取余(取模),**乘方
  (1) let var=算术表达式
  (2) var=$[算术表达式]
  (3) var=$[[算术表达式]]
  (4) var=$((算术表达式))
  (5) var=$(expr arg1 arg2 arg3...)    有些场景乘号*需要转义\*
  (6) declare -i var=数值
  (7) echo '算术表达式' | bc
  逻辑运算
  与   and   &
  运算规则:真真为真,有一个为假就为假
  1 & 1 = 1
  0 & 1 = 0
  1 & 0 = 0
  0 & 0 = 0
  或   or   |
  运算规则:假假为假,有一个为真就为真假
  0 & 0 = 0
  1 & 0 = 1
  0 & 1 = 1
  1 & 1 = 1
  非  not  !
  取反
  异或  xor  ^
  运算规则:相同为假,不同为真
  1 ^ 1 = 1
  0 ^ 0 = 1
  1 ^ 0 = 0
  0 ^ 1 = 0
  交换两个变量的值可以使用此运算
  短路与  &&
  1 && 1 = 1
  0 && 1 = 0
  1 && 0 = 0
  0 && 0 = 0
  com1为真,需要执行cmd2;cmd1为假,不执行cmd2
  短路或   | |
  0 || 0 = 0
  1 || 0 = 1
  0 || 1 = 1
  1 || 1 = 1
  cmd1为假,需要执行cmd2;cmd1为真,不执行cmd2

  •   测试
  条件测试
  test EXPRESSION
  [ EXPRESSION ]
  [[ EXPRESSION ]]
  EXPRESSION前后必须有空格
  数值测试
  -eq   等于
  -ne   不等于
  -le    小于等于
  -lt     小于
  -gt    大于
  -ge   大于等于
  字符串测试
  ==     是否等于
  !=     不等于
  <       左边Ascii码是否小于右边
  >      左边ASCII码是否大于右边
  =~    左侧字符串是否能够被右侧的PATTERN所匹配
  此表达式一般用于[[   ]]中;扩展的正则表达式且右边的PATTERN不加“”双引号
  -z &quot;String&quot;  字符串是否为空   空为真,不空为假
  -n &quot;String&quot;  字符串是否不空  不空为真,空为假
  用于字符串比较时用到的操作数都必须加引号
  文件测试
  -a|-e FILE:文件是否存在
  -b FILE:是否存在且为块设备文件
  -c FILE:是否存在且为字符设备文件
  -d FILE:是否存在且为目录文件
  -f FILE:是否存在且为普通文件
  -h FILE或-L FILE:是否存在且为符号链接文件
  -p FILE:是否存在且为命名管道文件
  -S FILE:是否存在且为套接字文件
  文件权限测试
  -r FILE:是否存在且可读
  -w FILE:是否存在且可写
  -x FILE:是否存在且可执行
  -u FILE:是否存在且拥有suid权限
  -g FILE:是否存在且拥有sgid权限
  -k FILE:是否存在且拥有sticky权限
  文件大小测试
  -s FILE:是否存在且非空

  •   Read命令
  使用read命令接受输入,把输入值分配给一个或多个shell变量
  -p  指定要显示的提示
  -s   静默输入,一般用于密码
  -n #  指定输入字符长度为#
  -d  '字符'  输入结束符
  -t #  TIMEOUT为#秒
  read 从标准输入中读取值,给每个单词分配一个变量   所有剩余单词都被分配给最后一个变量
  read -p &quot;Enter a filename:&quot; FILE

  •   配置用户环境
  bash的配置文件
  按生效范围划分:
  全局
  /etc/profile
  /etc/profile.d/*.sh
  /etc/bashrc
  个人
  ~/.bash_profile
  ~/.bashrc
  shell的两种登录方式
  交互式登录
  (1)直接通过终端输入账号密码登录
  (2)使用su - Username 切换的用户
  执行顺序:/etc/profile-->/etc/profile.d/*.sh-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
  非交互式登录
  (1)su Username
  (2)图形界面下打开的终端
  (3)执行脚本
  (4)任何其它bash实例
  执行顺序:~/.bashrc-->/etc/bashrc-->/etc/profile.d/*.sh
  bash配置文件按功能划分:
  Profile类  为交互式登录的shell提供配置
  全局:/etc/profile,/etc/profile.d/*.sh
  个人:~/.bash_profile
  功用:
  1、定义环境变量
  2、运行命令或脚本
  Bashrc类  为交互式登录和非交互式登录的shell提供配置文件
  全局:/etc/bashrc
  个人:~/.bashrc
  功用:
  1、定义命令别名和函数
  2、定义本地变量
  Bash退出任务
  保存在~/.bash_logout文件中,在退出登录shell时运行
  功用:
  1、创建自动备份
  2、清除临时文件
  编辑配置文件生效
  修改profile和bashrc文件后需要生效
  1、重新启动shell进程
  2、source或 .


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-555064-1-1.html 上篇帖子: shell特殊符 _cut命令 sort_wc_uniq命令 tee_tr_split命令 下篇帖子: shell和python对比对目录下不同文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表