1、shell里统计字符串长度
设shell变量
var=hello
有哪些方法计算$var的长度呢,下面提供几种常用方法:
1 ${#var}
2 expr length $var 或者 expr $var : ./* 或者expr match $var .*
3 awk 'BEGIN {print length("'$var'")}'
4 echo -n $var | wc -c
2、shell里的数组
Bash中还可以使用数组变量,其赋值有两种:
(1) name = (value1 ... valuen) 此时下标从0开始
(2) name[index] = value
数组下标的范围没有任何限制,同时也不必使用连续的分量.
--------------------------------------------------------------------------------
$ A=(a b c def)
==================================================
$ echo ${A[@]} //取全部元素
a b c def
=================================================
$ echo ${A[0]} //取第一个元素
a
=================================================
//取得数组元素的个数
$ echo ${#A[@]}
4
$ echo ${#A[*]}
4
$ echo ${#A[3]} //取得元素3的长度
$
==================================================
$ A[3]=yaoshuyin //将第三个元素重新赋值
$ echo ${A[@]}
a b c yaoshuyin
=================================================
//清除变量
$ unset A
$ echo ${A[@]}
$
==================================================
//清空变量,即将值变为空
$ A=
$ echo ${A[@]}
$
==================================================
#清理一个月前log的脚本
HOME_PATH[0]="/data/path1" HOME_PATH[1]="/data/path2" HOME_PATH[2]="/data/path3" lenArrSource=${#HOME_PATH[*]} i=0 while [ $i -lt $lenArrSource ] do echo ${HOME_PATH[$i]} cd ${HOME_PATH[$i]} rm *${CurDay}* let i++ done
3、for、while、if、case的使用
(1) for的例子
for user in $(cut -d: -f1 $FILENAME)
do
echo $user
done
(2) while的例子
while read name do cd /usr/local/services/$name/admin/data if [ -d /usr/local/services/$name/admin/data/tmp ];then rm -rf tmp; mkdir -p tmp; #注意,sh的话这里不能使用局部变量 fi done < $HOME/file.tmp
////////////////////////////
i=20100115 while [ $i -lt 20100129 ] do awk -F"&" '{ print $4,$11}' flow.$i | sort -u | awk -F'[ =]' -v date=$i '{ a+=$4; sum++;} END { printf("%d/t%d/t%d/n", date, sum, a/1000);}' (( i=i+1)) done
(3) if的例子
if [ $WRONG_NUM -ge 20 -o $WRONG_NUM -lt -10 ];then
(4) case的例子
RAND=`expr $RANDOM % 3`
case "$RAND" in
0)
ret=`expr index "$1" "$2"`
;;
1)
ret=`echo $1 $2 | awk '{print index($1, $2)}'`
;;
*)
ret=`expr index "$1" "$2"`
;;
esac
4、 常用
(1)crontab里的脚本加上如下的环境变量,避免crontab执行时找不到变量
PATH=/usr/local/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/sbin:$PATH;
export PATH
(2)
ARGC="$#" #命令行参数个数
ARGV="$*" #命令行参数列表
RUN_HOME=`dirname $0` #脚本所在路径
INDEX=`expr $RANDOM % 10`;
(3)
Ctrl + a - Jump to the start of the line
Ctrl + e - Jump to the end of the line
Ctrl + u - Delete backward from cursor // 密码输入错误的时候比较有用
(4)导入crontab
{crontab -l; echo "* * * * *" /path/to/mon.sh; } | crontab -
5、处理数据库
#!/bin/sh i=10 while [ $i -lt 100 ]; do j=0; while [ $j -lt 100 ]; do /usr/local/mysql/bin/mysql -uroot <<! use db_usr_info_${i}; ALTER TABLE t_usr_info_${j} ADD iCftTmpAccount int(10) unsigned NOT NULL default '0'; !#此处的!号要写到行首 j=`expr $j + 1` done i=`expr $i + 1` done
6、awk相关
(1) 将shell的变量传递给awk
awk -v var=$SHELL_VAR '{ print var;}'
7、要注意变量为空的情况,经常会发生“在异常情况下,变量为空,导致脚本报错”