exit 0:正常运行程序并退出程序;
exit 1:非正常运行导致退出程序;
命令颜色
\e[*m...\e[0;0m 或 \e[*m...\e[0m
#!/bin/bash
echo -e "\e[93mHello World!\e[0m"
echo -e "\e[93mHello World!\e[0:0m"
运行shell脚本
运行shell脚本的两种方法
1. 用./脚本名称 如: ./test.sh
2. 用source命令 如: source test.sh
两种方法的区别:
1. 脚本文件的权限要求不同,用source命令脚本文件没有执行权限也可以运行
2. 脚本中定义变量的使用范围不同;
source会直接在当前的进程中读取脚本的配置,不会开一个新的进程, 所以source之后,里面配置的变量都会加入到当前环境中,可以在该shell中调用脚本中的变量; source命令通常可以用于保留当前shell中的环境变量
$符号的用法
1. 获得变量的值: ${HOME}, $HOME
2. 获得脚本参数:
- $0: shell脚本文件名
- $1: 传给shell脚本的第一个参数
- $@: 传给脚本的所有参数列表, 但是使用时加引号会返回每个参数。
- $#: 传给脚本的参数个数
- $*: 所有脚本参数的内容
- $$: 脚本运行的当前进程号
- $!: 后台运行的最后一个进程的ID
- $?: 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
3. 命令替换: $(ls) 或 'ls'
变量操作
- 创建普通变量: name="test" (=两边不可有空格)
- 创建只可函数体中使用的局部变量: local name="test" (使用local修饰的变量在函数体外无法访问,并且local只能在函数体内使用)
- 使用变量: echo $name 或者 echo ${name} (推荐使用大括号版)
- 变量重新赋值: name="new_test" (将原值覆盖)
- 只读变量: name="only_read" -> readonly name (使用readonly标识后的变量,不可被修改)
- 删除变量: unset name; (删除之后不可访问,删除不掉只读变量)
BASH_SOURCE
BASH_SOURCE[0]
等价于BASH_SOURCE
,取得当前执行的 shell 文件所在的路径及文件名dirname
去除文件名中的非目录部分,仅显示与目录有关的部分
#当前执行脚本的所在目录
source=$( cd $(dirname ${BASH_SOURCE[0]}); pwd )
cd -P 调到实际路径而非快捷方式路径
readlink 获取一个软链接指向的目的路径
declare 变量声明或显示
选项 说明
-f 显示所有自定义函数,包括名称和函数体
-F 显示所有自定义函数名称
-g 在 Shell 函数内部创建全局变量
-p 显示指定变量的属性和值,当使用此选项时,其他的选项将被忽略
-a 声明数组变量
-A 声明变量为关联数组(支持索引下标为字符串)
-i 声明整数型变量。这样变量后面就可以跟着算术表达式,表达式的结果只能是整数。如果表达式求值失败或者不是整数,就设置为 0
-l 给变量赋值时转为小写
-u 给变量赋值时转为大写
-n 使变量 var 成为指向一个以其值为名称的变量的引用
-r 将变量 var 声明为只读变量。只读变量不允许修改,也不允许删除。等价于 readonly name
-t 使变量 var 带有 trace(追踪)属性
-x 将变量 var 导出,作用与 export 一样,将变量 var 设置成环境变量,这样在随后的脚本和程序中可以使用。等价于 export name
输入输出重定向(> <)
输出重定向:
命令 | 介绍 |
---|---|
command >filename | 把标准输出重定向到新文件中 |
command 1>filename | 同上 |
command >>filename | 把标准输出追加到文件中 |
command 1>>filename | 同上 |
command 2>filename | 把标准错误重定向到新文件中 |
command 2>>filename | 把标准错误追加到新文件中 |
输入重定向:
命令 | 介绍 |
---|---|
command <filename | 以filename文件作为标准输入 |
command 0<filename | 同上 |
command <<delimiter | 从标准输入中读入,直到遇到delimiter分隔符 |
字符串操作(长度,删除,替换)
表达式 | 含义 |
${#string} | $string的长度 |
${string:position} | 在$string中, 从位置$position开始提取子串 |
${string:position:length} | 在$string中, 从位置$position开始提取长度为$length的子串 |
${string#substring} | 从变量$string的开头,删除最短匹配$substring的子串 |
${string##substring} | 从变量$string的开头,删除最长匹配$substring的子串 |
${string%substring} | 从变量$string的结尾,删除最短匹配$substring的子串 |
${string%%substring} | 从变量$string的结尾,删除最长匹配$substring的子串 |
${string/substring/replacement} | 使用$replacement, 来代替第一个匹配的$substring |
${string//substring/replacement} | 使用$replacement, 代替所有匹配的$substring |
${string/#substring/replacement} | 如果$string的前缀匹配$substring,那么就用$replacement来代替匹配到的$substring |
${string/%substring/replacement} | 如果$string的后缀匹配$substring,那么就用$replacement来代替匹配到的$substring |
例:
INFO(){
echo -e "\e[92m=>\e[0;0m ${1}"
}
# ini文件解析
ini_parser(){
IFS=$'\n' && local ini=( $(<$1) ) # $1为传入的参数文件名,输入文件
INFO "原文件""${ini[*]}"
ini=( ${ini[*]//;*/} ) # 匹配到;时,把这一行后面的内容都用空代替
ini=( ${ini[*]/#[/\}$'\n'ini_section_} ) # 前缀匹配到[时,
ini=( ${ini[*]/%]/ \(} ) # 后缀匹配到]时,用(替换
ini=( ${ini[*]/=/=\( } ) # 匹配到=,用=( 替换
ini=( ${ini[*]/%/ \)} ) # 在行末加上 )
ini=( ${ini[*]/%\( \)/\(\) \{} ) # 后缀匹配到( ),用() {替换
ini=( ${ini[*]/%\} \)/\}} ) # 后缀匹配到} ),用}替换
ini[0]='' # 清空第一行
ini[${#ini[*]} + 1]='}' # 加一行值为}
INFO "解析后""${ini[*]}"
}
运行后可见打印:
=> 原文件[default]
;=== 公共配置 ==========================================
; 项目代号
PRO_CODE=test
;=== 服务端配置==========================
; 域名
HOST=127.0.0.1
; erl执行程序所在路径
ERL=erl
; 服务器前缀
PREFIX=dev_
; erl节点间连接端口范围
ERL_PORT_MIN=40001
; erl节点间连接端口范围
ERL_PORT_MAX=44000
; erl文件编译参数
; 不使用lager
ERL_MAKE_PARAM=",debug_info, {d, dbg_tester}, {d, lyj_debug}, {d, debug}, {d, disable_auth}"
; ERL_MAKE_PARAM=",encrypt_debug_info, {d, dbg_tester}, {d, debug}, {d, disable_auth}"
; 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASS=123456
=> 解析后
ini_section_default () {
PRO_CODE=( test )
HOST=( 127.0.0.1 )
ERL=( erl )
PREFIX=( dev_ )
ERL_PORT_MIN=( 40001 )
ERL_PORT_MAX=( 44000 )
ERL_MAKE_PARAM=( ",debug_info, {d, dbg_tester}, {d, lyj_debug}, {d, debug}, {d, disable_auth}" )
DB_HOST=( localhost )
DB_PORT=( 3306 )
DB_USER=( root )
DB_PASS=( 123456 )
}