/bash

Primary LanguageShell

  • 开头:#!/bin/bash 声明所用的语法,以载入相应环境的配置
  • 命令顺序关系:
    • ; 顺序执行,但互不影响
    • && 前一个成功执行,后一个才会执行
    • | 第一条命令的执行结果作为第二第命令的操作对象
  • 执行:文件有读与执行权限 ./file.sh 或 PATH内 或 bash file.sh 或 sh file.sh 在子进程中执行的
  • 关键字:export 抛出为环境变量 set unset exit 0 read declare
  • unset: 取消变量设置 -f/v 函数/变量
  • set: 设置shell选项,列出变量
  • 变量声明:declare -i/a/f/r 整型/数组/函数/只读 local 局部变量
  • 常用特殊变量:
    • $0 当前脚本文件名
    • $n 传递给脚本或函数的参数
    • $# 参数个数
    • $* 所有参数,与$@几乎相同,在""内部时稍有不同, 前者为视为一个整体,后者视为单个
    • $? 上个命令的退出状态或函数返回值
    • $$ 进程ID
    • $- 当前使用项
  • 括号相关:
    • ${a} 变量,不引起歧义的情况下,括号可以省略
    • $(cmd) 命令替换,执行cmd; 同``
    • $((exp)) 数学表达式; 同 expr exp
    • (cmd1;cmd2) 或 {cmd1;cmd2;} 多条命令执行, 是否开子进程执行;括号中重定向只影响内部,外部重定向可以影响内部所有命令
  • 双括号:增加括号的用法
    • (())常用于算术运算,可以不使用$前缀 或 或{1..3}
  • 指令表达式:
    • 扩展运算:$((exp))
    • $() 重开子进行执行,除最后一个命令外用;分隔多个命令, 不必有空格 与 ``
    • ${} 当前进行执行,都用;分隔多个命令, 第一个命令与左括号之前必须有一个空格
  • () 子表达式返回值,不会影响外部的
  • let (())表达式计算 $(())与其类似, 但b=1 $((++b)) 与((b++))一样
  • $() 命令执行的结果
  • {1..30} /{,s}bin/
  • 开头生成注释???
  • 变量条件赋值:
    • 用new作传回值:${old-new} old无设定时 ${old:-new} old无设定或空时
    • 用new作传回值:${old+new} old为空值或非空值 ${old:+new} 非空值
    • 用new作传回值, 同时再赋值给old:${old=new} old无设定 ${old:=new} old无设定或空时
    • 将new输出到标准输出:${old?new} old未设定 ${old:?new} old未设定或为空值
  • bc进行小数的计算:bc -lq
  • source 或 . 脚本:在父进程中执行的
  • $? && ||
  • 测试:[] test [[]]
  • 文件相关判断:-e 存在 类型:-f/d 权限:-r/w 组:-g/u -s 非空白 文件比较:-nt 比新 ot比旧 ef同一个
  • 整数:eq ne gt lt ge le
  • 字符串:-z 长度为空 -n 非空 == !=
  • 字符串操作:
    • 左侧删除:${file#*identity} 删除标识及左侧的字符 ${file##*identity} 删除最后一个标识及左侧的字符
    • 右侧删除${file%identity*} 删除最后一个标识及右侧的字符 ${file%%identity*} 删除第一个标识及右侧的字符
    • ${file/a/b} 替换第一个 ${file//a/b} 替换所有
    • ${string:0:5} 截取
    • ${#var} 变量长度
  • 多重:-a -o !
  • <() >() >> << 反命令结果当文件读入
  • 重点区分:${a}变量 $(cmd)命令替换 $((exp))
  • 重点区分:(cmd;cmd1) {cmd;cmd1;cmd2;}
  • 双括号:常用于算术运算
  • expr length "str" 或 expr substr "str" 或 expr index "str" 或 expr 运算

流程控件

  • if [condition]; then command...; fi
  • if [condition] \n then command.... \n else command \n fi
  • if [condition]\n then command....\n elif [condition]\n then command \n else command \n fi
  • for var in list \n do command ... \n done
  • while condition \n do command \n done
  • until condition \n do command \n done
  • break continue case 模式1) command command1 ... ;; 模式2) command command1 ... ;; esac

函数

  • 定义:function fname(){} 或 fname(){}
  • 调用:fname 或 fname param1 param2

参数

  • shift 或 shift n参数变量号码偏移,拿掉前面几个参数。