一.执行shell
方法一:chmod +x uad.sh
/uad.sh
方法二:sh usd.sh
方法三:source uad.sh
二.shell命令的组合运用
管道操作:将一端的命令输出交给另一端的命令处理
格式:命令1 | 命令2
重定向操作:改变执行命令时的默认输入,输出
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定文件读取数据,而不是键盘输入 |
重定向输出 | >, >> | 将输出结果覆盖追加到指定文件 |
标准错误输出 | 2>,2>> | 将错误信息覆盖追加到指定文件 |
混合输出 | &>,&>> | 将标准输出和错误信息覆盖,添加到指定文件 |
逻辑分隔:处理多条命令之间的逻辑关系
逻辑与:&
逻辑或:||
顺序执行:;
三:使用变量
变量基本操作
定义及赋值: 变量名=变量值
引用变量:$变量名,${变量名}
双引号/单引号/反撇号
双引号 |
允许引用,转义 |
单引号 | 禁止引用,转义 |
反撇号,或者 &() |
以命令输出进行替换 |
常见的环境变量:用来记录/设置运行环境参数
系统赋值:USER, LONGNAME,HOME,SHELL ...
用用户操作:PATH,LANG,CLASSPATH ...
其他特殊变量
由系统或脚本操控不可直接赋值
$?:前一条命令的状态值,0为正常,非0为异常
$0:脚本自身的程序名
$1-$9:第1到第9个位置参数
$*:命令行的所有位置参数的内容
$#:命令行的位置参数个数
四.数值运算及处理
整数运算操作
使用expr命令,计算表达式:expr 数值1 操作符 数值2
引用变量的情况 x=45; y=21; expr $x - $y
使用$[]表达式,算式替换:$[数值1 操作符 数值2]
引用变量的情况 x=45; y=21; echo $[x - y] 乘法不需要转义
几个数值处理技巧
变量的递更处理:let 变量名++ let变量名-
使用随机数:RANDOM
例:echo $RANDOM; echo $[RANDOM%100]
生成数字序列:seq 首数 末数 ,seq 首数 增量 末数
小数运算操作
将表达式给bc命令处理:echo "45.67-21.05" | bc echo "scale=4; 10/3" | bc (通过scale=n制约小数位数)
五.字符串操作
子串截取操作
路径分割:dirname命令,base命令
expr命令:expr substr $Var1 起始位置 截取长度
${}表达式:${Var1:起始位置:截取长度} 编号从零开始,从开始位置截取的话,起始位置可以省略不写
字符串替换
${Var1/old/new} 只替换第一个old
${Var//old/new} 替换所有old
使用随机字符串
随机字符==》ASC11
head -1 /dev/urandom | md5sum
使用cut切割字符串
echo $Var1 | cut -b 起始位置-结束位置 位置为首,尾可省略
六.条件测试
测试操作规范
测试的本质是一条操作命令,根据 $? 返回值来判断条件是否成立
格式:test 条件表达式
[条件表达式]
[条件表达式] && echo YES 测试成功则会输出YES,测试失败就不会输出东西
文件状态的检测
存在及识别
-e:是否存在 -d:是否为目录 -f:是否为文件
权限的检测
-r:是否有读取权限 -w:是否有写的权限 -x:是否有可执行的权限
整数值比较,字符串匹配
-eq:等于(equal) -ne:不等于(not equal) -gt:大于(great than) -lt:小于(less than) -ge:大于或等于(great or equal) -le:小于或等于(less or equal)
当前服务器登陆用户数:who |wc -1
获取当前用户: $USER
= 两个字符串相同 != 两个字符串不同
七.使用if判断结构
程序流控制
单分支/双分支的if应用
if 条件测试1 then 命令序列1 elif 条件测试2 then 命令序列2 else 命令序列n fi(结束判断)
多重分支的if应用
八.for循环
for语句结构
for 变量 in 取值列表 do 命令序列 done
批量加用户,用户列表文件users.txt,一行一个。初始口令设置为123456,首次登录后必须修改 cat uad.sh #! bin/bash for i in ${cat /root/users.txt} do useradd $i echo "123456" | passwd -stdin $i chage -d 0 $i done
九.case语句
case 变量值 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; *) 默认命令序列 esac
# cat hitkey.sh #! bin/bash read -p "请输入一个字符,并按Enter键确认:" KEY case "$KEY" in [a-z] [A-Z]) echo "您输入的是字母。" ;; [0-9]) echo "您输入的是数字。" ;; *) echo "您输入的是空格,功能键,或其他控制字符。" esac
十.awk文本处理
非交互式处理方式
重定向,管道,命令替换
head,more,cut,tr
grep,awk,sed
awk格式:awk '模式{操作}' 文件1 文件2 ...
awk 'NR==1{print}' /etc/hosts 输出指定目录下第一行
awk 'NR==1,NR==3{print}' test.txt 输出第1到第3行
awk '(NR==1)||(NR==3){print}' test.txt 输出第1行和第3行
正则表达式:awk '/2/{print}'test.txt 输出含有字符2的行
awk '/bash$/{print}'test.txt 输出yibash结尾的行
指定分隔,指定输出字段
awk 'NR==2,NR==3{print $1,$3}' test.txt 输出第二行到第三行第一字段和第三字段
awk -F. '$5=="benet"{print $0}' test.txt 输出以.分隔 且第五字段为benet的行
常见的内置变量:
NR:当前处理行的序数(行号)
FS:字段分隔,缺省为空格或Tab位
$n:当前行的第n个字段
$0:当前行的所有文本内容
十一.sed基本命令格式
格式:sed ’编辑指令‘文件1 文件2...
sed -n 文件1 文件2...
sed -i 文件1 文件2...
十二.bash的基本功能
1.命令别名与快捷键
alias 查看别名
alias 别名=‘原名’
unalias 别名 :删除别名
ctrl+c 强制终止当前命令
ctrl+l 清屏
ctrl+a 光标移到命令行首
ctrl+e 光标移到命令行尾
ctrl+u 从光标所在位置删除到行首
ctrl+z 把命令放到后台
ctrl+r 在历史命令中搜素
2.历史命令
history [选项] [历史命令保存文件]
选项:-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件/.bash_history
!n :重新执行第n条命令
!! :重新执行上一条命令
!字符串 :重新执行最后一条以该字符串开头的命令
3.输出重定向
wc [选项] [文件名]
选项:-c统计字节数
-w统计单词数
-l统计行数
4.多命令顺序执行
多命令执行符 | 格式 | 作用 |
; |
命令1 ; 命令2 |
多个命令顺序执行,命令1和命令2之间没有逻辑联系 |
&& | 命令1 && 命令2 | 命令1执行正确命令2才执行,命令1执行不正确,则命令2不执行 |
|| |
命令1 || 命令2 | 命令1执行不正确命令2才执行,命令1执行正确,则命令2不执行 |
管道符 |
命令1 | 命令2 | 命令1的正确输出作为命令2的操作对象 |
more:能查看文件内容但不能查看命令执行结果
netstat -an 查看linnux中所有的网络连接
5.shell中特殊符号