标签:执行 注意事项 大小写 空行 图片 通配 方便 退出 $*
一.什么是shell?在linux内核与用户直接的解释器程序; 通常指/bin/bash; 相当于操作系统的“外壳”。
1. 命令行 ==交互式; 逐条解释执行,效率低
2. 脚本 == 非交互式; 批量执行,效率高; 方便在后台静悄悄地运行。
1. 通过usermod , chsh 更改登录的shell
2. 手动执行目标shell程序
/bin/sh ?//多数unix默认使用的shell ? ?/bin/bash ? //多数Linux默认使用的shell
标准输入: 从该设备接收用户输入的数据
标准输出: 通过该设备向用户输出数据
标准错误: 通过该设备报告执行中的出错信息
重定向操作: 改变标准输入/输出/错误输出的方向。
写好的执行语句,能够完成特定任务的文件
创建脚步的步骤? 脚本创建三步走
1.创建文本文件;
2.添加可执行的脚步语句
3.添加x 执行权限。
1. ?#!//脚本声明(使用哪种解释器)
2. # ?//注释信息(步骤, 思路,用途,变量含义等)
3. 可执行语句
1. 作为命令 /命令字; 指定脚本文件的路径,前提是有x 权限
2. 作为“参数”; 不要求有 x 权限
sh ?脚本路径
source 脚本文件路径
. 脚本文件路径
./脚本文件路径
1.直接观察执行中的输出,报错信息
2.通过 sh -x 开启调试模式
3.在可能出错地方设置 echo 断点
定义赋值变量: 变量名=变量值;
1. 等号两边不要有空格
2. 若指定的变量名已存在,相当于为此变量重新赋值
3. 变量名由字母/数字/下划线组成,区分大小写;不能以数字开头
应用变量值 : $变量名
查看变量值: echo $变量名, ?echo ${变量名} ? ? //变量名易混淆时,以{}界定; ?未定义的变量取不到值
echo $var16.5, ${var1}6.5
手动取消: unset 变量名。。如:
unset X
退出shell环境时,变量会自动失效。
整数型, 浮点型,双精度浮点型, 字符型
环境变量: 通常都是大写,有系统维护,只有个别变量,用户可以直接更改
预定义变量: 位置变量: bash内置,存储执行脚本时提供的参数
预定义变量: bash内置,可直接调用,但不能直接赋值或修改
自定义变量: 由用户自主设置,修改及使用
?
1. 配置文件: ?/etc/profile ? ; ? ? ~/.bash_profile
2. 相关操作; ?
env ? //列出所有的环境变量
set ? //列出所有变量
3. 常见的环境变量
PWD, PATH , USER, LOGNAME, UID , SHELL, HOME, PS1, PS2
$0 ?//当前所在的进程名或 脚本名
$$ ?//当前进程的PID号
$? //命令执行后的返回状态, 0表示正常, 1或其他值表示异常。
$# //已加载的位置变量的个数
$* //所有位置变量的值
$n 或${n}? //n为序号,在执行脚本时提供的命令后参数。
?``
有哪三种定界符?它们的区别是什么?
1. 双引号 "" : 允许扩展,以 $ 引用其他变量
2. 单引号 ‘‘ : 禁用扩展, 即便$也视为普通字符
3. 反撇号 `` ?相当于$()?: 将命令的执行输出作为值;但是$()更方便嵌套使用。
?
read 从键盘读入变量 并完成赋值
格式: read ?[-p "提示信息"] ?变量名 ?//注意要有空格
-p可选, -t可指定超时秒数
?
1.局部变量
新定义的变量默认只能在当前Shell环境中有效;无法在子Shell环境中使用。
2. 全局变量
在当前Shell及子Shell环境中均有效
怎么定义全局变量: 使用export 可将局部变量声明为全局变量
export 局部变量名[=变量名] ?//为局部变量添加全局属性
export -n 全局变量名.... ? ? ? //取消指定变量的全局属性
格式: expr 整数1 ?运算符 ?整数2; //注意运算符两侧要有空格
+ ?- ? \* ? / ?% ? ? ? ? ? ?//注意乘法要转义,避免被作为Shell通配符
相比expr更方便简便实用:
1.乘法操作 * 无需转义,
2.运算符两侧可以无空格;
3. 应用变量可以省略 $符号;
使用 $[] ?或者 let 命令
echo $[i+=2]
let i++; echo $i
注意: Bash内建机制仅支持整数值运算; expr ; $[] 算式替换不支持小数的运算。
bc //多数Linux 默认安装此工具
quit 退出 ; scale=n 指定小数位数;
bc 的使用; 结合管道向bc发送表达式; ?多个表达式分号分隔
echo "scale=4; $A*56.789;5/3" | bc
基本用法:
echo "数值1 比较符 数值2" ?| bc
如果表达式成立,则返回的计算结果为1, 否则返回0
常见比较操作 > ?>= ?< ?<= ?== !=
A=12.34; B=56.78
echo "$A<=$B" | bc
test 测试操作
格式: test ?选项 参数
或 [ ?选项 参数 ] ; //注意要有空格
[ 操作符 文件或目录 ]
[ 整数值1 操作符 整数值2?]
[字符串1 操作符 字符串2]
[操作符 字符串]
用法:
命令1 操作符 命令2
[条件1] 操作符 [条件2]
&& 给定条件必须都成立,整个测试结果才为真
|| 只要其中一个条件成立,则整个测试结果为真
! 取反符号
if ?条件测试
? ? then ?命令序列
fi
if ?条件测试
then ?命令序列1
else 命令序列2
fi
if 条件测试1
? ? ? ?then 命令序列1
elif 条件测试2
? ? ? ?then 命令序列2
else 命令序列n
fi
for 变量名 ?in ?值列表
do
? ?命令序列
done
while 条件测试
do
? ? ?命令序列
done
当条件不成立时,循环执行语句序列
until 条件测试
do
? ? ?命令序列
done
case 变量值 in
模式1)
? ? 命令序列1 ;;
模式2)
? ? 命令序列2;;
.....
*)
默认命令序列
esac
function 函数名{
? ? ? 命令序列
}
函数名(){
? ? ? 命令序列
}
函数名 ? 值1 ?值2 ?.. ..
break ; ?跳出当前所在的循环体,
continue ; 跳过循环体内余下的语句,重新判断条件以判断是否需要执行下一次循环
exit; ? 退出脚本,默认的返回值是 0
shift ; 用来迁移位置变量,每执行一次,结果如下:丢弃$1,原来的$2 变为$1.
?
变量的值默认均为文本
强制声明类型
格式 : declare ?选项 ?变量名
-i ? //强制为整数
-a ?//定义为数组
-x ?//设置为全局变量
-r ?//设置为只读
方法一, 整体赋值:
格式: 数组名=(值1 值2 .. .. 值n)
方法二,单个元素赋值
格式: 数组名[下标]=值 ? ? ? ? //下标从0开始
${数组名[下标]} ? //获取单个数组元素
${数组名[@]} ? ? ? //获取所有数组元素
${#数组名[@]} ? ? //获取数组元素的个数
${数组名[@]:起始下标:元素个数} ? ? ? ?//获取连续的多个数组元素
${#数组名[下标]} ? ? ? //获取某个数组元素的长度
${数组名[下标]:起始下标:字符数} ? ?//截取数组元素值的一部分
可以在shell脚本中,为交互式过程自动输送预先准备的文本或指令,而无需人工干预;触发的依据是预期会出现的特征提示文本。
egrep 过滤工具 ? ? ? ? ? //相当于grep -E
以行为单位,逐行进行处理; 默认只输出与表达式匹配的文本行
格式1 : egrep [选项] ‘正则表达式‘ 文件 .. ..
格式2: ?前置命令 | egrep [选项] ?‘正则表达式
-i ?//忽略字母大小写
-v ? //条件取反
-c ?//统计匹配的行数
-q ?//静默,无任何输出, 一般用于检测 //看$? 返回值 如果为0,说明有匹配,否则无匹配
-n ?//显示出匹配结果所在的行号
--color ? //标红显示匹配字串
1.Stream EDitor 流式编辑器; 非交互,基于模式匹配过滤及修改文本; 逐行处理,并将结果输出到屏幕;
2.可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作。
格式1 : 前置命令 | sed ?[选项] ?‘编辑指令‘
格式2: ? ?sed ?[选项] ? ‘编辑指令‘ ?文件 .. ..
-n ? //屏蔽默认输出(全部文本);按条件输出
-i ?//直接修改文件内容
-f ? //使用sed脚本
-e ? //可指定多个处理动作
-r ? //启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
{} ?//可组合多个命令,以分号分隔
定址符, 即[地址1[,地址2]] ? //用来指定处理的起,止行数;省略定址符时,默认逐行处理全部文本
复杂操作可存为脚本,通过-f调用
格式: sed -f 操作脚本 ?文件 .. ..
应用场景?能做什么?
如何在文本内插入新行?
如何插入多行文本?
如何替换掉指定的整行文本?
修改后的文本有多行时? 我想插入多行怎么做?
以换行符\n 分隔
或者 使用\ 强制换行
#sed -n ‘2cXX\nYY‘ ?m.txt
sed 高级应用
文件导入导出
注意: -r动作应结合-i选项才会存入,否则只能输出
sed ‘2r m.txt‘ reg.txt
sed -n ‘/^XX/w d.txt‘ ?reg.txt
存放当前处理的行,将结果输出;若当前行不符合处理条件,则原样输出;处理完当前行再读入下一行来处理。
作用类似于 “剪贴板”; 默认存放一个空行(换行符\n)
-H ?: 模式空间 --[追加]--> 保持空间 ?//复制
-h : 模式空间 --[覆盖] -->保持空间 ? //复制
-G : 保持空间--[追加]--> 模式空间 ? ?//粘贴
-g : 保存空间--[覆盖] -->模式空间 ? ? //粘贴
sed ‘1,3H;$G‘ reg.txt ? ? //把第1-3行复制到文件末尾
sed ‘1h;2,3H;$G‘ reg.txt //可避免出现空行
sed ‘1h;1d;$G‘ reg.txt ?//把第1行剪切到文件末尾
sed ‘1h;2H;1,2d;$G‘ reg.txt ?//把第1-2行剪切到文件末尾
?
! ? 取反操作; 根据定址条件取反
sed -n ‘/bash$/!p‘ ?/etc/passwd
n ?读下一行 ; 产生隔行/跳行的效果
sed -n ‘p;n‘ reg.txt ?//输出奇数行
sed -n ‘n;p‘ reg.txt //输出偶数行
?
?
awk编程语言/数据处理引擎
创造者: Aho, Weinberger, ?kernighan
基于模式匹配检查输入文本,逐行处理并输出;通常用在shell脚本中,获取指定数据;单独用时,可对文本数据做统计。
格式1 : 前置命令 | awk [选项] ?‘[条件]{编辑指令}‘ ? ? ?//多条语句可以分号分隔; print 是最常用的指令
格式2: ? awk ?[选项] ?‘?[条件]{编辑指令}‘ 文件.. .. ? //注意:awk条件和指令需要使用单引号
-F : 指定分隔符,可省略(默认空格或Tab位)
-f : 调用awk脚本进行处理
-v : 调用外部Shell变量
有特殊含义,可直接使用
awk ‘{print "第"FNR"行","有"NF"列"}‘ ?m.txt
awk ‘{print "Last:"$NF}‘ m.txt ? ? ?//输出每行最后一个字段
awk -F: ‘$1==ENVIRON["USER"]{print $3}‘ ?/etc/passwd ? ? ? ?//输出当前用户的UID信息
数值/字符串比较
运算符
正则表达式: ?/正则表达式/
~匹配 ? ? !~ 不匹配
awk -F: ‘/^ro/{print}‘ ?/etc/passwd ? ?//列出以ro开头的用户记录
awk -F: ‘$7!~/bash$/{print $1,$7}‘ ?/etc/passwd ? ?//列出第7个字段不以bash结尾的用户名,登录shell
== 等于 ? != 不等于
> 大于 ?>= 大于或等于
< 小于 ? <= 小于或等于
awk ‘NR==2{print}‘ reg.txt ? ?//输出第2行文本
awk ‘$2!="XX"{print}‘ reg.txt ? //输出第2列不是XX的行
awk ‘NF>=2{print}‘ reg.txt ? ? ? //输出包含2个及以上字段的行
&& ?逻辑与 ?: 期望多个条件都成立
|| ?逻辑或 : 只要有一个条件成立即满足要求
awk -F: ‘$3==1 || $3==7{print $1,$3}‘ ? /etc/passwd ? ?//列出UID为1或7的用户信息
seq 200 ?| awk ‘BEGIN{i=0}($0%3==0)&&($0%13==0){i++}END{print i}‘ ? //计算同时被3和13整除的整数个数
单分支: ?if(条件){编辑指令}
双分支: if(条件){编辑指令1}else{编辑指令2}
多分支: if(条件){编辑指令1}else if(条件){编辑指令2} .. .. else{编辑指令N}
awk -F: ‘BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}‘ ?/etc/passwd ? ?//统计UID小于或等于500的用户个数;统计UID大于500的用户个数。
while(条件){编辑指令}
do while循环
do{编辑指令}while(条件)
#awk -F [:/] ‘{i=1}{while(i<=NF){if($i~/root/){j++};i++}}END{print j}‘ ?/etc/passwd ? ?//统计/etc/passwd文件内“root”出现的次数
for(初值;条件;步长){编辑指令}
其他控制语句- 常用的中断,退出等awk指令
格式: 数组名[下标]=元素值
调用: 数组名[下标]
用法: for(变量 in 数组名){print 数组名[变量]}
#awk -F: ‘!a[$7]++{print $7}‘ ?/etc/passwd
-n ? //按数字升序排列
-k //针对指定的字段进行排序
-r ?//反向排序
/var/access_log ?| sort -nr ?-k2
标签:执行 注意事项 大小写 空行 图片 通配 方便 退出 $*
原文地址:https://blog.51cto.com/14469918/2440256