1、变量中字符的长度:${#VARNAME}
#A='hello world'
#echo ${#A} --显示定义变量A的长度,输出结果为11
#11
2、变量赋值等:
${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;
${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;
${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;
${parameter:offset}:去掉定义的偏移数
${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串
- --------------------------------------------------------
- 最常使用的是第一种,比如:
- ${parameter:-word}
- #A=3
- #echo ${A:-30} ---表示变量A不空时,表达式就使用变量自身的值
- #3
- #unset A
- #echo ${A:-30} ---表示变量A为空时,表达式就会使用自身的值
- #30
- #A=${A:-30} ---表示变量A为空时,就会使用自身的值赋给变量A
- #echo $A ---表示变量A不空时,就会使用变量A的值再次赋给变量A
- #30
- ${parameter:+word}
- #A=3
- #echo ${A:+30} ---表示变量A不空时,就会使用word的值
- #3
- #unset A
- #echo ${A:+30} ---表示变量A为空时,其值为空
- #为空
- ${parameter:=word}
- #unset A
- #echo ${A:=30} --表示变量A为空时,不仅把这个表达式展开为这个字符串,而且把字符串值赋给A
- #30
- ${parameter:offset}
- #A='hello world' ---定义一个变量
- #echo ${A:2} ---数字2表示变量A中的字符串自左向右偏移2个,显示从偏移后的所有内容
- #llo world
- ${parameter:offset:length}
- #echo ${A:2:3} ---数字2表示变量A中的字符串自左向右偏移2个,数字3表示从偏移位置之后要取3个字符
- #llo
- -----------------------------------------------------------
3、脚本配置文件
服务脚本通常放在/etc/rc.d/init.d下,一般命名为:/etc/rc.d/init.d/服务脚本
而服务脚本所支持配置文件通常命名为:/etc/sysconfig/服务脚本同名的配置文件
(一般脚本支持的配置文件都会放在sysconfig下,就会判定sysconfig中是否为变量提供值,如果没有赋值,就是用下面操作中为变量赋值)
比如:编辑一个脚本a.sh,脚本的配置文件定义为a.conf
- ---------------------------------------------------------
- 脚本内容:
- #!/bin/bash
- #
- . /root/a.conf ---把a.sh的配置文件读取进来,假设配置文件在/root下,当执行脚本时,脚本会调用配置文件中所定义的字符串
- TEST=${TEST:-info} ---假如配置文件没有为变量TEST定义内容,就会使用在此处为变量定义的字符串
- [ -n "$TEST" ] && echo $TEST ---如果变量不为空,就显示$TEST的值
- 为脚本编辑一个配置文件a.conf
- 配置文件内容:
- TEST='hello world' ---为变量TEST定义值
- --------------------------------------------------------
4、如果脚本中的函数变量与全局变量重名,可以在脚本中使用定义局部变量
格式:local VAR_NAME=
- ---------------------------------------------------------
- 下面演示变量的作用域
- a=1
- test() {
- local a=$[3+4]
- }
- test
- for I in `seq $a 10`; do
- echo $I
- done
- ---如果在全局中定义的变量a与函数中定义的变量a有冲突,可以使用local来定义
- ---如果不加local定义时,输出的结果为7 8 9 10,加上local定义,输出的结果为从1到10
- ---------------------------------------------------------
5、命令mktemp
为了避免自己创建文件或目录与别人创建的文件或目录不冲突,我们可以引用命令mktemp
创建临时文件,每一次执行这个命令都会生成一个不同名称文件,可以使用一个定义变量引用,这时候文件名称就不会变化;
- --------------------------------------
- #mktemp /tmp/file.XX
- #FILE=`mktemp /tmp/file.XX`
- #echo $FILE
- 创建临时目录
- #mktemp -d /tmp/file.XX
- #DIR=`mktemp -d /tmp/file.XX`
- #echo $DIR
- --------------------------------------
6、信号(信号是进程间通信的一种方式,是一个进程向另一个进程发送短小信息,能够实现控制另外一个进程的运作机制,通常使用kill命令)
格式:kill -信号 进程号
常使用的信号:
1、HUP
2、INT
9、KILL
15、TERM
脚本中也能实现信号捕捉,但9和15无法捕捉;要想在脚本中实现信号捕捉可以使用trap命令
格式:trap 'COMMAND' 信号列表
通过编辑一个捕捉信号的脚本来演示trap命令的效果;
- ---------------------------------------------------------
- #!/bin/bash
- NET=192.168.0
- trap 'echo "quit"' INT
- for I in {200..254}; do
- if ping -c 1 -W 1 $NET.$I &> /dev/null; then
- echo "$NET.$I is up."
- else
- echo "$NET.$I is down."
- fi
- done
- ---当执行quit时,让ping命令捕捉信号,不过只是暂时捕捉,之后还会执行ping命令
- ---如果既想执行quit又想exit时,可在上面脚本中一行执行多个语句,语句间用分号分隔
- 比如:trap 'echo "quit",exit 1' INT --此处的INT表示捕捉信号
- --------------------------------------------------------