[关闭]
@mrz1 2017-12-04T00:43:26.000000Z 字数 4429 阅读 842

2017-11-22课程笔记(vim shell)

笔记


  1. vi和vim区别?
    vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面

scp xxxxxxx wang@172.18.1.124: //把xxxxx文件发送给wang

scp -r wang@172.18.1.124:/home/wang/scripts /app/把wang目录下scripts备份自己/app目录一份

vim块操作

ctrl+v 选中要移动的区域
输入I 添加要插入的东西
之后按esc

创建shell脚本

第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
!/bin/bash
添加注释
注释以#开头
第二步:运行脚本
给予执行权限,在命令行上指定脚本的绝对或相对路径
直接运行解释器,将脚本作为解释器程序的参数运行

脚本规范

脚本代码开头约定
1. 第一行一般为调用使用的语言
2. 程序名,避免更改文件名为无法找到正确的文件
3. 版本号
4. 更改后的时间
5. 作者相关信息
6. 该程序的作用,及注意事项
7. 最后是各版本的更新简要说明

shell脚本示例

  1. #!/bin/bash
  2. # ------------------------------------------
  3. # Filename: hello.sh
  4. # Revision: 1.1
  5. # Date: 2017/06/01
  6. # Author: wang
  7. # Email: wang@gmail.com
  8. # Website: www.magedu.com
  9. # Description: This is the first script
  10. # ------------------------------------------
  11. # Copyright: 2017 wang
  12. # License: GPL
  13. echo hello world

脚本调试

检测脚本中的语法错误
bash -n f1.sh
调试执行
bash -x f1.sh

变量命名法则:

  1. 不能使程序中的保留字:例如if, for
  2. 只能使用数字、字母及下划线,且不能以数字开头
  3. 见名知义
  4. 统一命名规则:驼峰命名法

bash中变量的种类

根据变量的生效范围等标准划分下面变量类型:

局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
环境(全局)变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常指函数
位置变量:$1, $2,...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
特殊变量:$?, $0, $*, $@, $#,$$

ps aux 查看进程
echo $$ 查看当前进程编号
pstree -p 查看进程树

脚本执行:

./f3.sh
bash ./f3.sh

局部变量

变量赋值:name=‘value’

可以使用引用value:
(1) 可以是直接字串; name="root"
(2) 变量引用:name="$USER"
(3) 命令引用:name=`COMMAND` name=$(COMMAND)
变量引用:${name} $name
"":弱引用,其中的变量引用会被替换为变量值
'':强引用,其中的变量引用不会被替换为变量值,而保持原字符串
显示已定义的所有变量:set
set | less 翻页显示
删除变量:unset name
  1. [root@centos7 app]#name=`cat /etc/issue`
  2. [root@centos7 app]#echo $name //不加双引号,会把内容换行取消
  3. The hostname is \n time is \t tty is \l \S Kernel \r on an \m
  4. [root@centos7 app]#echo "$name"
  5. The hostname is \n
  6. time is \t
  7. tty is \l
  8. \S
  9. Kernel \r on an \m

环境变量

变量声明、赋值:export name=VALUE declare -x name=VALUE
变量引用:$name, ${name}
显示所有环境变量:
env
printenv
export
declare -x
删除变量:unset name
bash内建的环境变量:SHLVL 查看内嵌的深度 $_ 上一个命令最后一个参数

只读变量:只能声明,但不能修改和删除

声明只读变量:readonly name declare -r name
查看只读变量:readonly –p

