Bash内置基本变量
-
PWD
: 显示当前的工作目录 -
OLDPWD
: 显示上一次的工作目录 -
~
:用户家目录 -
-
: 使用cd -
命令可以在上一次工作目录和当前工作目录中来回切换 -
HISTSIZE
: 显示shell中历史命令保留数量 -
HISTFILE
: 显示历史命令文件存放路径 -
HISTFILESIZE
: 显示历史命令文件存放命令数量 -
HISTCONTROL
: 显示历史命令记录方式-
ignoredups
: 让历史命令保存方式为『不记录连续重复命令』 -
ignorespace
: 让历史命令保存方式为「不记录以空格开头的命令」 -
ignoreboth
: 以上两个皆有
-
-
!#
: 代表执行历史记录中#号命令 -
!!
: 执行上一次历史命令 -
Esc,.
: 提取上一次命令最后一个参数 -
!$
: 提取上一次命令最后一个参数 -
PATH
: 环境变量 -
$?
: 上一次命令的执行状态结果 -
SHELL
: 当前shell -
home
: 家目录路径 -
UID
: 用户的UID -
GID
: 用户的GID -
USER
: 用户名
bash特性之命令行展开
-
~
: 自动展开为用户家目录 -
{}
:中间以多个" , "号为分隔,依次展开为多个数量
bash特性之执行状态结果
-
成功
==0
-
失败
==1-255
bash特性之命令结果引用
- `COMMAND`
$(COMMAND)
bash特性之引用
-
转义
:用反斜杠在需要转义的字符前,表示这个字符需要看作一个普通字符 -
强引用
:使用” ` “把所有内容都引起来,``号中的所有内容都看作为普通字符,除了引号自身,所以不要在``号内再加``号 -
弱引用
:使用” “把内容都引起来,除了引号自身,把大部分字符都看作普通字符,例外的有 ,$ , ` ,三个特殊字符
bash特性之元字符
-
*
: 任意长度的任意字符 -
?
: 单个字符 -
[]
: 指定范围内的任意字符 -
[^]
: 指定范围外的任意字符- 特殊格式
-
[a-z]
:任意字母(glob中不分大小写) -
[0-9]
:任意一个数字 -
[a-z0-9]
:任意一个数字和字母 -
[:alpha:]
:大写及字母 -
[:upper:]
:大写字母 -
[:lower:]
:小写字母 -
[:digit:]
:数字 -
[:alnum:]
:数字和字母 -
[:space:]
:空白(包含空格和制表格) -
[:punct:]
:标点符号
-
- 特殊格式
bash特性之hash
缓存之前命令查找的结果,就叫命令hash,也叫命令缓存,可以使用hash
命令查看其缓存的命令的完事路径及命中的次数。
-
hash
options:
-d [COMMAND] :清除指定的缓存命令 -r : 清空hash表
===============
shell编程基础
shell编程之变量
什么是变量?
内存空间地址+数据,数据是放在内存中,即也叫有名称的内存地址
变量的值的类型,决定了存储格式、表示的数据范围、参与的运算
变量赋值
`name=VALUE`
bash对变量的机制
- 所有都看作字符型
- 不支持浮点数据,需借用外部机制
- 变量无需事先申明,相当于,赋值和申明同时实现
程序中变量引用的机制
把变量名出现的位置,直接替换为其所指向的内存空间中的数据
变量的命名规范
- 不能以数字开头,只能包含数字、字母、下划线
- 变量名要做到见名知义
- 不能使用程序语言的保留字(if else where等)
变量的引用
- ${var_name}
- $var_name
变量的类型
-
本地变量
:作用范围仅为当前shell; -
环境变量
:作用范围当前进程和其子进程 -
局部变量
:作用范围为某片代码片; -
特殊变量
:shell内置的,有特殊功用-
0
= 成功 -
1-255
= 失败
-
各变量的赋值、引用 、查看、删除
本地变量
- 变量的定义
var_name=VALUE
- 变量的引用
${var_name} ,$name
- 变量的查看
set
- 变量的撤消
unset var_name (此次不需要加$)
环境变量
-
变量的定义
export var_name=value
var_name=value --> export var_name
-
declare -x var_name=VALUE
(-x 表示定义为一个环境变量)-
declare -i var_name=VALUE
(直接将var_name定义为整形)
-
-
变量的引用
-
${var_name}
$var_name
-
-
变量的查看
export
declare -x
printenv
env
-
变量的撤消
unset var_name
只读变量的定义
-
declare -r var_name=VALUE
(只读变量只有进程结果后才会消息,如果定义在环境配置文件中,需要手动清除) readonly name
增强型变量赋值
i=1
i=$[$i+1]
let i+=1
let i+=2
变量做某种运算后存至变量中
-
let i=$i+# 等同 let i+=#
- +=, -=, *=, /=, %= 都需要使用
let
命令进行描述
- +=, -=, *=, /=, %= 都需要使用
- 变量的自增
var=$[$var+1] == let var+=1 == let var++ - 变量的自减
var=$[$var-1] == let var-=1 == let var--
=============
bash之切片
基于字符串切片
Usage: ${var:offset: length}
例:
[root@localhost ~]#mypath="/etc/sysconfig/network-scripts/" #定义一个变量,等会切这个变量
[root@localhost ~]# echo ${mypath:5} #偏移5个字符显示
sysconfig/network-scripts/
[root@localhost ~]# echo ${mypath:10} #偏移10个字符显示
nfig/network-scripts/
[root@localhost ~]# echo ${mypath:5:5} #偏移5个字符,取5个字符
sysco
取出字符串的最后几个字符:${var: -length}
注意:-length之前有空白字符;
[root@localhost ~]# echo ${mypath: -10}
k-scripts/
基于模式取子串
-
Usage:
-
${var#*word}
:自左而右,查找var变量中存储的字符串中第一次
出现的由word所指明的字符,删除
此字符及其左侧的所有内容
-
${var##*word}
:自左而右,查找var变量中存储的字符串中最后一次
出现的由word所指明的字符,删除
此字符及其左侧的所有内容
-
${var%word*}
:自右而左,查找var变量中存储的字符串中第一次
出现的由word所指明的字符,删除字符及其右侧的所有内容
-
${var%%word*}
:自右而左,查找var变量中存储的字符串中最后一次
出现的由word所指明的字符,删除此字符及其右侧的所有内容
-
示例:
[root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
[root@localhost ~]# echo ${mypath#*/}
etc/sysconfig/network-scripts
[root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
[root@localhost ~]# echo ${mypath##*/}
network-scripts
[root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
[root@localhost ~]# echo ${mypath%c*}
/etc/sysconfig/network-s
[root@localhost ~]# echo ${mypath%%c*}
/et
基于字串查找替换
-
Usage:
-
${var/pattern/replacement}
:查找var变量存储的字符中第一次由pattern匹配到的内容,并替换为replacement -
${var//pattern/replacement}
:查找var变量存储的字符中所有能够由pattern匹配到的内容,并替换为replacement -
${var/#pattern/replacement}
:查找var变量存储的字符中最开始处能够由pattern匹配到的内容,并替换为replacement -
${var/%pattern/replacement}
: 查找var变量存储的字符中最后位置能够由pattern匹配到的内容,并替换为replacement
-
示例:
[root@localhost ~]#url="http://www.baidu.com:80"
[root@localhost ~]# echo ${url/www/WWW}
http://WWW.baidu.com:80
[root@localhost ~]# echo ${url/w/W}
http://Www.baidu.com:80
[root@localhost ~]# echo ${url//w/W}
http://WWW.baidu.com:80
[root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/bash"
[root@localhost ~]# echo ${userinfo/#root/ROOT}
ROOT:x:0:0:root user:/root:/bin/bash
[root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/root"
[root@localhost ~]# echo ${userinfo/%root/ROOT}
root:x:0:0:root user:/root:/bin/ROOT
基于字串查找删除
-
Usage:
-
${var/pattern}
:查找var变量存储的字符中第一次由pattern匹配到的内容,并删除; -
${var//pattern}
:查找var变量存储的字符中所有能够由pattern匹配到的内容,并删除; -
${var/#pattern}
:查找var变量存储的字符中最开始处能够由pattern匹配到的内容,并删除; -
${var/%pattern}
:查找var变量存储的字符中最后位置能够由pattern匹配到的内容,并删除;
-
示例:
[root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/root"
[root@localhost ~]# echo ${userinfo/root}
:x:0:0:root user:/root:/bin/root
[root@localhost ~]# echo ${userinfo//root}
:x:0:0: user:/:/bin/
[root@localhost ~]# echo ${userinfo/#root}
:x:0:0:root user:/root:/bin/root
[root@localhost ~]# echo ${userinfo/%root}
root:x:0:0:root user:/root:/bin/
基于字符串大小写转换
-
Usage:
-
${var^^}
:把var变量中的所有小写字母,统统替换为大写; -
${var,,}
:把var变量中的所有大写字母,统统替换为小写;
-
示例
[root@localhost ~]# echo $userinfo
root:x:0:0:root user:/root:/bin/root
[root@localhost ~]# myinfo=${userinfo^^}
[root@localhost ~]# echo $myinfo
ROOT:X:0:0:ROOT USER:/ROOT:/BIN/ROOT
[root@localhost ~]# echo ${myinfo,,}
root:x:0:0:root user:/root:/bin/root
空变量判断赋值
-
Usage:
-
${var:-word}
:如果变量var为空或未声明,则返回word所表示的字符串;否则,则返回var变量的值,临时赋值
[root@localhost ~]# echo $name #这行的值为空 [root@localhost ~]# echo ${name:-tom} tom [root@localhost ~]# name=hello [root@localhost ~]# echo ${name:-tom} hello
-
${var:=word}
:如果变量var为空或未声明,则返回word所表示的字符串,并且把word赋值为var变量;否则,则返回var变量的值,直接等值
[root@localhost ~]# echo $name #这行的值为空 [root@localhost ~]# name=${name:-tom} [root@localhost ~]# echo $name tom [root@localhost ~]# name=${name:-jerry} [root@localhost ~]# echo $name tom
-
${var:?error}
:如果变量var为空或未声明,则返回error为错误信息;否则,则返回var变量的值;[root@localhost ~]# echo "User's name is${name:?wrong}" -bash: name: wrong [root@localhost ~]# name=tom [root@localhost ~]# echo "User's name is${name:?wrong}" User's name is tom
-
${var:+word}
:如果变量var为空或未声明,忽略;否则,则返回word;[root@localhost ~]# unset name [root@localhost ~]# echo "User's name is${name:+wrong}" User's name is [root@localhost ~]# name=tom [root@localhost ~]# echo "User's name is${name:+wrong}" User's name is wrong
-
===============
bash多命令执行
-
无逻辑关系的
COMMAND1;COMMAND2;COMMAND3...
-
有逻辑关系的
-
逻辑的运算结果状态:
-
真
(True ,1
) -
假
(False ,0
)
-
-
与运算(乘法)
- 1&&1=1
- 1&&0=0
- 0&&1=0
- 0&&0=0
- 只有两个都为真,结果才为真,否则为假(遵守短路法则)
-
或运算 :加法
- 1 || 0 = 1
- 1 || 1 = 1
- 0 || 1 = 1
- 0 || 0 = 0
- 只要一个为真,即为真,(类似电路并链)
-
非:取反
- ! 1 = 0
- ! 0 = 1
-
异或:判断是否不同
- 不同者为真,相同者为零假
-
短路法则:
#COMMAND1 && COMMAND2 :
COMMAND1为『假』,COMMAND2不会再执行,
COMMAND1为『真』,COMMAND2必须执行
#COMMAND1 || COMMAND2
COMMAND1为『真』;COMMAND2不会执行
COMMAND1为『假』;COMMAND2必须执行
例:# id $username || useradd $username
bash的配置文件
1、bash配置文件的分类
- profile类:为交互式shell提供配置文件
- 全局配置
/etc/profile
/etc/profile.d/*.sh
- 用户个人
~/.bash_profile
- 全局配置
- bashrc类: 为非交互式用户提供配置文件
- 全局配置
/etc/bashrc
- 用户个人
~/.bashrc
- 全局配置
2、profile、bashrc类的功用
- profile类
- 定义用户的全局变量
- 运行命令和脚本
- bashrc类
- 定义本地变量
- 定义别名
3、登录式shell、非登录shell读取配置文件的顺序
- 登录式shell读取顺序
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
- 非登录式shell读取顺序
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
4、让定义的配置文件立即生效
source /PATH/TO/PROFILE
. /PATH/TO/PROFILE
注意: 需要定义全局的别名,需修改/etc/bashrc文件
bash之算术运算
-
let
命令let SUM=$num1+$num2
echo $SUM
-
算术运算表达式一:
echo $[ $num1 + $num2 ]
-
算术运算表达式二:
echo $(($num1 + $num2))
-
算术运算表达式三:
expr $num1 + $num2
-
bash的运算符
+ - * / ** %
注意:乘法符号在有些场景中使用需要加转义符
Bash之条件测试:
判断某需求是否满足,需要由测试机制来实现
1. 使用执行命令,并利用命令状态返回值来判断
- 0:成功,
- 1-255:失败
2. 测试表达式格式
- test expression
- [ expression ] :括号前后两端必须有空格,否则为语法错误
- [[ expression ]] :括号前后两端必须有空格,否则为语法错误, 多为测试字符串
bash的测试类型:
-
数据测试
-
数值比较
- -eq : 是否等;[ $nu1 -eq $num2 ]
- -ne : 是否不等于;
- -gt : 是否大于
- -ge : 大于等于
- -lt : 是否小于
- -le : 是否小于等于
- 注意:可以使用[],[[ ]],建立使用[]
-
字符串测试 : 1、字符串要加引号引用 ;2、做比较时使用双中括号[[ ]]
- == :是否等于
- > : 是否大于,此处也要使用双中括号
- < : 是否小于,此处也要使用双中括号
- != :是否不等于
- =~ :左侧的字符串是否能被右侧的pattern所匹配,匹配为一部分,不是精确匹配
- -z “STRING” : 判断指定的字串是否为空,空则为真,不空则假
- -n “string” :判断指定的字串是否不空,空则为假,不空则真
- 注意:字符串与变量比较时,最好能在变量上加” ”引起来,在字符串比较的时候, 最好能使用双中括号,建议使用[[ ]] ,做等值比较时,必须要在等号前后空格,如果引用是变量,也是需要加空格,变量名可以不用引号引起来
-
-
文件测试
-
存在性测试:
- -a FILE
- -e FILE
- 文件的存在性测试,存在则为真,否则则为假
-
存在性及文件类型
- -b FILE : 是否存在,并且为块设备文件
- -c FILE : 是否存在,并且为字符设备文件
- -d FILE : 是否存在,并且为目录文件
- -f FILE : 是否存在, 并且为普通文件
- -h FILE 或者 -L FILE : 是否存在并且为符号连接文件
- -p FILE : 是否存在, 且为命名管道文件
- -S FILE :是否存在,且为套接字文件
-
-
文件权限测试
- -r FILE : 是否存在,并且可读,对当前用户可读
- -w FILE : 是否存在, 并且可写
- -x FILE : 是否存在, 并且可执行
-
特殊权限测试
- -g FILE : 是否存在, 并且拥有SGID权限
- -u FILE : 是否存在,并且拥有SUID权限
- -k FILE : 是否存在, 且拥有sticky权限
-
文件是否有内容
- -s FILE :是否存在,并且是否有内容
-
时间戳测试
- -N FILE : 文件自从上一次读取操作后,是否被修改过
-
从属关系测试:
- -O FILE : 当前用户是否为文件的属主
- -G FILE : 当前用户是否属于文件的属组
-
双目测试(文件新旧对比)
- FILE1 -ef FILE2 : FILE1 与FILE2是否为指向同一个文件系统上的相同的inode的硬连接
- FILE1 -nt FILE2 : FILE1是否新于FILE2
- FILE1 -ot FILE2 : FILE1是否旧于FILE2
-
组合测试条件
-
逻辑运算:
-
第一种:
- COMMAND1 && COMMAND2
- COMMAND1 || COMMAND2
- !COMMAND
- 例:[ -O FILE ] && [ -r FILE] :是否可读并且为属主
-
第二种:
- [ expression1 -a expression2 ]
- [ expression1 -o expression2 ]
- ![ expression1 ]
- 例: [ -O FILE -a -x FILE ] : 是否是属主并且有执行权限
-
-
注意:-a -o 只能在[]
中使用,如果需要在双括号中使用逻辑换算,需要使用 && || 来代替
Bash脚本之状态返回值:
- 默认是脚本中执行的最后一条命令的状态返回值。
- 自定义状态退出状态码:
- exit [n] :n为自己指定的状态码;0表示成功,非零表示失败
- 注意:shell进程遇到exit时,即会中止,因此整个脚本执行即为结束
- exit [n] :n为自己指定的状态码;0表示成功,非零表示失败
bash编程之向脚本传递参数
-
位置参数变量
- 例:myscript.sh argu1 argu2
-
脚本中引用方式:
- $1,$2…….${10},${11},….
-
位置参数变量轮替
-
shift
: 把引用过的参数T掉,在脚本中永远只使用$1引用下一个- 例: shift 2 : 踢两个,这样就可以在脚本中永远以$1和$2来引用后面的参数
-
bash编程之特殊变量
-
$0 :脚本文件路径本身; 取文件名:basename $0
-
$# : 脚本参数个数
-
$* : 所有参数,每个参数当作为一个字串,一般用于保存用户的参数
-
$@: 所有参数,所有参数当作为一个字串,一般用于保存用户的参数
bash编程之语句类型
-
顺序执行:逐条运行
-
选择执行:
- 两个或者以上的分支:满足条件时只会执行其中一个满足条件的分支
-
循环执行:
- 某代码片断(循环体)要执行0、1或多个来回
脚本之语法错误检查
bash -n script.sh
bash -x script.sh
脚本之用户交互的实现
-
read [option]...[name...]
-
-p PROMPT
: 直接提示输入信息,保存至变量 -
-t TIMEOUT
: 超时设置,默认秒为单位
-
1、 选择执行:
-
单分支的if语句
if 测试条件;then 代码分支 fi
-
双分支的if语句
if 测试条件;then 条件为真时执行的分支 else 条件为假时执行的分支 fi
-
多分支的if语句
if 测试条件;then 条件为真时执行 elif 条件为真时执行 else 条件为假是执行 fi
2、循环执行
-
for循环语句
for VAR in LIST;do 循环体 done
进入条件:只要列表有可用元素,即可进入循环
退出条件:列表中的元素遍历完成后,即退出循环
列表的生成方式:
- 直接给出
- 整数列表
- a:{start..end}
- b: $(seq 起始数值 [步长] 结束数值)
- 返回列表的命令
- glob
- 变量引用
-
while循环语句
while CONDITION1;do 循环体 循环控制变量修正表达式 done
条件进入:CONDITION测试为真
条件退出:CONDITION测试为假
-
until循环语句
until CONDITION;do 循环体 循环控制变量修正表达式 done
条件进入:CONDITION测试为假
条件退出:CONDITION测试为真
在循环中控制循环的方法
1、continue
-
表示提前结束本轮循环,而直接进入下一轮循环的条件测试
while CONDITION1;do COMMNAD1 if CONDITION2;then continue fi COMMNAD N done
示例 : 求100以内的所有偶数之和
#!/bin/bash
declare -i evensum=0
declare -i i=0
while [ $i -le 100 ];do
let i++
if [ $[$i%2] -eq 1];then
continue
fi
let evensum+=$i
done
2、break
- 表示提前跳出循环
示例:100以内所有奇数之和
#!/bin/bash
declare -i evensum=0
declare -i i=1
while true;do
let $oddsum+=$i
let i+=2
if [ $i -gt 100 ];then
break
fi
done
while的特殊用法之遍历文件的行
while read VARIABLE;do
循环休
done < /path/form/somefile
for循环的特殊用法
for ((控制变量初始化;条件判断表达式;控制变量的修正语句));do
循环体
done
控制变量初始化:仅在循环代码开始运行时,执行一次
控制变量的修正语句:每轮循环结束会先进行控制变量修正运算,而后再做判断
case选择执行语法
case $variable in
pattern1)
分支1
;;
pattern2)
分支2
;;
pattern3)
分支3
;;
*)
分支N
esac
case支持glob网络的通配符:
*
?
[]
a|b :a或者b
shell函数
把一段独立功能的代码当作一个整体,并定义一个函数名字,命名的代码段,就称之为一个函数。定义的函数代码段不会自动执行,需在调用的时候执行。调用函数就是批是代码中给出指定的函数名即可。函数可出现在任何位置,在代码执行时,都会被自动替换为函数代码。其函数命名不应该为命令名。其可在过程式编程中实现代码重用
。以此实现模块化编程
和结构化编程
.
- 语法一
function f_name {
...函数体...
} - 语法二
f_name () {
...函数体...
}
函数的生命周期
- 每次被调用时创建,返回时终止
函数的返回值
- 函数返回值:
- 函数的执行结果返回值:
- (1) 使用echo或printf命令进行输出;
- (2) 函数体中调用的命令的执行结果;
- 函数的退出状态码:
- (1) 默认取决于函数体中执行的最后一条命令的退出状态码;
- (2) 自定义:return
- 函数的执行结果返回值:
示例:给定一个用户名,取得用户的id号和默认shell
#!/bin/bash
#
userinfo() {
if id "$username" &> /dev/null; then
grep "^$username\>" /etc/passwd | cut -d: -f3,7
else
echo "No such user."
fi
}
username=$1
userinfo
username=$2
userinfo
传递参数给函数
- 在函数体中当中,可以使用$1,$2, ...引用传递给函数的参数;还可以函数中使用$*或$@引用所有参数,$#引用传递的参数的个数;
- 在调用函数时,在函数名后面以空白符分隔给定参数列表即可,例如,testfunc arg1 arg2 arg3 ..
示例:添加10个用户,其添加用户的功能使用函数实现,用户名做为参数传递给函数
#!/bin/bash
#
# 5: user exists
addusers() {
if id $1 &> /dev/null; then
return 5
else
useradd $1
retval=$?
return $retval
fi
}
for i in {1..10}; do
addusers ${1}${i}
retval=$?
if [ $retval -eq 0 ]; then
echo "Add user ${1}${i} finished."
elif [ $retval -eq 5 ]; then
echo "user ${1}${i} exists."
else
echo "Unkown Error."
fi
done
函数变量的作用域
- 局部变量
- 作用域是函数的生命周期,在函数结束时被自动销毁,定义的方法如下:
- lacal VARIABLE=VALUE
- 作用域是函数的生命周期,在函数结束时被自动销毁,定义的方法如下:
- 本地变量
- 作用域是运行脚本的shell进程的生命周期,作用范围为当前shell脚本程序文件
-
示例
#!/bin/bash # name=tom f_name() { local name=jerry } f_name echo $name 注意:以上正常情况下会显示name=tom,如果不使用local定义为本地函数变量, 那么应该name=jerry.
注意:在函数中定义变量尽量使用local来定义变量
=========
bash之数组
什么是数组?
存储多个元素的连续的内存空间,其数组只有一个名字,其数组的索引号从0开始。
定义一个数组
-
declare -a NAME
: 声明一个索引数组 -
declare -A NAME
: 声明一个关联数组- 索引数组为索引号(下标)从0开始,关联数组的索引号可以自定义,其bash4及以后版本支持关联数组
数组中元素的赋值方式
- 1、一次只赋值一个元素
- NAME[0]=pig
- NAME[1]=dog
- 2、一次赋值全部元素
- NAME=("VAL1","VAL2","VAL3",...)
- 3、只赋值特定元素
- NAME=([0]="val1" [3]="val3",....): 稀疏格式的数组定义
- 4、read -a array_name
- val1 val2 val3.....(直接在提示符中写,写后回车即可)
- 5、declare -A world
- world[us]="america"
- world[uk]="United kingdom" :这种方式即关联数组,直接给定下标名称
数组中的元素引用
- echo ${name[0]}
- 引用时只给数组名,表示引用为下标为0的元素
数组的长度引用 (即数组中元素的个数 )
* ${#ARRAY_NAME[*]}
* ${#ARRAY_NAME[@]}
注意:${#ARRAY_NAME},表示引用第一个元素的字符串长度
引用数组中的所有元素
- ${array_name[*]}
- ${array_name[@]}
数组元素切片
- ${array_name[@]:offset:number}
- offset :要跳过元素的个数
- number :要取出元素的个数,省略number时,表示取偏移量之后的所有元素
向非稀疏数组中追加元素
- array_name[${array_name[*]}]=
删除数组中的某元素
- unset array[index]
关联数组的定义
- declare -A array_name
- array_name=([index_name1]="val1" [index_name2]="val2")
bash之信号捕捉
trap 命令
-
-l
: 列出所有信号 - man 7 signal : 查看所有信号的功用
- kill -l : 查看所有信号
向脚本传递信号示例
#!/bin/bash
#
trap 'echo "dou ni wan er."' INT
trap 'echo "quit";exit1' INT
注意:可以把捕捉信号定义在一个函数里,在其它位置调用,脚本参考<脚本合集>
bash之颜色设置
- echo -e "\033[42;35;5mHello world\033[0m"
[左侧]4表示后景色
[左侧]3表示前景色
颜色分类:1,2,3,4,5,6,7
-
#m : 定义加粗 、闪烁等功能
多种控制符,可组合使用,彼此间用分号隔开