1、变量名可变的用法:
var='name'
let "`echo $var`="jams"
echo $name
2、命令组:
(a=hello; echo $a)
将会作为子shell来运行,括号中的变量,对于脚本剩下的部分不可用。
这一点与{}代码块是不同的,所以函数里的变量都是全局。
3、管道“|”,会起一个子shell,里面的变量对父进程是不可用的,这一点特别需要注意,特别是用在while中。
要想父子shell共享变量,可以用如下的进程替换方法:
while read line; do
let "i+=1"
#echo "i=$i"
if [ "$i" = "1" ]
then
texts=`echo "$line" | tr " " "/n"`
j=1
for t in $texts
do
#echo "j=$j"
if [ "$j" = "2" ]
then
code=$t
#echo "code=$code"
let "finished+=1"
break
fi
let "j+=1"
done
continue
fi
done< <(echo "$headers") # 进程替换
echo $code
4、用“:”分隔子符串
pos=`expr index "$line" " "`
#echo "pos=$pos"
if (( pos >= 0 ))
then
length=${line:$pos}
#echo "length=$length"
let "finished+=1"
fi
5、算术表达式测试
pos=10
if (( pos >= 0 ))
then
echo ">0"
fi
6、合并的条件测试
if [[ -n "$a" && "$a" -eq "yes" ]]
then
echo "yes"
fi
或者
if [ -n "$a" ] && [ "$a" -eq "yes" ]
then
echo "yes"
fi
7、数组元素
a[1]=10
echo ${a[1]}
8、对整形变量,要先声明:
declare -i b
b=10
b+=102
9、getopts处理可变参数
#!/bin/bash
while getopts 'd:Dm:f:t' OPT; do
case $OPT in
d)
DEL_DAYS="$OPTARG";;
D)
DEL_ORIGINAL='yes';;
f)
DIR_FROM="$OPTARG";;
m)
MAILDIR_NAME="$OPTARG";;
t)
DIR_TO="$OPTARG";;
?)
echo "Usage: `basename $0` [options] filename"
esac
done
shift $(($OPTIND-1))
echo "DEL_DAYS=$DEL_DAYS"
echo "DEL_ORIGINAL=$DEL_ORIGINAL"
echo "DIR_FROM=$DIR_FROM"
echo "MAILDIR_NAME=$MAILDIR_NAME"
其中:
getopts后面的字符串就是可以使用的选项列表,每个字母代表一个选项,后面带:的意味着选项除了定义本身之外,还会带上一个参数作为选项的值,比如d:在实际的使用中就会对应-d 30,选项的值就是30;getopts字符串中没有跟随:的是开关型选项,不需要再指定值,相当于true/false,只要带了这个参数就是true。如果命令行中包含了没有在getopts列表中的选项,会有警告信息,如果在整个getopts字符串前面也加上个:,就能消除警告信息了。
8、显示转义字符
echo -e "/n"
显示时不换行
a="abc"
echo -n "$a"
9、字符串比较:
> < = -n -z
整数比较:
-gt -lt -eq
逻辑比较
-a 逻辑与, -o 逻辑或
10、算术运算
n=1
let "n+=1"
或
(( n++ ))
(( n+=5 ))