设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

9个函数示例,让你重新认识Shell(2)

发布时间:2021-01-04 10:33 所属栏目:53 来源:网络整理
导读:在Linux中写一个bash脚本,然后在脚本中定义函数.同时使用number_file $1的方式调用该函数,代码如下: #!/bin/bash# number_file# to call: number_file filenamenumber_file{ ? ? ? ?_FILENAME=$1 ? ? ? ?# check we

在Linux中写一个bash脚本,然后在脚本中定义函数.同时使用number_file $1的方式调用该函数,代码如下:

#!/bin/bash
# number_file
# to call: number_file filename
number_file()
{
 ? ? ? ?_FILENAME=$1
 ? ? ? ?# check we have the right params
 ? ? ? ?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
}
number_file $1

执行脚本输出如下:

1: 10.0.0.1 dev ppp0 ?proto kernel ?scope link ?src 192.168.100.7
2: 10.0.0.1 dev ppp1 ?proto kernel ?scope link ?src 192.168.100.8
3: 88.88.88.0/24 dev eth0 ?proto kernel ?scope link ?src 88.88.88.210
4: 127.0.0.0/24 dev lo ?scope link
5: default
6: nexthop dev ppp0 weight 1
7: nexthop dev ppp1 weight 1
8:

直接用nl的输出结果如下,对比两者,似乎前者更加直观:

 ? ? 1 ?10.0.0.1 dev ppp0 ?proto kernel ?scope link ?src 192.168.100.7
 ? ? 2 ?10.0.0.1 dev ppp1 ?proto kernel ?scope link ?src 192.168.100.8
 ? ? 3 ?88.88.88.0/24 dev eth0 ?proto kernel ?scope link ?src 88.88.88.210
 ? ? 4 ?127.0.0.0/24 dev lo ?scope link
 ? ? 5 ?default
 ? ? 6 ? ? ? ? ?nexthop dev ppp0 weight 1
 ? ? 7 ? ? ? ? ? ? ? ? ?nexthop dev ppp1 weight 1

五、字符串大写

有时需要在文件中将字符串转为大写,例如在文件系统中只用大写字符创建目录或在有效的文本域中将输入转换为大写数据.以下是相应功能函数,可以想像要用到tr命令:

#/bin/bash
# str_to_upper
# to call: str_to_upper $1
str_to_upper()
{
 ? ? ? ?_STR=$1
 ? ? ? ?# check we have the right params
 ? ? ? ?if [ $# -ne 1 ]; then
 ? ? ? ? ? ? ? ?echo "number_file: I need a string to convert please"
 ? ? ? ? ? ? ? ?return 1
 ? ? ? ?fi ? ? ?
 ? ? ? ?echo $@ | tr '[a-z]' '[A-Z]'
}
str_to_upper $1

变量upper 保存返回的大写字符串,注意这里用到特定参数$@来传递所有参数.strtoupper可以以两种方式调用.在脚本中可以这样指定字符串.

UPPER=`sh str_to_upper.sh filename`
echo $UPPER

或者以函数输入参数$1的形式调用它:

UPPER=`sh str_to_upper.sh $1`
echo $UPPER

六、判断字母是否为大写

虽然函数strtoupper做字符串转换,但有时在进一步处理前只需知道字符串是否为大写.isupper实现此功能.在脚本中使用if语句决定传递的字符串是否为大写.函数如下:

is_upper()
{
 ? ? ? ?# check we have the right params
 ? ? ? ?if [ $# -ne 1 ]; then
 ? ? ? ? ? ? ? ?echo "is_upper: I need a string to test OK"
 ? ? ? ? ? ? ? ?return 1
 ? ? ? ?fi ? ? ?
 ? ? ? ?# use awk to check we have only upper case
 ? ? ? ?_IS_UPPER=`echo $1 | awk '{if($0~/[^A-Z]/) print "1"}'`
 ? ? ? ?if [ "$_IS_UPPER" != "" ]; then
 ? ? ? ? ? ? ? ?# no,they are not all upper case
 ? ? ? ? ? ? ? ?return 1
 ? ? ? ?else ? ?
 ? ? ? ? ? ? ? ?# yes all upper case
 ? ? ? ? ? ? ? ?return 0
 ? ? ? ?fi ? ? ?
}

要调用isupper,只需给出字符串参数.以下为其调用方式:

echo -n "Enter the filename :"
read FILENAME
if is_upper $FILENAME; then
 ? ? ? ?echo "Great it's upper case"
 ? ? ? ?# let's create a file maybe ??
else ? ?
 ? ? ? ?echo "Sorry it's not upper case"
 ? ? ? ?# shall we convert it anyway using str_to_upper ???
fi

要测试字符串是否为小写,只需在函数is_upper中替换相应的awk语句即可.此为islower.

_IS_LOWER=`echo $1 | awk '{if($0~/[^a-z]/) print "1"}'`

七、字符串长度判断

在脚本中确认域输入有效是常见的任务之一.确认有效包括许多方式,如输入是否为数字或字符;域的格式与长度是否为确定形式或值.假定脚本要求用户交互输入数据到名称域,你会想控制此域包含字符数目,比如人名最多为20个字符.有可能用户输入超过50个字符.以下函数实施控制功能.需要向函数传递两个参数,实际字符串和字符串最大长度.函数如下:

check_length()
# check length
# to call: check_length string max_length_of_string
{
 ? ? ? ?_STR=$1
 ? ? ? ?_MAX=$2
 ? ? ? ?# check we have the right params
 ? ? ? ?if [ $# -ne 2 ]; then
 ? ? ? ? ? ? ? ?echo "check_length: I need a string and max length the string sh
oudle be"
 ? ? ? ? ? ? ? ?return 1
 ? ? ? ?fi ? ? ?
 ? ? ? ?# check the length of the string
 ? ? ? ?_LENGTH=`echo $_STR | awk '{print length($0)}'`
 ? ? ? ?if [ "$_LENGTH" -gt "$_MAX" ]; then
 ? ? ? ? ? ? ? ?# length of string is too big
 ? ? ? ? ? ? ? ?return 1
 ? ? ? ?else ? ?
 ? ? ? ? ? ? ? ?# string is ok in length
 ? ? ? ? ? ? ? ?return 0
 ? ? ? ?fi ? ? 
}

调用函数checklength:

while :
do
 ? ? ? ?echo -n "Enter your FIRST name :"
 ? ? ? ?read NAME
 ? ? ? ?if check_length $NAME 10
 ? ? ? ?then
 ? ? ? ? ? ? ? ?break
 ? ? ? ? ? ? ? ?# do nothing fall through condition all is ok
 ? ? ? ?else
 ? ? ? ? ? ? ? ?echo "The name field is too long 10 characters max"
 ? ? ? ?fi
done

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读