@mrz1
2017-12-04T00:43:26.000000Z
字数 4429
阅读 956
笔记
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: GPL
echo “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} $name
set
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 \n
time is \t
tty is \l
\S
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, $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 //括号里面相当于一个子进程
test
222
test
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 $sum
0
[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+=1
let var++
let var-=1
let var--
与 | 短路与 |
---|---|
只要有假;结果为假 | 只要有假;结果为假 |
两个都执行 | 如果第一个为假,将不执行第二个;如果第一个 为真,将执行第二个 |
非 | 短路非 |
---|---|
只要有真;结果为真 | 只要有真;结果为真 |
两个都执行 | 如果第一个为假,将执行第二个;如果第一个 为真,将不执行第二个 |
真或假 有一个为真,结果为真
a=6;b=8;a=[a^b];a=a;echo $b //a,b数值互换位置
详解:
[root@centos7 ~]#a=6;b=8;a=$[a^b];echo $a
14
[root@centos7 ~]#a=6;b=8;a=$[a^b];b=$[a^b] echo $a $b
14 8
[root@centos7 ~]#a=6;b=8;a=$[a^b];b=$[a^b];a=$[a^b];echo $a $b
8 6
6把六转换为二进制 110
8把八转换为二进制 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 false
false
[root@centos7 ~]#unset a
[root@centos7 ~]#[ "x$a" = "x" ] && echo true || echo false
true //这样写可以判断a是否有值
根据退出状态而定,命令可以有条件地运行
&& 代表条件性的AND THEN
|| 代表条件性的OR ELSE
-v VAR
变量VAR是否设置
数值测试:
-gt是否大于
-ge是否大于等于
-eq是否等于
-ne是否不等于
-lt是否小于
le是否小于等于
字符串测试:
== 是否等于
> ascii码是否大于ascii码
< 是否小于
!= 是否不等于
=~ 左侧字符串是否能够被右侧的PATTERN所匹配
注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
-z "STRING“字符串是否为空,空为真,不空为假
-n "STRING“字符串是否不空,不空为真,空为假
注意:用于字符串比较时的用到的操作数都应该使用引号
参考:[[用正则]] [普通表达式]