- 变量
- echo $name 与 echo “$name” 假如变量是读取文件,前者会自动缩进成一行,后者保留原有格式
- (umask=022,mkdir /f1)括号相当于开启一个临时子进程,能读取当前shall的变量等信息,但是进程号不变,命令结束后恢复刚才状态
- 局部变量,环境变量,只读变量(常量),位置变量,数组
- 局部变量:只在当前shall有效
- 环境变量:可以传给子进程。
- 设置环境变量 export 变量名 decler -x 变量名
- 查看环境变量 export env decler -x
- 只读变量(常量):不可更改的变量
- 设置 decler -r 变量名 readonly 变量名
- 位置变量
- $n 第n个参数 ,$*所有参数当成一个字符串,$@所有参数分开传输,$#参数个数
- $0文件名加路径 若程序建立软连接,使用软连接$0显示的是软连接路径和名字
- $10 不是变量10,而是变量1加上0,如果想表示变量10要用{}括起来,${10}
- set — 清除位置变量参数
- shift 参数左移,默认是1,可以指定
- 数组:存储多个元素的连接的内存空间
- 组成数组名和索引(默认从0开始,也可以自定义。bash4.0以前的版本不支持自定义数组)
- 申明数组:declare -a 通常意义的数组 -A 指关联数组
- 数组的赋值
- 一次只赋值一个 name[index]=value
- 一次赋值全部 name=(value1 value2…)
- 只赋值特定值 name=([0]=value1 [1]=value2)
- read -a
- 引用数组:
- 所有元素
- ${#name[*]]} 数组name中的参数个数
- ${name[@ | *]} 引用所有参数
- ${!typenum[@]}数组成员
- 数组切片
- ${name[@]:offset:number} offset要跳过的参数 number要取出的参数
- 所有元素
- bash内置字符串处理
- 字符串切片
- ${var:offset:number}
- var=1234 ${var:1:2} =23
- ${var: -n} 取字符串最右侧的几个字符 :-n前面一定要有空格
- v=1234 ${var: -2} =34
- ${var:offset:number}
- 基于模式取字段
- ${var#*word} 从左往右删除第一个word以前的字符串
- ${var##*word} 从左往右删除最后一个word以前的字符串
- ${var%word*} 从右往左删除第一个word以前的字符串
- ${var%%word*} 从右往左删除最后一个word以前的字符串
- 查找替换
- ${var/a/b} 查找var中的a找到第一个后替换成b
- ${var//a/b} 查找var中的a后全部替换成b
- ${var/ # a/b} 查找var中的以行首的a找到第一个后替换成b
- ${var/ %a/b} 查找var中的以行尾的a找到第一个后替换成b
- 删除
- ${var/a/} 删除var中的第一个a
- 大小写转换
- ${var^^} 把所有字符转为大写
- ${var,,} 把所有字符转为小写
- 变量临时赋值
- ${var:-a} 如果var没有值,则给var临时赋值为a;如果var值则返回原来值
- ${var:=a} 如果var没有值,则给var赋值为a;如果var值则返回原来值
- ${var:+a} 如果var有值,则给var临时赋值为a;没有值则不赋值
- 字符串切片
- 为脚本使用配置文件
- 在脚本中使用. filename 或者source filename
- 算术运算
- x=10 y=20 let z=x+y ;let z++ 先处理z再加1,let ++z,先加1在处理z;let z+=1 为z+1
- z=$[x+y] ; z=((x+y))
- a=100 b=110 a^b=010
- a与b的值互换 a=[a^b], b=[a^b] a=[a^b]
- 短路与与短路或 cmd1 && cmd2 || cmd3
- 假如cmd1成功执行cmd2,不执行cmd3,;否则相反
- cmd1 || cmd2 && cmd3 无论cmd1是否正常,cmd3都会执行
- 条件判断
- test 【】
- [[ == ]] 支持通配符 [[ =~ ]] 支持正则
- -a并且 -o或 -z为空 -s文件存在且非空 -e文件存在(所有文件类型包括目录) -f普通文件
- eq等于;ne不等于;lt小于;le小于等于;gt大于;ge大于等于
- test 【】
- 统配符
- read 读取输入并赋值
- – p输入提示 -t规定结束时间 -s静默,不显示输入内容
- 批量赋值
- read a s d >>> x y z read a s d < f1 参数要在一行
- if 语句
- 单分支 : if 条件 ;then ; fi
- 双分支: if 条件 ; then ; else ; if
- 多分支:
- 循环
- while [ true ] ;do ;done [ ]进行条件判读成立进入循环,不成立则退出循环
- until [ false ] ;do ;done 与while相反,不成立进入循环,成立退出循环
- 特殊格式
- while read var ;do ;done </etc/passwd var等于读取行的变量
- 特殊格式
- for var in {} ;do ;done {}是变量var的取值范围
- 特殊格式 for ((控制变量初始化;条件判断;控制变量修正)) ;do ;done
- declare -i sum=0 for ((i=1;i<=100;i++));do let sum+=$i ;done
- 特殊格式 for ((控制变量初始化;条件判断;控制变量修正)) ;do ;done
- 循环控制语句
- continue 【n】跳过循环 break 【n】 中断循环
- continue 例子
- 除了5不打印都打印
-
- 打印3遍1到4。
- continue 例子
- case
- select循环与菜单
- select 变量 in values;do ;done
- 用户输入参数在内置变量REPLY中 ;请求输入的提示符修改PS3;死循环和case组合
- select 变量 in values;do ;done
- 多参数处理时偏移参数
- 并行处理
- 信号捕捉trap
- trap ‘ ‘ 忽略信号 ;’-‘恢复信号;-p列出自定义信号
- continue 【n】跳过循环 break 【n】 中断循环
- 函数:过程式编程,代码重用 ,以实现结构化编码或模块化编码
- 语法
- 1 fuction f_name { 代码 }
- 2 f_name() { 代码 }
- 函数的生命周期调用时创建,返回时终止:return命令自定义状态结果 0成功,return定于后面的命令不再执行。
- 函数中变量如果和本地变量一样,在函数中重新申明的话不会影响本地变量;不申明的话函数中变量运算会影响本地变量。
- 语法
- 函数递归:函数直接或者间接调用自身
- fact () {
- if [$1 -eq 0 -o $1 -eq 1]; then
- echo 1
- else
- echo $[$1*$(fact $[$1-1])
- fi
- if [$1 -eq 0 -o $1 -eq 1]; then
- fact () {
- ezpect 在脚本中自动与交互命令交互(基于tcl要确认安装)
- 确认程序是否安装which tcl
- 语法及命令:
- spawn:启动的新进程;interact:允许交互;exp_continue:匹配多个字符后加此命令
- send:像进程发送的字符串;expect:从进程接受到的字符串
- 单分支: expect “hi”{send “good\n”} 匹配到hi的时候输入
- 多分支:expect “hi”{send “good\n”}\
- ”hehe“ {send “good\n”}
- eval 扫描命令进行置换
- cs=whoami ; eaval $csroot
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98471