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 ~/.bashrc
su 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/bash
echo "hello"
expect <<-EOF
EOF
/usr/bin/python << -EOF
print ""
EOF
-EOF
cat <<-EOF
hello
EOF
- :代表结束时的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.sh
sh -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 dos2unix
dos2unix xx.sh
三元表达式
[[ $pid ]] && echo "$filename is started" || echo "$filename is stopped"