shell脚本

80 阅读1分钟

变量:自定义(%c,int,float) 环境:shell及其子shell 声明方式:export.declare -x 变量名=变量值(等号左右不能有空格) 命令复制给变量 _ls=ls 命令结果赋值给变量 file_list=(ls-a) 声明int,在做计算 declare命令: +,-赋值,取消变量属性 -a指定变量为数组;i整型;x环境;-p被声明类型 home(当前用户主目录)+用户名 非登录(交互式、非交互式) 管道:前命令输出为后命令输入 “|” 右侧的命令必须能接受标准输入才行,如grep,vs,mv等不能直接使用,可使用xargs预处理 命令处理stdout(标准输出),对于stderr(标准错误输出) 修默认行为,可使set-o pipefail设置shell遇到管道错误退出 重定向:修改默认输出 输出:>覆盖写入文件 >>追加写入文件 2>错误输出写入文件 &>正和错输出统一文件 输入:< <<当前标准,识别指令符号 【命令】中括号前后有空格符 【和test是命令,只能使用自己支持的标志位 <,>,= 只用来比较字符体 【【(高级)更丰富,整型中支持<,>,=字符串比较中支持正则表达式中括号内变量,内括号括起来 shell自上而下执行,函数必须在使用前定义 函数获取变量和shell script类型,O代表函数名,后续参数通过1,1,2...获取 函数内return仅表函数执行状态,不代表函数执行结果 返回结果一般使用echo.printf,在外面使用()如果没有return,函数状态是一条命令的执行状态,存储在() 如果没有return,函数状态是一条命令的执行状态,存储在?中 启动: 1)以文件名进行 “可执行原件” ./filename.sh 2)解释器运行 “文件路径” bash./filename.sh 3)source运行 source./filename.sh 当前中执行脚本 执行过程 1.字符解析 识别换行符,分号(;)做行的分割 识别命令连接符(|| && 管道)做命令的分割 识别空格.tab符做命令和参数的分割 2.shell展开(大括号,波浪号,参数,命令,数学,文件名) 3.重定向 将stdin,stdout,stderr文件描述符进行指定变量 4.执行命令 builtin直接执行 内置命令 非builtin使用$PATH查找 启动子进程执行

  • shell展开: 前缀,一对大括号,后缀(大括号内可字符串,序列表达式)
  • 波浪号展开: 替换 当前用户主目录 =>HOME 指定用户的主目录 ~fred/foo=>用户fred的主目录 当前工作目录 ~+/foo=>pwd/foo 上一个工作目录 ~-/foo=>{OLDPWD-'-'}Hoo
  • 参数展开: 间接参数扩展$(!parameter) parameter="var" var="hello" 参数长度 空参数处理