SHELL 超详细基础知识,适合新手小白(一)
发布时间:2020-12-16 01:40:47 所属栏目:安全 来源:网络整理
导读:一.什么是shell? 在linux内核与用户直接的解释器程序; 通常指/bin/bash; 相当于操作系统的“外壳”。 二.怎么使用shell? shell的使用方式? 1. 命令行 ==交互式; 逐条解释执行,效率低2. 脚本 == 非交互式; 批量执行,效率高; 方便在后台静悄悄地运行。
一.什么是shell?
二.怎么使用shell? shell的使用方式?1. 命令行 ==交互式; 逐条解释执行,效率低 2. 脚本 == 非交互式; 批量执行,效率高; 方便在后台静悄悄地运行。 三.怎么切换shell ?怎么使用某个特定shell?1. 通过usermod,chsh 更改登录的shell 2. 手动执行目标shell程序 /bin/sh ?//多数unix默认使用的shell ? ?/bin/bash ? //多数Linux默认使用的shell 四.交互式硬件设备标准输入: 从该设备接收用户输入的数据 标准输出: 通过该设备向用户输出数据 标准错误: 通过该设备报告执行中的出错信息 重定向操作: 改变标准输入/输出/错误输出的方向。 五.什么是shell脚本?写好的执行语句,能够完成特定任务的文件 创建脚步的步骤? 脚本创建三步走 1.创建文本文件; 2.添加可执行的脚步语句 3.添加x 执行权限。 六.脚本构成? 规范的脚步构成?1. ?#!//脚本声明(使用哪种解释器) 2. # ?//注释信息(步骤, 思路,用途,变量含义等) 3. 可执行语句 七.脚本怎么执行? 脚本执行有哪几种方式?1. 作为命令 /命令字; 指定脚本文件的路径,前提是有x 权限 2. 作为“参数”; 不要求有 x 权限 sh ?脚本路径 source 脚本文件路径 . 脚本文件路径 ./脚本文件路径 八.shell脚本怎么调试?1.直接观察执行中的输出,报错信息 2.通过 sh -x 开启调试模式 3.在可能出错地方设置 echo 断点 九.Shell变量1.变量的设置和取消
注意事项:1. 等号两边不要有空格 2. 若指定的变量名已存在,相当于为此变量重新赋值 3. 变量名由字母/数字/下划线组成,区分大小写;不能以数字开头 2.查看变量应用变量值 : $变量名 查看变量值: echo $变量名, ?echo ${变量名} ? ? //变量名易混淆时,以{}界定; ?未定义的变量取不到值 echo $var16.5,${var1}6.5 取消变量手动取消: unset 变量名。。如: unset X 退出shell环境时,变量会自动失效。 十.Shell变量的分类??1.储存类型:
2.使用类型:环境变量: 通常都是大写,有系统维护,只有个别变量,用户可以直接更改 预定义变量: 位置变量: bash内置,存储执行脚本时提供的参数 预定义变量: bash内置,可直接调用,但不能直接赋值或修改 自定义变量: 由用户自主设置,修改及使用 ? 环境变量:1. 配置文件: ?/etc/profile ? ; ? ? ~/.bash_profile 2. 相关操作; ? env ? //列出所有的环境变量 set ? //列出所有变量 3. 常见的环境变量 PWD, PATH,USER,LOGNAME,UID,SHELL,HOME,PS1,PS2 预定义变量:$0 ?//当前所在的进程名或 脚本名 $$ ?//当前进程的PID号 $? //命令执行后的返回状态, 0表示正常, 1或其他值表示异常。 $# //已加载的位置变量的个数 $* //所有位置变量的值 位置变量 :
?`` 扩展赋值操作有哪三种定界符?它们的区别是什么? 1. 双引号 "" : 允许扩展,以 $ 引用其他变量 2. 单引号 ‘‘ : 禁用扩展, 即便$也视为普通字符 3. 反撇号 `` ?相当于$()?: 将命令的执行输出作为值;但是$()更方便嵌套使用。 ? 十一.怎么读取标准输入值? read 可以从标准输入中 读取值read 从键盘读入变量 并完成赋值 格式: read ?[-p "提示信息"] ?变量名 ?//注意要有空格 -p可选, -t可指定超时秒数 ? 十二.变量的作用范围? 变量的作用域1.局部变量 新定义的变量默认只能在当前Shell环境中有效;无法在子Shell环境中使用。 2. 全局变量 在当前Shell及子Shell环境中均有效 怎么定义全局变量: 使用export 可将局部变量声明为全局变量 export 局部变量名[=变量名] ?//为局部变量添加全局属性 export -n 全局变量名.... ? ? ? //取消指定变量的全局属性 十三.数值运算:整数运算:+ - * / ? %1. ?expr 运算工具格式: expr 整数1 ?运算符 ?整数2; //注意运算符两侧要有空格 + ?- ? * ? / ?% ? ? ? ? ? ?//注意乘法要转义,避免被作为Shell通配符 2. ?使用 $[] ?或 $(()) 表达式相比expr更方便简便实用: 1.乘法操作 * 无需转义, 2.运算符两侧可以无空格; 3. 应用变量可以省略 $符号; 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] && 给定条件必须都成立,整个测试结果才为真 || 只要其中一个条件成立,则整个测试结果为真 ! 取反符号 十九.if 选择结构单分支结构if ?条件测试 ? ? then ?命令序列 fi 双分支结构if ?条件测试 then ?命令序列1 else 命令序列2 fi 多分支结构if 条件测试1 ? ? ? ?then 命令序列1 elif 条件测试2 ? ? ? ?then 命令序列2 else 命令序列n fi 二十.循环结构for循环for 变量名 ?in ?值列表 do ? ?命令序列 done 条件式循环while 条件测试 do ? ? ?命令序列 done until循环当条件不成立时,循环执行语句序列 until 条件测试 do ? ? ?命令序列 done case 分支结构case 变量值 in 模式1) ? ? 命令序列1 ;; 模式2) ? ? 命令序列2;; ..... *) 默认命令序列 esac 二十一.函数及中断控制如何定义函数?function 函数名{ ? ? ? 命令序列 } 函数名(){ ? ? ? 命令序列 } 怎么调用函数?
中断,退出及相关指令:break ; ?跳出当前所在的循环体, continue ; 跳过循环体内余下的语句,重新判断条件以判断是否需要执行下一次循环 exit; ? 退出脚本,默认的返回值是 0 shift ; 用来迁移位置变量,每执行一次,结果如下:丢弃$1,原来的$2 变为$1. ? 二十二.shell数组变量的类型变量的值默认均为文本 强制声明类型 格式 : declare ?选项 ?变量名 常见选项-i ? //强制为整数 -a ?//定义为数组 -x ?//设置为全局变量 -r ?//设置为只读 定义/赋值数组方法一, 整体赋值: 格式: 数组名=(值1 值2 .. .. 值n) 方法二,单个元素赋值 格式: 数组名[下标]=值 ? ? ? ? //下标从0开始 输出数组元素${数组名[下标]} ? //获取单个数组元素 ${数组名[@]} ? ? ? //获取所有数组元素 ${#数组名[@]} ? ? //获取数组元素的个数 ${数组名[@]:起始下标:元素个数} ? ? ? ?//获取连续的多个数组元素 ${#数组名[下标]} ? ? ? //获取某个数组元素的长度 ${数组名[下标]:起始下标:字符数} ? ?//截取数组元素值的一部分 二十三.expect 简介
正则egrep 过滤工具 ? ? ? ? ? //相当于grep -E 以行为单位,逐行进行处理; 默认只输出与表达式匹配的文本行 基本用法:格式1 : egrep [选项] ‘正则表达式‘ 文件 .. .. 格式2: ?前置命令 | egrep [选项] ?‘正则表达式 常用的命令选项-i ?//忽略字母大小写 -v ? //条件取反 -c ?//统计匹配的行数 -q ?//静默,无任何输出, 一般用于检测 //看$? 返回值 如果为0,说明有匹配,否则无匹配 -n ?//显示出匹配结果所在的行号 --color ? //标红显示匹配字串 基本元字符二十四.sed工具1.Stream EDitor 流式编辑器; 非交互,基于模式匹配过滤及修改文本; 逐行处理,并将结果输出到屏幕; 2.可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作。 格式格式1 : 前置命令 | sed ?[选项] ?‘编辑指令‘ 格式2: ? ?sed ?[选项] ? ‘编辑指令‘ ?文件 .. .. 常见命令选项-n ? //屏蔽默认输出(全部文本);按条件输出 -i ?//直接修改文件内容 -f ? //使用sed脚本 -e ? //可指定多个处理动作 -r ? //启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项 {} ?//可组合多个命令,以分号分隔 定址符, 即[地址1[,地址2]] ? //用来指定处理的起,止行数;省略定址符时,默认逐行处理全部文本 基本的处理动作常见的处理操作示例二十五.使用 sed脚本复杂操作可存为脚本,通过-f调用 格式: sed -f 操作脚本 ?文件 .. .. sed文本块处理应用场景?能做什么? 如何在文本内插入新行? 如何插入多行文本? 如何替换掉指定的整行文本? 处理多行文本修改后的文本有多行时? 我想插入多行怎么做? 以换行符n 分隔 或者 使用 强制换行 #sed -n ‘2cXXnYY‘ ?m.txt sed 高级应用 文件导入导出 注意: -r动作应结合-i选项才会存入,否则只能输出 sed ‘2r m.txt‘ reg.txt sed -n ‘/^XX/w d.txt‘ ?reg.txt sed 复制剪切模式空间:
保持空间:
基本动作-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 流程控制! ? 取反操作; 根据定址条件取反 sed -n ‘/bash$/!p‘ ?/etc/passwd n ?读下一行 ; 产生隔行/跳行的效果 sed -n ‘p;n‘ reg.txt ?//输出奇数行 sed -n ‘n;p‘ reg.txt //输出偶数行 ? ? 二十六.awk工具概述awk编程语言/数据处理引擎 创造者: Aho,Weinberger,?kernighan 基于模式匹配检查输入文本,逐行处理并输出;通常用在shell脚本中,获取指定数据;单独用时,可对文本数据做统计。 用法:格式1 : 前置命令 | awk [选项] ?‘[条件]{编辑指令}‘ ? ? ?//多条语句可以分号分隔; print 是最常用的指令 格式2: ? awk ?[选项] ?‘?[条件]{编辑指令}‘ 文件.. .. ? //注意:awk条件和指令需要使用单引号 常用命令选项-F : 指定分隔符,可省略(默认空格或Tab位) -f : 调用awk脚本进行处理 -v : 调用外部Shell变量 awk内置变量
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的用户信息 运算符+ - * ?/ %++ ? -- ? += ? -= ?*= ?/=
二十八.流程控制-分支结构单分支: ?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循环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循环for(初值;条件;步长){编辑指令} 其他控制语句- 常用的中断,退出等awk指令 三十.数组的定义及使用定义数组:格式: 数组名[下标]=元素值 调用: 数组名[下标] 遍历数组:用法: for(变量 in 数组名){print 数组名[变量]} #awk -F: ‘!a[$7]++{print $7}‘ ?/etc/passwd 命令sort :?-n ? //按数字升序排列 -k //针对指定的字段进行排序 -r ?//反向排序 /var/access_log ?| sort -nr ?-k2 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |