基础命令
awk ' {print $n,$m,..}' --过滤出列中的n,m列内容
-F: --指定默认分割符为“:”
&& --连接两条命令,前面成功,才执行后一条命令
|| --连接两条命令,前面失败,才执行后一条命令
; --连接两条命令,不管前面执行情况,后面始终执行
脚本的基础格式
vim xxxx.sh
#!/bin/bash
# 描述语言
# 联系方式
运行方式:
./xxxx.sh --在子bash下运行,不改变当前工作目录
. /路径/xxxx.sh --在当前bash下运行,改变当前工作目录
重定向
|> --覆盖源文件
>> --末行追加文件
echo "123" |passwd --stdin bob --非交互模式设置用户密码
< --导入符号
2> --将错误信息导入到某个文件中:/dev/null(这是一个无底洞)
&> --将标准信息导入到某个文件中(错误信息也是标准信息)
变量
变量名=变量值 |`命令`(把命令执行的结果赋给变量)=$(命令)
read 变量名1 变量名2 ...
变量值1 变量值2 ...
-p "交互式提示语言" 变量名...
echo ${变量名}
单双引号的区别:单引号不引用引号内的变量,双引号会
export 变量名=变量值 --赋予系统全局变量
expr 值 +|-|\*|/|% 值 --四则运算
bash的历史记录文件:
/etc/profile
HISTSIZE=数字 --记录bash历史记录的条目数量
位置变量
expr $1 + $2
在运行的时候,在脚本后面跟两数字:./xxx.sh 20 30
预定义变量:
$# --统计位置变量个数
$* --回显位置变量的值
$n --回显第n个位置变量的值
$? --回显上条命令执行是否成功:1为失败,0为成功
$$ --回显脚本的执行是产生的进程号
几个简单的特殊符号
. --匹配任意单个字符
[] --表示匹配内部任意一个变量
^ --去反
* --o*左邻字符:左边有任意多个o
\{\} --o\{2,5\},左邻字符有2-5个o
\(\) --把符合的字符串保存,\1:提取要第一个保存的值,\2:提取保存的第2个值..
非交互式vim
sed 选项 '动作' /文件名
选项:
-i :直接修改文件内容
-n :使用静默模式
动作:
d :删除(sed '1,4d' | '/lp/d' | '/lp/!d')
a :新增(sed '行号a 内容' | sed "${变量}a 内容" )
c :取代('/某行内容的一部分/c 取代的新内容')
i :插入
s :替换(sed -n 's/原值/替换值/gp' | 's!/../..!/.../...!p:以:为分隔符)
p :打印和-n配合使用
一些例子:
建立测试文件cp /etc/passwd /tmp
-sed ‘1,4d’ /tmp/passwd ---显示删除1-4行
-sed -i '1,4d' /tmp/passwd ---直接应用到文件中
-sed '2a simplexue.com' /tmp/passwd ---在第2行增加内容
-sed '2i simpleware.com' /tmp/passwd ---在第2行插入内容
-sed '/lp/d' /tmp/passwd ---删除关键字所在行
-sed '/lp/!d' /tmp/passwd ---删除除关键字以外的其他所有行
-sed '/lp/p' /tmp/passwd ---显示匹配行,并且后面会显示整个文件
-sed -n '/lp/p' /tmp/passwd ---只看匹配行
-sed -n 's/lp/lg/gp'/tmp/passwd ---替换文件中所有lp为lg
-sed -n 's/lp//p' /tmp/passwd ---显示删除lp
-sed -n ‘s/\(lp\)/\1ailg/p’ /tmp/passwd ---\1调用储存变量lp
-sed -n '/lp/s:/sbin/nologin:/bin/bash:p' /tmp/passwd ---用:代替分割付/
-sed -n '2,4s!/sbin/nologin!/bin/bash!p' /tmp/passwd ---用!代替分隔符/
-sed '/search/c search simplexue.com' /etc/resolv.conf ---更改匹配行内容
条件
LINUX中随机数:RANDOM | (SJ=$((RANDOM%100)):取100以内的随机整数)
文件判断
[ 选项 /文件 ] | test 选项 /文件
选项值:
-d :是否为目录
-f :是否为文件
-e :是否存在
-r :是否有读权限
-w :是否有写权限
-x :是否有执行权限
数字判断
[ 数字 符号代码 数字 ]
符号代码:
-eq :等于
-ne :不等于
-gt :大于
-ge :大于等于
-lt :小于
-le :小于等于
字符串的比较
[ 字符串1 = 字符串2 ] :判断两个字符串是否一样
!= :不等于
[ -z $变量名 ] :检查变量是否为空
条件判断
if 条件
then 动作
elif 条件
then 动作
elif 条件
then 动作
else
动作
fi --结束if条件判断
for循环
for 变量 in 取值列表
do
动作
done --for结束标志
while循环
while 条件
do
动作
let 变量操作
done
case循环
case 变量 in
条件1)
动作1
;;
条件2)
动作2
;;
...
*)
默认动作
esac --case结束标志
函数
函数名()
{
动作
动作
...
return value
}
启用颜色字体
echo -e "[\\033[0;32;5m OK \\033[0m]"
远程交互式脚本
yum install expect
脚本语言
"注意:空格的问题"
#!/usr/bin/expect
set timeout 30(-1:永不过期)
spawn ssh 用户名@IP "执行的操作"
expect "第一种情况" {
操作:send "需要发送的信息\r"
expect "子情况"
子操作:send "需要发送的信息\r"
} "第二种情况" {
操作:send "需要发送的信息\r"
}
interact ---执行完成后把控制台交个当前bash
$argv --获取变量
嵌套:
#!/bin/bash
expect << EOF(end of file)
...(expect脚本语言)
expect eof
EOF
一个实例
#!/bin/bash
for IP in 100 1 2 3
do
IPADDR=192.168.0.$IP
expect << EOF
spawn ssh root@$IPADDR "sed -i '1i nameserver 8.8.8.8' /etc/resolv.conf"
expect "(yes/no)?" {
send "yes\r"
expect "passwd:"
send "password\r"
} expect "passwd:" { send "password\r" }
expect eof
EOF --结束expect解释器,必须和do缩进一样
done