Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42291
  • 博文数量: 8
  • 博客积分: 31
  • 博客等级: 民兵
  • 技术积分: 178
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-09 12:29
文章分类

全部博文(8)

文章存档

2014年(6)

2013年(1)

2012年(1)

我的朋友

分类: LINUX

2014-01-22 17:23:56

一、构造字符串


直接构造
STR_ZERO=hello
STR_FIRST="i am a string"
STR_SECOND='success'

重复多次
#repeat the first parm($1) by $2 times
strRepeat()
{
local x=$2
if [ "$x" == "" ]; then
x=0
fi

local STR_TEMP=""
while [ $x -ge 1 ];
do
STR_TEMP=`printf "%s%s" "$STR_TEMP" "$1"`
x=`expr $x - 1`
done
echo $STR_TEMP
}

举例:
STR_REPEAT=`strRepeat "$USER_NAME" 3`
echo "repeat = $STR_REPEAT"


二、赋值与拷贝

直接赋值
与构造字符串一样
USER_NAME=terry

从变量赋值
ALIASE_NAME=$USER_NAME


三、联接

直接联接两个字符串
STR_TEMP=`printf "%s%s" "$STR_ZERO" "$USER_NAME"`
使用printf可以进行更复杂的联接


四、求长

求字符数(char)
COUNT_CHAR=`echo "$STR_FIRST" | wc -m`
echo $COUNT_CHAR

求字节数(byte)
COUNT_BYTE=`echo "$STR_FIRST" | wc -c`
echo $COUNT_BYTE

求字数(word)
COUNT_WORD=`echo "$STR_FIRST" | wc -w`
echo $COUNT_WORD


五、比较

相等比较
str1 = str2

不等比较
str1 != str2

举例:
if [ "$USER_NAME" = "terry" ]; then
echo "I am terry"
fi

小于比较
#return 0 if the two string is equal, return 1
if $1 < $2, else 2strCompare()
{
 local x=0 if [ "$1" != "$2" ]; then
 x=2
 localTEMP=`printf "%s\n%s" "$1" "$2"`
 local TEMP2=`(echo "$1"; echo "$2") |sort`
 if [ "$TEMP" = "$TEMP2" ]; then
  x=1
 fi
fi
echo $x
}


六、测试

判空
-z str

判非空
-n str

是否为数字
# return 0 if the string is num, otherwise 1
strIsNum()
{
 local RET=1
 if [ -n "$1" ]; then
  local STR_TEMP=`echo "$1" | sed 's/[0-9]//g'`
  if [ -z "$STR_TEMP" ]; then
   RET=0
  fi
 fi
 echo $RET
}

举例:
if [ -n "$USER_NAME" ]; then
 echo "my name is NOT empty"
fi

echo `strIsNum "9980"`


七、分割

以符号+为准,将字符分割为左右两部分
使用sed
举例:
命令 date --rfc-3339 seconds 的输出为
2007-04-14 15:09:47+08:00
取其+左边的部分
date --rfc-3339 seconds | sed 's/+[0-9][0-9]:[0-9][0-9]//g'
输出为
2007-04-14 15:09:47
取+右边的部分
date --rfc-3339 seconds | sed 's/.*+//g'
输出为
08:00

以空格为分割符的字符串分割
使用awk
举例:
STR_FRUIT="Banana 0.89 100"
取第3字段
echo $STR_FRUIT | awk '{ print $3; }'


八、子字符串

字符串1是否为字符串2的子字符串
# return 0 is $1 is substring of $2, otherwise 1
strIsSubstring()
{
 local x=1
 case "$2" in
  *$1*) x=0;;
 esac

 echo $x
}

Shell字符串截取
一、Linux shell 截取字符变量的前8位,有方法如下:

1.expr substr “$a” 1 8
2.echo $a|awk ‘{print substr(,1,8)}’
3.echo $a|cut -c1-8
4.echo $
5.expr $a : ‘\(.\\).*’
6.echo $a|dd bs=1 count=8 2>/dev/null


二、按指定的字符串截取

1、第一种方法:

