base脚本文件的第一行
#! /bin/bash
解析
1. brace expansion 花括号扩展
echo {1..10} mkdir data{1,2,3,4} mkdir data-{a..d}
使用上面方法可以快速创建 data-a 到 data-d 的文件,”..” 可以展开
2. tilde expansion 波浪线扩展
“~” 可扩展成用户的 $HOME 值
cd ~
3. parameter, variable 变量扩展
将带”$”的变量名扩展成变量值
var="xyz" echo $var
4. artithmetic expansion 算术扩展
整数算术运算
$(( i++ )) sum=$(( i++ ))
5. command substitution 命令替换
将命令的输出赋值给一个变量
today=$(date +%F) line=$(grep xxx yyy)
6. word splitting 词的拆分
变量值按空白符拆分,如
var=" a b c" for v in var; do echo $v done
7. pathname expansion 路径名扩展
通配符扩展成文件名
“*” 表示任意长度的字符串
“?” 表示任意一个字符
“[]” [1-9] 也可以实现快速扩展,但是只能用于文件名扩展,跟上面的花括号有所区别
8. 判断参数是否为空
function _log()
{
echo "[`date +'%Y-%m-%d %H:%M:%S'`] $1"
}
if [[ "$1" = "" ]]
then
_log "usernick params is needed!"
exit
fi
9. 输出内容到文件
echo "新内容" > file.txt # file.txt 原有内容会被完全替换为 "新内容"
echo "追加内容" >> file.txt # "追加内容" 会被添加到 file.txt 现有内容的后面
cat /etc/hosts >> /etc/hosts."$(date +'%s')"
echo "当前环境配置文件: config_${APP_ENV}.ini"
10. 获取环境变量
# 直接获取环境变量的值
echo "APP_ENV 的值是: $APP_ENV"
注意
1. 脚本中的解析是按照上面1到7的顺序进行的
2. 不要随便写空格,因为空格会导致无法正确解析,例如:”=”号两边不允许有空格
3. 所有 “/” 结尾的都代表是一个文件夹
4. 注意脚本的权限位和文件掩码,如果在脚本中动态生成一个文件,需要注意是否有权限执行
5. 避免使用 pwd 获取当前脚本的执行目录,因为 pwd 代表的是当前的工作目录,并不是脚本的。可以使用以下方法,不管在哪里执行脚本,都能正确获取脚本的路径信息
get_workdir()
{
local dir=$(dirname $0)
pwd=$( cd "$dir" && pwd)
echo $pwd
pwd
}
workdir=$(get_workdir)
echo "workdir: $workdir"
调试工具
bashdb:bash 脚本的调试器,支持断点、单步执行等功能(需单独安装)
# 安装(以Homebrew为例)
brew install bashdb
# 使用
bashdb your_script.sh
shellcheck:静态代码分析工具,检查潜在问题(强烈推荐)
# 安装
brew install shellcheck
# 检查脚本
shellcheck your_script.sh