shell 编程基础

命令错误 后面的命令继续执行
语法错误 后面的命令不执行
bash -n 检查语法错位
bash -x 查看脚本的执行过程 【排错】
++文件属性上的 显示是嵌套命令
变量
  • 引用变量要加$符号 echo 是显示字符串的 如果命令能识别变量 可以不加$ 识别不了就压加$
  • 变量尽量用“ ”引起来 保留里面的格式
name =`whoami` echo “$name” 用双引号引起来 保留里面的格式
  • 弱类型 不指令类型
  • 强类型 指令类型
  • 变量的命令法则
  1. 不能以数字开头命令
  2. 关键字不能命令
  3. 大驼峰 第一个单词字母大写
  4. 小驼峰 第二个字母大写
  • 局部变量
  1. 普通变量
  2. 工作范围是当前进程
  • 看当前进程的命令 开启一个脚本就相当于在当前bash开启了个子进程
  1. echo $$ 表示当前的进程编号
  2. echo $PPID 查看父进程
  3. pstree -p 树状的显示进程
  • 全局变量 允许往下传 不能往上传
  1. export 跟赋值的名字(不加$) 把普通变量变成环境变量 或者 export name=多少
  2. 父进程的变量可以一直往下传 子进程的变量不能往下传
  3. 显示所有的环境变量 ;
env
printenv
export
declare -x
  1. set 显示的变量是最全的
  2. unset 删除变量 不删除变量 它的内存空间是不会释放的
  3. $SHLVL 嵌套深度 查看进程嵌套了几次
  4. echo $_ 上一个命令的最后一个参数调用 用echo 已字符串的形式显示
  • 只读变量 (常量) 只能声明 不能修改
  1. readonly 定义常量
  2. declare -r 查看常量 =readonly -p
  3. (命令)开启的子shell 一次有效
  4. name=wang ;echo $name( echo $name) 如果括号里的name没赋值 就不会开启子进程 就等同于外面的name
  5. { ;} 影响当前shell环境
  6. 10 以上要用花括号{}
  • scp ‘你要传的文件 名’ ‘对方的用户名’@‘对方的IP地址’:‘对方指定的目录路径’ (跨主机传输文件) :你要传的文件名要有执行权限 还要知道对方用户的密码
  • 位置变量
  1. 在脚本代码中调用通过命令行传递给脚本的参数
  2. $1 $2 $3 … :对应第1 第2,等参数
  3. $0 ; 命令本身 ·basename $0 去掉文件名的路径 显示文件名 ·
  4. $* 所有的参数 当系统会把所有的参数看成一个字符串
  5. $@ 也表示所有的字符串 但是每个参数为独立字符串
  6. $# 传递给脚本参数的个数
  7. set — 清空所有位置变量
  8. $@ $* 只有被双引号包起来的时候才会有差异
  9. shift 【n】 换位置 顶掉前面几个 成为第一个要执行的参数
退出状态查看
  1. 0 表示成功 1.。。255 表示失败
  2. $? 变量保存最近的命令退出状态 echo $? 查看
  3. 在脚本中 用echo $? 查看成功与失败 是取决 脚本中最后一条命令是否成功或失败 如果是语法错误 则不执行后面的命令 即echo $? 为1-255
  4. 在脚本后面 输入 exit后加 数字 那么你echo $? 的值就 你指定的 exit 后跟的数字
算数运算let
  1. +加 , -减, *乘,/除,%取余,**乘方
  2. 算数运算的几种格式
  • let name=name1+name2
  • name=$[name +name2]
  • expr 后面直接 2+3 就可以算出
  • declare -i var =数值
  1. let x++ = x=x+1 let x– = x=x-1 let count+=3 自加3后赋值
  2. declare -i x+=2 = x=x+2

与 或
  • &与 并且and
  1. 0&0=0
  2. 0&1=0
  3. 1&0=0
  4. 1&1=1
  • | 或者 or
  1. 0|0=0
  2. 0|1=1
  3. 1|0=1
  4. 1|1=1
  • 短路或【或者】 以 || 表示
  1. cmd1 || cmd 2 ; cmd1 为真 cmd2不执行 ;cmd1为假 cmd2 要执行
  2. 它的特点是优先找真 找不着真就往后执行
  3. FALSE || { echo cmd1 ;echo cmd2 } 为假时 ||的后面加大括号 里面的命令可以都执行
