1、文档
2、问题
#!/usr/bin/bash
#!/usr/bin/bash这是一个shebang,没有指定shell时,默认采用的shell,类似的有#!/use/bin/python
IFS
IFS 内部分隔符for 循环默认使用空格,换行,tab分隔read 读取一行
特殊符号
() 子shell中执行 (date)(()) 数值比较,运算c语言 ((1<2))$() 命令替换 echo $(date)$(()) 整数运算{} 变量的集合 echo {1..3} 1 2 3${} 变量的引用[] 条件测试 逻辑与 -a[[]] 条件测试,支持正则 =~ 逻辑与 &&$[] 整数运算
login/nologin shell
su - lms #切换用户,加-执行登录的shell,不加-执行nologin shell.系统级:/etc/profile 登录就执行/etc/bashrc 登录就执行用户级:~/.bash_profile 登录就执行~/.bashrc 登录就执行~/.bash_history history命令保存记录在内存中,退出时才会写入~/.bash_history文件中~/.bash_logout 退出执行该文件su - lms 执行/etc/profile /etc/bashrc ~/.bash_profile ~/.bashrcsu lms 执行/etc/bashrc ~/.bashrc
特殊命令及标记
!1002 执行历史命令中的第1002行命令!da 执行以da开头的最近一个命令,此处为date!! 执行上一个命令!$ 执行上一个命令的最后一个参数$? 上一个命令执行的返回值,成功为0.失败非0${array[@]} 数组所有的元素,以空格隔开array[$num] 数组某个角标的元素len=${#array[@]} 数组的长度 {#var}变量var的长度export ip=10.0.0.1 定义环境变量,在当前shell和子shell有效
在bash使用其他脚本的语法
#/usr/bin/bashecho "hello"expect <<-EOFEOF/usr/bin/python << -EOFprint ""EOF
-EOF
cat <<-EOFhelloEOF- :代表结束时的EOF支持tab缩进,-和<<中间没有空格'EOF'不会替换变量,$a会原样输出EOF:标记,可以时任意的字符
source xx.sh
source xx.sh 或者 . xx.sh在当前的shell中执行xx,sh./xx.sh 或者 sh xx.sh在子shell中执行,所有xx.sh中的变量不会影响当前shell#调试sh -vx xx.shsh -n xx.sh
/bin/sh^M:损坏的解释器: 没有那个文件或目录
将shell脚本保存为unix环境下
vim init.sh:set ff=unix:wq或者执行sed -i 's/\r$//' init.sh意思是吧行尾的\r替换为空
通过命令将脚本保存为unix环境
yum install dos2unixdos2unix xx.sh
三元表达式
[[ $pid ]] && echo "$filename is started" || echo "$filename is stopped"
