【转】shell脚本处理字符串的常⽤⽅法转⾃:blog.csdn/linfeng999/article/details/6661233
1. 构造字符串
直接构造
STR_ZERO=hello #shell中等号左右的空格不能随便加,如果写作STR_ZERO = hello,linux会认为STR_ZERO是⼀个命令⽽执⾏出错STR_FIRST="i am a string"
STR_SECOND='success'
USER_NAME='world'
重复多次
#repeat the first parm($1) by $2 times
strRepeat(){
local x=$2 #$2代码函数的第2个参数
if [ "$x" == "" ]; then #此处中括号靠⾥必有空格,否则报错。if后需有空格,否则报错。
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" #双引号可输出变量中的值,单引号仅输出变量名
2、赋值与拷贝
直接赋值,与构造字符串⼀样
USER_NAME=terry
从变量赋值
ALIASE_NAME=$USER_NAME
3、联接
直接联接两个字符串
STR_TEMP="$STR_ZERO""$USER_NAME"
STR_TEMP=`printf "%s%s" "$STR_ZERO" "$USER_NAME"` #printf可设置较为复杂的字符串组合格式
4、求长
获取字符串变量的长度
${#STR_ZERO} #5
求字符数(char)
COUNT_CHAR=`echo "$STR_ZERO" | wc -m`
echo $COUNT_CHAR #6
求字节数(byte)
COUNT_BYTE=`echo "$STR_ZERO" | wc -c`
echo $COUNT_BYTE #6
求字数(word)
COUNT_WORD=`echo "$STR_FIRST" | wc -w`
echo $COUNT_WORD #1
5、⽐较
字符串相等⽐较 str1 = str2 或 str1 == str2
字符串不等⽐较 str1 != str2
数字相等返回真: -eq
数字不相等返回真:-nq
数字⼤于返回真:-gt
数字⼩于返回真:-lt
数字⼤于等于返回真:-ge
数字⼩于等于返回真:-le
举例:
if [ "$USER_NAME" = "terry" ]; then
echo "I am terry"
fi
⼩于⽐较
#return 0 if the two string is equal, return 1 if $1 < $2, else 2 strCompare() {
local x=0
if [ "$1" != "$2" ]; then
x=2
local TEMP=`printf "%s\n%s" "$1" "$2"`
local TEMP2=`(echo "$1"; echo "$2") | sort`
if [ "$TEMP" = "$TEMP2" ]; then
x=1
fi
fi
echo $x
}
6、
判断是否为空: -z str
判断是否为⾮空 -n str
判断是否为正规⽂件 -f file
判断是否为⽬录: -d file
判断是否可读/写/执⾏: -r/w/x file
shell 字符串长度
是否为数字
# 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"`
7、分割
以符号+为准,将字符分割为左右两部分,使⽤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; }'
8、Shell字符串截取
shell 截取字符变量的前8位
9、按指定的字符串截取
第⼀种⽅法:
${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
$ test='c:/windows/boot.ini'
$ echo ${test#/}
c:/windows/boot.ini
$ echo ${test#*/}
windows/boot.ini
$ echo ${test##*/}
boot.ini
第⼆种⽅法:
${varible:n1:n2}:截取变量varible从n1开始的n2个字符,组成⼀个⼦字符串。可以根据特定字符偏移和长度,使⽤另⼀种形式的变量扩展,来选择特定⼦字符串。试着在 bash 中输⼊以下⾏:
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga
这种形式的字符串截断⾮常简便,只需⽤冒号分开来指定起始字符和⼦字符串长度。
10、按照指定要求分割:
⽐如获取后缀名
ls -al | cut -d “.” -f2
11、shell (bash) ⽐较运算符
运算符描述⽰例
⽂件⽐较运算符
-e filename如果filename存在,则为真[ -e /var/log/syslog ]
-d filename如果filename为⽬录,则为
真
[ -d /tmp/mydir ]
-f filename如果filename为常规⽂件,
则为真
[ -f /usr/bin/grep ]
-L filename如果filename为符号链接,
则为真
[ -L /usr/bin/grep ]
-r filename如果filename可读,则为真[ -r /var/log/syslog ]
-w filename如果filename可写,则为真[ -w / ]
-x filename如果filename可执⾏,则为
真
[ -L /usr/bin/grep ]
filename1 -nt filename2如
果filename1⽐filename2新,
则为真
[ /tmp/install/etc/services -nt
/etc/services ]
filename1 -ot filename2如
果filename1⽐filename2旧,
则为真
[ /boot/bzImage -ot
arch/i386/boot/bzImage ]
字符串⽐较运算符[size=-1](请注意引号的使⽤,这是防⽌
空格扰乱代码的好⽅法)
-z string如果string长度为零,则为真[ -z "$myvar" ]
-n string如果string长度⾮零,则为真[ -n "$myvar" ]
string1==string2如果string1与string2相同,
则为真
[ "$myvar" = "one two three" ]
如果string1与string2不同,[ "$myvar" != "one two three"
string1!=string2则为真]
算术⽐较运算符
num1 -eq num2等于[ 3 -eq $mynum ] num1 -ne num2不等于[ 3 -ne $mynum ] num1 -lt num2⼩于[ 3 -lt
$mynum ] num1 -le num2⼩于或等于[ 3 -le $mynum ] num1 -gt num2⼤于[ 3 -gt $mynum ] num1 -ge num2⼤于或等于[ 3 -ge $mynum ]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论