shell函数

shell编程里面一直没怎么使用函数,都是用命令,需要写到递归,用函数处理一下,顺带学习一下,做个记录。

参考   Linux&shell 之高级 Shell 脚本编程 - 创建函数

使用函数

#!/bin/bash
# testing the script
function myfun {
  echo "This is an example of a function"
}
count=1
while [ $count -le 5 ]
do
  myfun
  count=$[ $count +1 ]
done
echo "This is the end of the loop"
myfun
echo "Now this is the end of the script"

(记得空格,函数一定要在使用之前定义,函数名必须唯一)

返回值
可以通过 $? 来确定函数的退出状态

使用 return 命令

#!/bin/bash
# testing the script
function myfun {
  read -p "Enter a value:" value
  echo "double the value"
  return $[ $value * 2 ]
}
myfun
echo "The new vlue is $?" 

结果:
Enter a value:23
double the value
The new vlue is 46
(退出状态的取值范围是 0 到 255,$? 是最近已执行命令的退出状态)

使用函数输出

这种方法最靠谱了
看例子

#!/bin/bash
# testing the script
function myfun {
  read -p "Enter a value:" value
  echo $[ $value * 2 ]
}
result=`myfun`
echo "The new vlue is $result"

(这样就能很好的利用输出结果了)

在函数中使用变量

向函数传递参数

#!/bin/bash
# testing the script
function addem {
  if [ $# -eq 0 ]||[ $# -gt 2 ]
  then
    echo -1
  elif [ $# -eq 1 ]
  then
    echo $[ $1 + $1 ]
  else
    echo $[ $1 + $2 ]
  fi
}
echo -n "Adding 10 and 15:"
value=`addem 10 15`
echo $value
echo -n "Just one number 10:"
value=`addem 10`
echo $value
echo -n "No numbers:"
value=`addem`
echo $value
echo -n "More than two numbers:"
vaule=`addem 10 15 20`
echo $value

结果:
Adding 10 and 15:25
Just one number 10:20
No numbers:-1
(由上述可知,# 可以得到参数的个数,1 表示第一个参数,$2 表示第二个参数)

#!/bin/bash
# testing the script
function addem {
  if [ $# -eq 0 ]||[ $# -gt 2 ]
  then
    echo -1
  elif [ $# -eq 1 ]
  then
    echo $[ $1 + $1 ]
  else
    echo $[ $1 + $2 ]
  fi
}
if [ $# -eq 2 ]
then
  value=`addem $1 $2`
  echo "The value is $value"
else
  echo "Usage:test1 a b"
fi

(函数外面的 # 表示调用脚本使用的参数数,函数里的# 表示调用脚本使用的参数数,函数里的# 表示调用函数使用的参数数,注意这点区别)


作用域是变量的可见区域。

全局变量

在 shell 脚本内处处有效的变量。函数中定义全局变量,那么主代码中有效。主代码中定义全局,函数中也有效。
默认情况下,脚本中定义的变量都是全局变量。
看例子:

#!/bin/bash
# testing the script
function myfun {
  value=$[ $value * 2 ]
}
read -p "Enter a value:" value
myfun
echo "The new value is:$value"

(输入 45,得到 90,这里的 value 在函数中发生变化了,到脚本中一样可以使用,而且已经变化了)

局部变量

作用范围只在函数当中
关键字 local

#!/bin/bash
# testing the script
function myfun {
  local value=$[ $value * 2 ]
}
read -p "Enter a value:" value
myfun
echo "The new value is:$value"

(输入 45,输出 45。因为加上 local 关键字之后,函数中的 value 是局部变量,与外界无关)

#!/bin/bash
# testing the script
function myfun {
  local value=$[ $value * 2 ]
  echo $value
}
read -p "Enter a value:" value
result=`myfun`
echo "The new value is:$value"
echo "The result of the fun is $result"

(不过可以通过输出来获取函数处理的结果,这里的 result 还是处理后的结果,比如输入 45,处理后是 90)

数组变量与函数

#!/bin/bash
# testing the script
function addarray {
  local sum=0
  local newarray
  newarray=(`echo "$@"`)
  for value in ${newarray[*]}
  do
    sum=$[ $sum + $value ]
  done
  echo $sum
}
myarray=(1 2 3 4 5)
echo "The original array is :${myarray[*]}"
arg=`echo ${myarray[*]}`
result=`addarray $arg`
echo "The result is $result"

结果:
The original array is :1 2 3 4 5
The result is 15
(数组参数传入函数,函数获取后,进行处理输出。脚本将输出结果打印)

#!/bin/bash
# testing the script
function addarray {
  local sum=0
  local newarray
  newarray=(`echo "$@"`)
  for value in ${newarray[*]}
  do
    sum=$[ $sum + $value ]
  done
  echo ${newarray[*]}
}
myarray=(1 2 3 4 5)
echo "The original array is :${myarray[*]}"
arg=`echo ${myarray[*]}`
result=`addarray $arg`
echo "The result is $result"

(输出数组)

函数递归

#!/bin/bash
# testing the script
function factorial {
  if [ $1 -eq 1 ]
  then
    echo 1
  else
    local temp=$[ $1 -1 ]
    local result=`factorial $temp`
    echo $[ $result * $1 ]
  fi
}
read -p "Enter value:" value
result=`factorial $value`
echo "The factorial of $value is:$result"

(输入 5,输出 120。大环套小环,小环套更小,逐步执行。
我们一步一步剖析
5 输入得到 5*4!
4 又得到 4*3!
3 又得到 3*2!
2 又得到 2*1
由此得到 5*4*3*2*1 也就是 120


显然单个脚本有助于减少输入量,但是如果多个脚本碰巧使用同样的函数又该怎样?

创建库

#my script functions
function addem {
  echo $[ $1 + $2 ]
}
function multem {
  echo $[ $1 * $2 ]
}
function divem {
  if [ $2 -ne 0 ]
  then
    echo $[ $1 / $2 ]
  else
    echo -1
  fi
}

使用函数库的关键词是 source

#!/bin/bash
# testing the script
source ./myfuncs

result=`addem 10 15`
echo "The result is $result"

(通过 source 就能使用库函数了)

#!/bin/bash
# testing the script
. ./myfuncs

result=`addem 10 15`
echo "The result is $result"

(或者点操作符,效果是一样的)

在命令行中使用函数

[root@localhost shellscript]# function multem {
> echo [[1 * $2]
> }
[root@localhost shellscript]# multem 2 5
10

(多行命令)

在. bashrc 文件中定义函数

直接在命令行定义 shell 函数的缺点是一旦退出 shell,函数定义将失效。
比较省事的方法是将函数定义在 shell 每次启动都能重新载入的地方。.bashrc 文件就是这样的地方。
可以用 source(点操作符)将现有库文件的函数包含进. bashrc 脚本。
重新启动命令(source .bashrc)

# .bashrc
# Source global definitions
if [-f /etc/bashrc]; then
        . /etc/bashrc
fi
# User specific aliases and functions
function addem {
  echo [[1 + $2]
}

(重启之后,新加入的函数就有效了)
脚本中也可以使用了

 
原文地址:https://www.cnblogs.com/dahu-daqing/p/8191823.html