1、文档

2、问题

#!/usr/bin/bash

  1. #!/usr/bin/bash
  2. 这是一个shebang,没有指定shell时,默认采用的shell,类似的有#!/use/bin/python

IFS

  1. IFS 内部分隔符
  2. for 循环默认使用空格,换行,tab分隔
  3. read 读取一行

特殊符号

  1. () shell中执行 (date)
  2. (()) 数值比较,运算c语言 ((1<2))
  3. $() 命令替换 echo $(date)
  4. $(()) 整数运算
  5. {} 变量的集合 echo {1..3} 1 2 3
  6. ${} 变量的引用
  7. [] 条件测试 逻辑与 -a
  8. [[]] 条件测试,支持正则 =~ 逻辑与 &&
  9. $[] 整数运算

login/nologin shell

  1. su - lms #切换用户,加-执行登录的shell,不加-执行nologin shell.
  2. 系统级:/etc/profile 登录就执行
  3. /etc/bashrc 登录就执行
  4. 用户级:~/.bash_profile 登录就执行
  5. ~/.bashrc 登录就执行
  6. ~/.bash_history history命令保存记录在内存中,退出时才会写入~/.bash_history文件中
  7. ~/.bash_logout 退出执行该文件
  8. su - lms 执行/etc/profile /etc/bashrc ~/.bash_profile ~/.bashrc
  9. su lms 执行/etc/bashrc ~/.bashrc

特殊命令及标记

  1. !1002 执行历史命令中的第1002行命令
  2. !da 执行以da开头的最近一个命令,此处为date
  3. !! 执行上一个命令
  4. !$ 执行上一个命令的最后一个参数
  5. $? 上一个命令执行的返回值,成功为0.失败非0
  6. ${array[@]} 数组所有的元素,以空格隔开
  7. array[$num] 数组某个角标的元素
  8. len=${#array[@]} 数组的长度 {#var}变量var的长度
  9. export ip=10.0.0.1 定义环境变量,在当前shell和子shell有效

在bash使用其他脚本的语法

  1. #/usr/bin/bash
  2. echo "hello"
  3. expect <<-EOF
  4. EOF
  5. /usr/bin/python << -EOF
  6. print ""
  7. EOF

-EOF

  1. cat <<-EOF
  2. hello
  3. EOF
  4. - :代表结束时的EOF支持tab缩进,-和<<中间没有空格
  5. 'EOF'不会替换变量,$a会原样输出
  6. EOF:标记,可以时任意的字符

source xx.sh

  1. source xx.sh 或者 . xx.sh
  2. 在当前的shell中执行xx,sh
  3. ./xx.sh 或者 sh xx.sh
  4. 在子shell中执行,所有xx.sh中的变量不会影响当前shell
  5. #调试
  6. sh -vx xx.sh
  7. sh -n xx.sh

/bin/sh^M:损坏的解释器: 没有那个文件或目录

将shell脚本保存为unix环境下

  1. vim init.sh
  2. :set ff=unix
  3. :wq
  4. 或者
  5. 执行sed -i 's/\r$//' init.sh
  6. 意思是吧行尾的\r替换为空

通过命令将脚本保存为unix环境

  1. yum install dos2unix
  2. dos2unix xx.sh

三元表达式

  1. [[ $pid ]] && echo "$filename is started" || echo "$filename is stopped"