加强学校网站建设和宣传工作,图片设计在线生成,温州做网站哪儿,填空秒懂网站文章目录一、shell 编程1.1. 脚本执行1.2. 变量1.3. 特殊变量1.4. 运算符1.5. for 循环1.6. while 循环1.7. case 语句1.8. read 命令1.9. if 判断1.10. 判断语句1.11. 自定义函数1.12. 脚本调试二、sed2.1. sed 选项2.2. sed function2.3. sed 删除#xff08;d 命令#xf…
文章目录一、shell 编程1.1. 脚本执行1.2. 变量1.3. 特殊变量1.4. 运算符1.5. for 循环1.6. while 循环1.7. case 语句1.8. read 命令1.9. if 判断1.10. 判断语句1.11. 自定义函数1.12. 脚本调试二、sed2.1. sed 选项2.2. sed function2.3. sed 删除d 命令2.4. sed 替换s 命令2.5. 多点编辑e 命令2.6. 插入i 命令三、awk3.1. 三种调用方式3.2. 实例3.3. 内置变量3.4. awk 编程3.5. 参考四、自动化部署脚本4.1. 安装 jdk4.2. ssh 免密一、shell 编程
1.1. 脚本执行
# 1. 输入脚本绝对路径或相对路径需要先添加脚本的执行权限x
./case.sh
/root/case.sh# 2. 用解释器执行脚本
sh case.sh# 3. 在脚本的路径前再加 ‘.’1和2 会新开一个 bash变量不共享3 不会新开 bash
./root/case.sh
../case.sh1.2. 变量
1. 变量值 例如STRabc
2. 等号两侧不能有空格
3. 变量名称一般习惯为大写
4. 双引号和单引号有区别双引号仅将空格脱意单引号会将所有特殊字符脱意STRhello world
A9
unset A # 撤销变量 A
readonly B2 # 声明静态的变量 B2 不能 unset
export A # export 变量名 可把变量提升为全局环境变量可供其他shell程序使用# 将命令的返回值赋给变量
Als -la # 反引号运行里面的命令并把结果返回给变量A
A$(ls -la) # 等价于反引号1.3. 特殊变量
$? # 表示上一个命令退出的状态
$$ # 表示当前进程编号
$0 # 表示当前脚本名称
$n # 表示n位置的输入参数n代表数字n1
$# # 表示参数的个数常用于循环
$* # 表示参数列表
$ # 和 $*都表示参数列表 $* 和 $ 都表示传递给函数或脚本的所有参数不被双引号 包含时都以$1 $2 … $n 的形式输出所有参数
当它们被双引号 “包含时”$* 会将所有的参数作为一个整体以$1 $2 … n的形式输出所有参数n的形式输出所有参数n的形式输出所有参数 会将各个参数分开以$1 “2…2 … 2…n” 的形式输出所有参数
1.4. 运算符
# 格式 :expr m n 或 $((mn)) 注意expr运算符间要有空格
# 例如计算2 3 ×4 的值# 分步计算
Sexpr 2 3
expr $S \* 4# 一步完成计算
expr expr 2 3 \* 4
echo expr \expr 2 3\ \* 4
# 或
$(((23)*4))1.5. for 循环
for N in 1 2 3
doecho $N
done
# 或
for N in 1 2 3; do echo $N; done
# 或
for N in {1..3}; do echo $N; donefor ((i 0; i 5; i))
doecho welcome $i times
done
# 或
for ((i 0; i 5; i)); do echo welcome $i times; done1.6. while 循环
while expression
do# command# …
donei1
while ((i3))
doecho $ilet i
done1.7. case 语句
case $1 in
start)echo starting;;
stop)echo stoping;;
*)echo Usage: {start|stop}
esac1.8. read 命令
# read -p(提示语句)-n(字符个数) -t(等待时间)
read -p please input your name: NAME
please input your name: aure
echo $NAME
aure1.9. if 判断
# 语法
if condition
thenstatements
[elif conditionthen statements. ..]
[elsestatements ]
fi# if例子
#!/bin/bash
read -p please input your name: NAME
# printf %s\n $NAME
if [ $NAME root ]
thenecho hello ${NAME}, welcome !
elif [ $NAME itcast ]thenecho hello ${NAME}, welcome !
elseecho SB, get out here !
fi1.10. 判断语句
[ condition ] # 注意condition前后要有空格
[ test ]# 非空返回true可使用 $? 验证0为true1为false
[ ] # 空返回false
[ condition ] echo OK || echo notok # 条件满足执行后面的语句常用判断条件 字符串比较-lt 小于-le 小于等于-eq 等于-gt 大于-ge 大于等于-ne 不等于-r 有读的权限-w 有写的权限-x 有执行的权限-f 文件存在并且是一个常规的文件-s 文件存在且不为空-d 文件存在并是一个目录-b文件存在并且是一个块设备-L 文件存在并且是一个链接[外链图片转存失败,源站可能有防盗链image!机制,建png]接上传mattachment:g-e.png)attachment:image.png)]
1.11. 自定义函数
# 语法[ function ] funname [()]
{action;[return int;]
}function start() / function start / start()#!/bin/bash
fSum 3 2;
function fSum()
{echo $1,$2;return $(($1$2));
}
fSum 5 7;
total$?;
echo $total,$?;必须在调用函数地方之前先声明函数shell脚本是逐行运行。不会像其它语言一样先预编译函数返回值只能通过$? 系统变量获得可以显示加return 返回如果不加将以最后一条命令运行结果作为返回值。 return后跟数值n(0-255)
1.12. 脚本调试
sh -vx helloWorld.sh # 或者在脚本中增加set -x二、sed
sed 全称是Stream EDitor即流编辑器是一个很好的文本处理工具本身是一个管道命令处理时把当前处理的行存储在临时缓冲区中接着用sed命令处理缓冲区中的内容处理完成后把缓冲区的内容送往屏幕。接着处理下一行。它是以行为单位进行处理可以将数据行进行替换、删除、新增、选取等特定工作
2.1. sed 选项
-n 使用安静(silent)模式。在一般 sed 的用法中所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后则只有经过sed 特殊处理的那一行(或者动作)才会被列出来-e 直接在命令列模式上进行 sed 的动作编辑-i 直接修改读取的文件内容而不是输出到终端
2.2. sed function
a 新增 a 的后面可以接字串而这些字串会在新的一行出现(目前的下一行)d 删除因为是删除啊所以 d 后面通常不接任何内容i 插入 i 的后面可以接字串而这些字串会在新的一行出现(目前的上一行)p 列印亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行s 取代可以直接进行取代的工作通常这个 s 的动作可以搭配正规表示法例如 1,20s/old/new/g
2.3. sed 删除d 命令
# 删除 exp 第二行
sed 2d exp# 删除第二到末尾的所有行
sed 2,$d exp# 删除 exp 文件的最后一行
sed $d exp# 删除exp 中包含 cc 的行
sed /cc/d exp2.4. sed 替换s 命令
# 在整行范围内把test替换为mytest。如果没有g标记则只有每行第一个匹配的test被替换成mytest。
sed s/test/mytest/g example# (-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说如果某一行开头的test被替换成mytest就打印它。
sed -n s/^test/mytest/p example# 符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost变成192.168.0.1localhost。
sed s/^192.168.0.1/localhost/ example# love被标记为1所有loveable会被替换成lovers而且替换的行会被打印出来。
sed -n s/\(love\)able/\1rs/p example# 不论什么字符紧跟着s命令的都被认为是新的分隔符所以“#”在这里是分隔符代替了默认的“/”分隔符。表示把所有10替换成100。
sed s#10#100#g example# 选定行的范围逗号
sed -n /test/,/check/p example # 所有在模板test和check所确定的范围内的行都被打印。# 打印从第五行开始到第一个包含以test开始的行之间的所有行。
sed -n 5,/^test/p example# 对于模板test和check之间的行每行的末尾用字符串sed test替换。
sed /test/,/check/s/$/sed test/ example2.5. 多点编辑e 命令
# (-e)选项允许在同一行里执行多条命令。如例子所示第一条命令删除1至5行第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令那么第一个替换命令将影响第二个替换命令的结果。
sed -e 1,5d -e s/test/check/ example2.6. 插入i 命令
# 如果test被匹配则把反斜杠后面的文本插入到匹配行的前面。
sed /aa/i\\ new str三、awk
AWK 是一种优良的文本处理工具。其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母AWK 提供了极其强大的功能可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言AWK 程序设计语言 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表还有无数其他的功能。
3.1. 三种调用方式
命令行方式
awk [-F field-separator] commands input-file(s)其中commands 是真正awk命令[-F域分隔符]是可选的。 input-file(s) 是待处理的文件 在awk中文件的每一行中由域分隔符分开的每一项称为一个域。通常在不指名-F域分隔符的情况下默认的域分隔符是空格
shell脚本方式
将所有的awk命令插入一个文件并使awk程序可执行然后awk命令解释器作为脚本的首行一遍通过键入脚本名称来调用。 相当于shell脚本首行的#!/bin/sh 可以换成#!/bin/awk
将所有的awk命令插入一个单独文件然后调用
awk -f awk-script-file input-file(s)其中-f选项加载awk-script-file中的awk脚本input-file(s)跟上面的是一样的。
3.2. 实例
# 显示最近登录的5个帐号
last -n 5 | awk {print $1}
# 读入有\n换行符分割的一条记录然后将记录按指定的域分隔符划分域填充域$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是空白键 或 [tab]键,所以$1表示登录用户$3表示登录用户ip,以此类推。# 显示/etc/passwd的账户
cat /etc/passwd | awk -F : {print $1} # awkaction的示例每行都会执行action{print $1}, -F指定域分隔符为:# 显示/etc/passwd的账户和账户对应的shell且账户与shell之间以tab键分割
cat /etc/passwd | awk -F : {print $1\t$7}# 显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加blue,/bin/nosh。
cat /etc/passwd |awk -F : BEGIN {print name,shell} {print $1,$7} END {print blue,/bin/nosh}
# 先执行BEGIN然后读取文件读入有/n换行符分割的一条记录然后将记录按指定的域分隔符划分域填充域$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完最后执行END操作。# 搜索/etc/passwd有root关键字的所有行
awk -F: /root/ /etc/passwd # pattern的使用示例匹配了pattern(这里是root)的行才会执行action(没有指定action默认输出每行的内容)。# 找root开头的正则
awk -F: /^root/ /etc/passwd# 搜索/etc/passwd有root关键字的所有行并显示对应的shell
awk -F: /root/{print $7} /etc/passwd3.3. 内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符# 统计/etc/passwd:文件名每行的行号每行的列数对应的完整行内容:
awk -F : {print filename: FILENAME ,linenumber: NR ,columns: NF ,linecontent:$0} /etc/passwd# 使用printf替代print
awk -F : {printf(filename:%s,linenumber:%s,columns:%s,linecontent:%s\n,FILENAME,NR,NF,$0)} /etc/passwd# print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用参数用逗号分隔。如果没有逗号参数就串联在一起而无法区分。这里逗号的作用与输出文件的分隔符的作用是一样的只是后者是空格而已。
# printf函数其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时printf更加好用代码更易懂。3.4. awk 编程
# 统计/etc/passwd的账户人数(count 是自定义变量)
awk BEGIN {count0;print [start]user count is , count} {countcount1;print $0;} END{print [end]user count is , count} /etc/passwd# 统计某个文件夹下的文件占用的字节数
ls -l |awk BEGIN {size0;} {sizesize$5;} END{print [end]size is , size}# 以M为单位显示
ls -l |awk BEGIN {size0;} {sizesize$5;} END{print [end]size is , size/1024/1024,M}# 条件语句
# 统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹)
ls -l |awk BEGIN {size0;print [start]size is , size} {if($5!4096){sizesize$5;}} END{print [end]size is , size/1024/1024,M}# 循环语句
# 显示/etc/passwd的账户
awk -F : BEGIN {count0;} {name[count] $1;count;}; END{for (i 0; i NR; i) print i, name[i]} /etc/passwd3.5. 参考
官方参考
四、自动化部署脚本
4.1. 安装 jdk
BASE_SERVERnode04
yum install -y wget
wget $BASE_SERVER/soft/jdk-7u45-linux-x64.tar.gz
tar -zxvf jdk-7u45-linux-x64.tar.gz -C /usr/local
cat /etc/profile EOF
export JAVA_HOME/usr/local/jdk1.7.0_45
export PATH\$PATH:\$JAVA_HOME/bin
EOF4.2. ssh 免密
#!/bin/bashSERVERSnode03 node04
PASSWORD999999
BASE_SERVER192.168.100.10auto_ssh_copy_id() {expect -c set timeout -1;spawn ssh-copy-id $1;expect {*(yes/no)* {send -- yes\r;exp_continue;}*assword:* {send -- $2\r;exp_continue;}eof {exit 0;}};
}ssh_copy_id_to_all() {for SERVER in $SERVERSdoauto_ssh_copy_id $SERVER $PASSWORDdone
}ssh_copy_id_to_allfor SERVER in $SERVERS
doscp install.sh root$SERVER:/rootssh root$SERVER /root/install.sh
done