shell脚本中函数的使用
定位文件格式: ./pathname/filename
文件载入: . /filename
此即 <点><空格><斜线><文件名>
使用set命令确保函数的载入。set命令将在shell中显示所有的载入函数。
执行shell函数,简单地的键入函数名即可。
对函数做些修改。首先删除函数,使其对shell不可利用。使用unset命令完成。
在脚本中调用函数,首先创建函数,并确保它位于调用之前
函数测试 func2脚本
#!/bin/sh
char_name()
{
_Letters_Only=$1
_Letters_Only=`echo $1|awk '{if($0~/[^a-zA-X]/) print "1"}'`
if [ "$_Letters_Only" != "" ]
then
return 1
else
return 0
fi
}
name_error()
{
echo "$@ contains errors ,it ,must contain only letters"
}
while :
do
echo -n "what is your first name :"
read F_Name
if char_name $F_Name
then
break
else
name_error $F_Name
fi
done
while :
do
echo -n "what is your surname :"
read S_Name
if char_name $S_Name
then
break
else
name_error $_Name
fi
done
2、字符串大写函数 str_to_upper 脚本
#!/bin/sh
str_to_upper()
{
_str=$1
if [ $# -ne 1 ]; then
echo "number_file: I need a string to convert please "
return 1
fi
echo $@ | tr '[a-z]' '[A-Z]'
}
3、列出文本文件的行号 number_file脚本
#!/bin/sh
number_file()
{
_Filename=$1
if [ $# -ne 1 ]; then
echo "number_file: I need a filename to number"
return 1
fi
loop =1
while read Line
do
echo "$loop :$Line"
loop=`expr $loop + 1 `
done <$_Filename
}
4、判断字符串是否为大写 is_upper脚本
#!/bin/sh
is_upper()
{
if [ $# -ne 1 ]; then
echo "is_upper:I need a string to test OK"
return 1
fi
_Is_Upper=`echo $1|awk '{if($0~/[^A-Z]/) print "1"}'`
if [ "$_Is_Upper" != "" ]
then
return 1
else
return 0
fi
}
echo -n "Enter the filename :"
read FileName
if is_upper $FileName ; then
echo "Great it's upper case"
else
echo "Sorry it's not upper case"
fi
要测试字符串是否为小写,只需要在is_upper中替换相应的awk语句即可。此为
is_lower
_Is_Lower=`echo $1|awk '{if($0~/[^a-z]/) print "1"}'`
5、 测试字符串长度 check_length脚本
#!/bin/sh
check_length()
{
_str=$1
_max=$2
if [ $# -ne 2 ]; then
echo "check_length; I need a string and max length the string should be "
return 1
fi
#check the length of the string
_Length=`echo $_str|awk '{print length($0)}'`
if [ "$_Length" -gt "$_max" ]; then
return 1
else
return 0
fi
}
while :
do
echo "Enter your First name :"
read Name
if check_length $Name 10
then
break
else
echo "The name field is too long 10 charater max "
fi
done
使用wc命令接收键盘操作输入时有一个误操作。如果用户输入一个名字后,点击了几次空格键
wc也将这些空格作为字符串的一部分。因而给出其错误的长度。awk在读取键盘时缺省截去字符串末尾处空格。
6、chop函数删除字符串前面的字符 chop脚本
#!/bin/sh
chop ()
{
# to call: chop string how_many_charts_to_chop
_str=$1
_chop=$2
chop=`expr $_chop + 1 `
if [ $# -ne 2 ]; then
echo "check_length : I need a string and how manay characters to chop "
return 1
fi
_Length=`echo $_str|awk '{print length($0)}'`
if [ "$_Length" -lt "$_chop" ]; then
echo "sorry you have asked to chop more characters than there ara in the string "
return 1
fi
echo $_str |awk '{print substr($1,'$_chop')}'
}
分割
以符号+为准,将字符分割为左右两部分
使用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; }'
sed 's/:.*//' main.7 删除第一个冒号后边的所有东西
sed 's/Tolstoy/Campus/g' < example.txt 用Campus 代替Tolstoy
cut -d : -f 1,3,5 main.4 剪切第1,3,5个数据
awk ' { print $9 }' main.7
可以用 bash 的内建变量扩展, ex
user@minix-nb:~$ cat a
#! /bin/bash
bank_code="123456"
string2="abc001"
another="$bank_code$string2"
length=${#bank_code}
mycut=${another:$length}
echo "$mycut"
user@minix-nb:~$ ./a
abc001
user@minix-nb:~$ cat a
#! /bin/bash
bank_code="123456"
string2="abc00100912_edf"
another="$bank_code$string2"
length=${#bank_code}
mycut=${another:$length}
echo "$mycut"
user@minix-nb:~$ ./a
abc00100912_edf
$mycut 是变量扩展, 参阅 bash 在线手册 , ${var:offset:length}
用冒号分割字符echo "12:23:55.345" | awk -F ':' '{print $1" "$2" "$3}'