shell 编程基础
  • 短路与【并且】 以$$ 表示
  1. cmd1 && cmd 2
  2. cmd1 为假 cmd2 就不执行 ; cmd1 为真 cmd2 要执行
  3. &&短路与的特点是 优先找假 找不到假就往后执行
  • 异或 xor
  • 两个值是异样的 结果为真
  • 两个值是一样相同的 结果为假
  • 非 取反 : !
  • tmp 临时变量 可以实现两个数互换
即: a=4 b=6 tpm=$a (把a的值临时放在tmp里) 再使a=$b b=$tpm 实现装换
条件测试 test 或者 [ ]
  • test 格式 test $str1 = $str2 或者 【 $str1 = $str2 】
  1. 比较字符串 != 是否 不等
  2. = 是否相等
  3. != 是否不等于
  4. < 是否
  5. -z 看字符串是否为0 空 空为真 不空为假
  6. -n 看字符是否为非空 不空为真 空为假 或者 【 】表示
  7. -v 判断变量是否被设置的
  8. =~ 左边的字符串是否能够被右侧的pattern(可以写扩展正则表达式)所匹配
注意 : 此表达式一般用在【【】】中 ;扩展的正则表达式
注意 用于字符串比较时的用到的操作都应该使用引号
【【 == * 星为通配符 】】 == 相等 != 不等
比较数字的
  1. -eq 相等
  2. -nq 不等
  3. -lt 小于
  4. -le 小于等于
  5. -gt 大于
  6. -ge 大于等于
  7. -ne 是否不等于
变量在中括号里写的话 要加双引号引起开 避免出现问题
  • 文件判断 file
  1. -a 判断文件是否存在 -e 一样
  2. -b 判断文件是否为块文件
  3. -c 判断文件是否为字符文件
  4. -d 判断文件是否为文件夹
  5. -f 判断文件是否问普通文件
  6. -L判断文件是否为软链接
  7. -h 存在且为符号链接文件
  8. -p 是否存在且为命令管道文件
  9. -S是否存在且为套接字文件
  10. -s 是否存在且非空
  11. -N 文件自从上一次被读取之后是否被修改过
  12. -O 当前有效用户是否为文件属主
  13. -G 当前有效用户是否为文件属组
  14. -r 判断文件是否可读
  15. -w 判断文件是否可写 权限是看的实际权限
  16. -x 判断文件是否有执行权
  17. -u 是否有suid权限
  18. -g 是否有sgid 权限
  19. -k 是否有sticky 权限

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/96002

(0)
王乐王乐
上一篇 2018-04-15
下一篇 2018-04-15

相关推荐

  • shell脚本进阶-课后练习题答案

    答案不唯一,不足之处请各位大佬多多支教

    2018-05-05
  • HAProxy反向代理

    HAProxy的简单配置实现反向代理服务器的功能:(有自动的健康性检查的功能) 程序环境:主程序:/usr/sbin/haproxy主配置文件:/etc/haproxy/haproxy.cfgUnit file:/usr/lib/systemd/system/haproxy.service 官网文档: http://cbonte.github.io/hapr…

    2018-07-09
  • MySQL数据库服务

    MySQL数据库的安装

    2018-06-12
  • 生产环境中数据文件删除,空间不释放问题

    首先数据文件删除文件系统空间不释放的问题不只出现在Linux平台,所有平台都可能有这样的问题。这里只是在Linux平台做一些测试,其他平台类似;其次只有将数据文件存放在文件系统中才会有此类问题。空间没有释放我们可能是通过df命令确认的,当我们用du去扫描目录的大小可能会发现df和du两个命令看到的空间使用情况是不同的,可能差别很大,找了一些文档,解决了这个问题;写这篇博客,希望跟大家分享一下。

    2018-05-18
  • Linux文件管理类命令

    一,linux 文件管理类命令 ls 命令:list directory contents;列出指定目录下的内容 SYNOPSIS: ls [OPTION]… [FILE]… OPTION: -a :–al显示所有文件,包括隐藏文件 -A :–almost-all:显示除 . 和 ..外的所有文件 -l :–long 长格式显示列表,即文件的详细属性信息 -…

    2018-05-15
  • TCP/IP协议栈 和IP地址规划

    TCP/IP IP地址的规划

    2018-05-15