?${varible##*string} 从左向右截取最后一个string后的字符串
?${varible#*string}从左向右截取第一个string后的字符串
?${varible%%string*}从右向左截取最后一个string后的字符串
?${varible%string*}从右向左截取第一个string后的字符串
“*”只是一个通配符可以不要

例子:
$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg

2、第二种方法:${varible:n1:n2}:截取变量varible从偏移量n1后长度为n2的子字符串。

可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga

这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。

三、按照指定要求分割:
比如获取后缀名
ls -al | cut -d “.” -f2


四、获取字符串长度:
len=`expr length $str`
len=`echo $str|awk '{print length($0)}'`
echo ${str} | wc -L
echo ${#s}


#生成随机密码
    MATRIX="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_"
    LENGTH="8"
    while [ "${n:=1}" -le "$LENGTH" ]
    do
        PASS="$PASS${MATRIX:(($RANDOM%${#MATRIX})):1}"
        let n+=1
    done
    echo "$PASS"

echo "$(($RANDOM%5))" 输出小于5的随机正整数:0-4


************变量长度和字符串子串删除*****************

${#var}
字符串长度(变量$var得字符个数). 对于array来说, ${#array}表示的是数组中第一个元素的长度
例外情况:
    ${#*}和${#@}表示位置参数的个数.
    对于数组来说, ${#array[*]}和${#array[@]}表示数组中元素的个数

${var#Pattern}, ${var##Pattern}
    从变量$var的开头删除最短或最长匹配$Pattern的子串. ( 一个"#"表示从左到右匹配最短, "##"表示匹配最长.)
${var%Pattern}, ${var%%Pattern}
    从变量$var的结尾删除最短或最长匹配$Pattern的子串. (一个"%"表示从右到左匹配最短, "%%"表示匹配最长.)

shell字符串的截取的问题
${varible##*string} 从左向右截取最后一个string后的字符串
${varible#*string}从左向右截取第一个string后的字符串
${varible%%string}从右向左截取最后一个string后的字符串
${varible%string}从右向左截取第一个string后的字符串

${var:pos}
    变量var从位置pos开始扩展(译者注: 也就是pos之前的字符都丢弃).
${var:pos:len}
    变量var从位置pos开始, 并扩展len个字符. 参考例子 A-14, 这个例子展示了这种操作的一个创造性的用法.
    ${str:begin:len},且支持表达式,如:${str:3:(6-3)}
${var/Pattern/Replacement}
    使用Replacement来替换变量var中第一个匹配Pattern的字符串.
    如果省略Replacement, 那么第一个匹配Pattern的字符串将被替换为空, 也就是被删除了.
${var//Pattern/Replacement}
    全局替换. 所有在变量var匹配Pattern的字符串, 都会被替换为Replacement.
    和上边一样, 如果省略Replacement, 那么所有匹配Pattern的字符串, 都将被替换为空, 也就是被删除掉.
例:
    file=/dir1/dir2/dir3/my.file.txt
    ${file:0:5}:提取最左邊的 5 個字節:/dir1
    ${file:5:5}:提取第 5 個字節右邊的連續 5 個字節:/dir2
    我們也可以對變量值裡的字串作替換:
    ${file/dir/path}:將第一個 dir 提換為 path:/path1/dir2/dir3/my.file.txt
    ${file//dir/path}:將全部 dir 提換為 path:/path1/path2/path3/my.file.txt
    SHELL中每个程序都有他自己的特殊字符,如${}、SED、AWK、及各种正则表达式等。



${var/#Pattern/Replacement}
如果变量var的前缀匹配Pattern, 那么就使用Replacement来替换匹配到Pattern的字符串. 相当于正则表达式中的"^"
${var/%Pattern/Replacement}
如果变量var的后缀匹配Pattern, 那么就使用Replacement来替换匹配到Pattern的字符串. 相当于正则表达式中的"$"

${!varprefix*}, ${!varprefix@}
匹配所有之前声明过的, 并且以varprefix开头的变量.
例1:
    xyz23=whatever
    xyz24=
   
    a=${!xyz*} # 展开所有以"xyz"开头的, 并且之前声明过的变量名.
    echo "a = $a" # a = xyz23 xyz24
    a=${!xyz@} # 同上.
    echo "a = $a" # a = xyz23 xyz24
   
例2:
    abc1="123"
    abc2=""
    abc3="789"
    for var in ${!abc*}
    do
        echo "var name="$var
        eval echo "var value="\${$var}
    done
   
# Bash, 版本2.04, 添加了这个功能.

缺省值(:-

如果变量后面跟着冒号和减号,则变量后面跟着是这个变量的缺省值。

$ COMPANY=

$ printf “%s/n” “${COMPANY:-Unknown Company}”

Unknown Company

变量的实际值可以保持不变。

冒号也可以省略掉不用:

$ COMPANY=

$ printf “%s/n” “${COMPANY-Nightlight Inc.}”

$

指定缺省值(:=

如果变量后面跟着冒号和等号,则给空变量指定一个缺省值。

$ printf “%s/n” “${COMPANY:=Nightlight Inc.}”

Nightlight Inc.

$ printf “%s/n” “$COMPANY”

Nightlight Inc.

变量的实际值已经改变了。

去除冒号,则不会指定缺省值。


变量是否存在检查(:?

如果变量后面跟着冒号和问号,则根据变量是否存在,显示不同的信息。信息不是必选的。

printf “Company is %s/n” /

${COMPANY:?Error: Company has notbeen defined—aborting}”

如果没有冒号则不会进行检查。


覆盖缺省值(:+)

如果变量后面跟着冒号和加号,则加好后面的字符串替换默认字符串。

$ COMPANY=”Nightlight Inc.”

$ printf “%s/n” “${COMPANY:+Company has been overridden}”

Company has been overridden

如果没有冒号,变量也被字符串所替换,变量本身的值不改变。


替换部分字符串(:n

如果变量后面跟着一个冒号和数字,则返回该数字开始的一个子字符串,如果后面还跟着一个冒号和数字。则第一个数字表示开始的字符,后面数字表示字符的长度。

$ printf “%s/n” “${COMPANY:5}”

light Inc.

$ printf “%s/n” “${COMPANY:5:5}”

light

阅读(1968) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~