位置变量:在脚本代码中调用通过命令行传递给脚本的参数

  1. $1, $2, ...:对应第1、第2等参数,shift [n]换位置(如果n大于10以上加上{};例$10,不加的话会认为是$10
  2. $0: 命令本身
  3. $*: 传递给脚本的所有参数,全部参数合为一个字符串
  4. $@: 传递给脚本的所有参数,每个参数为独立字符串
  5. $#: 传递给脚本的参数的个数
  6. $@ $* 只在被双引号包起来的时候才会有差异
  7. $@(传进来参数个数不发生变化)
  8. $*(会把所有参数当做一个整体传进来)
  9. set -- 清空所有位置变量
  1. [root@centos7 app]# name=test;( echo $name; name=222;echo $name );echo $name //括号里面相当于一个子进程
  2. test
  3. 222
  4. test

basename 取基名

shift 再变量中每写一次就删除第一参数,第二参数变为第一个了。。。

退出状态?

进程使用退出状态来报告成功或失败
0 代表成功,1-255代表失败
$?变量保存最近的命令退出状态?
例如:
ping -c1 -W1 hostdown &> /dev/null
echo $?
特殊:

  1. [root@centos7 ~]#i=10
  2. [root@centos7 ~]#j=-10
  3. [root@centos7 ~]#let sum=i+j
  4. [root@centos7 ~]#echo $?
  5. 1
  6. [root@centos7 ~]#echo $sum
  7. 0
  1. [root@centos7 ~]#i=0;let i++;echo $?
  2. 1
  3. [root@centos7 ~]#i=0;let ++i;echo $?
  4. 0
  5. [root@centos7 ~]#let m=0;echo $?
  6. 1

help let 最后说明:
退出状态:
     如果最后的ARG评估为0,让返回1; 否则返回0。

bash自定义退出状态码

exit [n]:自定义退出状态码

注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

bash中的算术运算:help let

  1. +, -, *, /, %取模(取余), **(乘方)
  2. 实现算术运算:
  3. (1) let var=算术表达式
  4. (2) var=$[算术表达式]
  5. (3) var=$((算术表达式))
  6. (4) var=$(expr arg1 arg2 arg3 ...)
  7. (5) declare ivar= 数值
  8. (6) echo ‘算术表达式’ | bc
  9. 乘法符号有些场景中需要转义,如*
  10. bash有内建的随机数生成器:$RANDOM0-32767
  11. echo $[$RANDOM%50] 0-49之间随机数
  12. 增强型赋值:+=, -=, *=, /=, %=
  13. let varOPERvalue 例如:let count+=3 //自加3后自赋值
  14. 自增,自减:
  15. let var+=1
  16. let var++
  17. let var-=1
  18. let var--

练习

  1. 编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
  2. 编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
  3. 编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

与或非

短路与
只要有假;结果为假 只要有假;结果为假
两个都执行 如果第一个为假,将不执行第二个;如果第一个 为真,将执行第二个
短路非
只要有真;结果为真 只要有真;结果为真
两个都执行 如果第一个为假,将执行第二个;如果第一个 为真,将不执行第二个

真或假 有一个为真,结果为真

异或

a=6;b=8;a=[a^b];a=a;echo $b //a,b数值互换位置
详解:

  1. [root@centos7 ~]#a=6;b=8;a=$[a^b];echo $a
  2. 14
  3. [root@centos7 ~]#a=6;b=8;a=$[a^b];b=$[a^b] echo $a $b
  4. 14 8
  5. [root@centos7 ~]#a=6;b=8;a=$[a^b];b=$[a^b];a=$[a^b];echo $a $b
  6. 8 6
  7. 6把六转换为二进制 110
  8. 8把八转换为二进制 1000
  9. 第一次a异或的时候a=1001 二进制是9
  10. 第二次b异或的时候b= 110 二进制是6
  11. 第三次a异或的时候a=1000 二进制是8

条件测试

判断某需求是否满足,需要由测试机制来实现
专用的测试表达式需要由测试命令辅助完成测试过程

评估布尔声明,以便用在条件性执行中
若真,则返回0
若假,则返回1

测试命令:test EXPRESSION``[ EXPRESSION ]``[[ EXPRESSION ]]

注意:EXPRESSION前后必须有空白字符 ;推荐使用[ EXPRESSION ]

  1. [root@centos7 ~]#str1=abc
  2. [root@centos7 ~]#str2=cba
  3. [root@centos7 ~]#test $str1 = $str2
  4. [root@centos7 ~]#echo $?
  5. 1
  6. [root@centos7 ~]#[ $str1 = $str2 ]
  7. [root@centos7 ~]#echo $?
  8. 1
  9. [root@centos7 ~]#[ $str1 != $str2 ]
  10. [root@centos7 ~]#echo $?
  11. 0

[ 这里面只要有东西就为真 里面变量需要加引号 ]

如果不加的话会出现想不到的结果^_^!

  1. [root@centos7 ~]#a=" "
  2. [root@centos7 ~]#[ "x$a" = "x" ] && echo true || echo false
  3. false
  4. [root@centos7 ~]#unset a
  5. [root@centos7 ~]#[ "x$a" = "x" ] && echo true || echo false
  6. true //这样写可以判断a是否有值

条件性的执行操作符

根据退出状态而定,命令可以有条件地运行

&& 代表条件性的AND THEN
|| 代表条件性的OR ELSE

bash的数值测试

  1. -v VAR
  2. 变量VAR是否设置
  3. 数值测试:
  4. -gt是否大于
  5. -ge是否大于等于
  6. -eq是否等于
  7. -ne是否不等于
  8. -lt是否小于
  9. le是否小于等于

bash的字符串测试

  1. 字符串测试:
  2. == 是否等于
  3. > ascii码是否大于ascii
  4. < 是否小于
  5. != 是否不等于
  6. =~ 左侧字符串是否能够被右侧的PATTERN所匹配
  7. 注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
  8. -z "STRING“字符串是否为空,空为真,不空为假
  9. -n "STRING“字符串是否不空,不空为真,空为假
  10. 注意:用于字符串比较时的用到的操作数都应该使用引号

参考:[[用正则]] [普通表达式]

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注