Shell处理字符串常用方法

来源:互联网 发布:ssd测试软件 编辑:程序博客网 时间:2024/05/01 08:07

一、构造字符串

  直接构造

  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可以进行更复杂的联接

四、求长

  获取字符串变量的长度:${#string}

  求字符数(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=2localTEMP=`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

  shell (bash) 比较运算符

 

运算符描述 示例 文件比较运算符   -efilename如果filename存在,则为真 [ -e /var/log/syslog ] -dfilename 如果filename为目录,则为真 [ -d /tmp/mydir ] -ffilename 如果filename为常规文件,则为真 [ -f /usr/bin/grep ] -Lfilename 如果filename为符号链接,则为真 [ -L /usr/bin/grep ] -rfilename 如果filename可读,则为真 [ -r /var/log/syslog ] -wfilename 如果filename可写,则为真 [ -w /var/mytmp.txt ] -xfilename 如果filename可执行,则为真 [ -L /usr/bin/grep ] filename1-ntfilename2 如果filename1比filename2新,则为真 [ /tmp/install/etc/
services -nt /etc/services ] filename1-otfilename2 如果filename1比filename2旧,则为真 [ /boot/bzImage
-otarch/i386/boot/
bzImage ] 

字符串比较运算符
[size=-1](请注
意引号的使用,这是
防止空格扰乱代码的
好方法) 

  -zstring 如果string长度为零,则为真 [ -z "$myvar" ] -nstring 如果string长度非零,则为真 [ -n "$myvar" ] string1=string2 如果string1与string2相同,则为真 [ "$myvar" = "one
two three" ] string1!=string2 如果string1与string2不同,则为真 [ "$myvar" != "one
two three" ] 算术比较运算符   num1-eqnum2 等于 [ 3 -eq $mynum ] num1-nenum2 小于或等于 [ 3 -le $mynum ] num1-ltnum2 小于 [ 3 -lt $mynum ] num1-lenum2 小于或等于 [ 3 -le $mynum ] num1-gtnum2 大于 [ 3 -gt $mynum ] num1-genum2 大于或等于 [ 3 -ge $mynum ]