@mrz1
2017-12-04T00:43:26.000000Z
字数 4429
阅读 1045
笔记
scp xxxxxxx wang@172.18.1.124: //把xxxxx文件发送给wang
scp -r wang@172.18.1.124:/home/wang/scripts /app/把wang目录下scripts备份自己/app目录一份
ctrl+v 选中要移动的区域
输入I 添加要插入的东西
之后按esc
脚本代码开头约定
1. 第一行一般为调用使用的语言
2. 程序名,避免更改文件名为无法找到正确的文件
3. 版本号
4. 更改后的时间
5. 作者相关信息
6. 该程序的作用,及注意事项
7. 最后是各版本的更新简要说明
#!/bin/bash# ------------------------------------------# Filename: hello.sh# Revision: 1.1# Date: 2017/06/01# Author: wang# Email: wang@gmail.com# Website: www.magedu.com# Description: This is the first script# ------------------------------------------# Copyright: 2017 wang# License: GPLecho “hello world”
检测脚本中的语法错误
bash -n f1.sh
调试执行
bash -x f1.sh
根据变量的生效范围等标准划分下面变量类型:
局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
环境(全局)变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常指函数
位置变量:$1, $2,...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
特殊变量:$?, $0, $*, $@, $#,$$
ps aux 查看进程
echo $$ 查看当前进程编号
pstree -p 查看进程树
./f3.sh
bash ./f3.sh
变量赋值:name=‘value’
name="root" name="$USER" name=`COMMAND` name=$(COMMAND) ${name} $nameset set | less 翻页显示 unset name
[root@centos7 app]#name=`cat /etc/issue`[root@centos7 app]#echo $name //不加双引号,会把内容换行取消The hostname is \n time is \t tty is \l \S Kernel \r on an \m[root@centos7 app]#echo "$name"The hostname is \ntime is \ttty is \l\SKernel \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, $2, ...:对应第1、第2等参数,shift [n]换位置(如果n大于10以上加上{};例$10,不加的话会认为是$1和0)$0: 命令本身$*: 传递给脚本的所有参数,全部参数合为一个字符串$@: 传递给脚本的所有参数,每个参数为独立字符串$#: 传递给脚本的参数的个数$@ $* 只在被双引号包起来的时候才会有差异$@(传进来参数个数不发生变化)$*(会把所有参数当做一个整体传进来)set -- 清空所有位置变量
[root@centos7 app]# name=test;( echo $name; name=222;echo $name );echo $name //括号里面相当于一个子进程test222test
basename 取基名
shift再变量中每写一次就删除第一参数,第二参数变为第一个了。。。
进程使用退出状态来报告成功或失败
0 代表成功,1-255代表失败
$?变量保存最近的命令退出状态?
例如:
ping -c1 -W1 hostdown &> /dev/null
echo $?
特殊:
[root@centos7 ~]#i=10[root@centos7 ~]#j=-10[root@centos7 ~]#let sum=i+j[root@centos7 ~]#echo $?1[root@centos7 ~]#echo $sum0
[root@centos7 ~]#i=0;let i++;echo $?1[root@centos7 ~]#i=0;let ++i;echo $?0[root@centos7 ~]#let m=0;echo $?1
help let 最后说明:
退出状态:
如果最后的ARG评估为0,让返回1; 否则返回0。
exit [n]:自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
+, -, *, /, %取模(取余), **(乘方)实现算术运算:(1) let var=算术表达式(2) var=$[算术表达式](3) var=$((算术表达式))(4) var=$(expr arg1 arg2 arg3 ...)(5) declare –ivar= 数值(6) echo ‘算术表达式’ | bc乘法符号有些场景中需要转义,如*bash有内建的随机数生成器:$RANDOM(0-32767)echo $[$RANDOM%50] :0-49之间随机数增强型赋值:+=, -=, *=, /=, %=let varOPERvalue 例如:let count+=3 //自加3后自赋值自增,自减:let var+=1let var++let var-=1let var--
| 与 | 短路与 |
|---|---|
| 只要有假;结果为假 | 只要有假;结果为假 |
| 两个都执行 | 如果第一个为假,将不执行第二个;如果第一个 为真,将执行第二个 |
| 非 | 短路非 |
|---|---|
| 只要有真;结果为真 | 只要有真;结果为真 |
| 两个都执行 | 如果第一个为假,将执行第二个;如果第一个 为真,将不执行第二个 |
真或假 有一个为真,结果为真
a=6;b=8;a=[a^b];a=a;echo $b //a,b数值互换位置
详解:
[root@centos7 ~]#a=6;b=8;a=$[a^b];echo $a14[root@centos7 ~]#a=6;b=8;a=$[a^b];b=$[a^b] echo $a $b14 8[root@centos7 ~]#a=6;b=8;a=$[a^b];b=$[a^b];a=$[a^b];echo $a $b8 66把六转换为二进制 1108把八转换为二进制 1000第一次a异或的时候a=1001 二进制是9第二次b异或的时候b= 110 二进制是6第三次a异或的时候a=1000 二进制是8
判断某需求是否满足,需要由测试机制来实现
专用的测试表达式需要由测试命令辅助完成测试过程
测试命令:test EXPRESSION``[ EXPRESSION ]``[[ EXPRESSION ]]
注意:EXPRESSION前后必须有空白字符 ;推荐使用
[ EXPRESSION ]
[root@centos7 ~]#str1=abc[root@centos7 ~]#str2=cba[root@centos7 ~]#test $str1 = $str2[root@centos7 ~]#echo $?1[root@centos7 ~]#[ $str1 = $str2 ][root@centos7 ~]#echo $?1[root@centos7 ~]#[ $str1 != $str2 ][root@centos7 ~]#echo $?0
[ 这里面只要有东西就为真 里面变量需要加引号 ]
如果不加的话会出现想不到的结果^_^!
[root@centos7 ~]#a=" "[root@centos7 ~]#[ "x$a" = "x" ] && echo true || echo falsefalse[root@centos7 ~]#unset a[root@centos7 ~]#[ "x$a" = "x" ] && echo true || echo falsetrue //这样写可以判断a是否有值
根据退出状态而定,命令可以有条件地运行
&& 代表条件性的AND THEN
|| 代表条件性的OR ELSE
-v VAR变量VAR是否设置数值测试:-gt是否大于-ge是否大于等于-eq是否等于-ne是否不等于-lt是否小于le是否小于等于
字符串测试:== 是否等于> ascii码是否大于ascii码< 是否小于!= 是否不等于=~ 左侧字符串是否能够被右侧的PATTERN所匹配注意: 此表达式一般用于[[ ]]中;扩展的正则表达式-z "STRING“字符串是否为空,空为真,不空为假-n "STRING“字符串是否不空,不空为真,空为假注意:用于字符串比较时的用到的操作数都应该使用引号
参考:[[用正则]] [普通表达式]