shell脚本变量,数组与函数

时间:2022-10-15 15:38:40

(一)变量

(1)变量的定义
##等号两边不能有空格
value=123
value="jing"
declare -i value=100
(3)变量的作用域
  • 局部变量
    • 需要使用local 定义
  • 全局变量

例如:

#! /bin/bash

func()
{
echo "global v1 is $v1" #输出200全局变量
local v1=100 #局部变量只在函数内有效
echo local v1 is $v1 #输出100
}
vi=200
func
echo global v1 is $v1 #输出200
(3)系统变量

但对脚本进行传参时,参数的值存放在系统变量中。

  • $* 以“参数1” ”参数2“ “参数3”….的形式返回
  • $#
  • $@ 以“参数1 参数2 参数3….” 的形式返回
  • $num num是数字,代表第num个参数
  • $? 前一个命令或者函数的状态码
  • $$ 返回本进程的ID

(二)数组

(1)定义数组
  • 直接定义
    • arr[0]=”jing”
    • arr[1]=”ti”
  • declare
    • declare -a arr
  • 元素值集合
    • arr=(v0 v1 v2 ….)
  • 通过键值
    • arr=([0]=”one” [1]=”two” ….)
(2)获取数组长度 ${#arr[@]}
(3)获取所有元素 ${arr[@]}
(4)截取部分元素 ${arr[@]:start:length}
(5)替换数组元素的值 ${arr[@]/val/replace}
(6)删除数组以及元素 unset arr,unset arr[n]
(7)赋值数组 newarr=(“${arr[@]}”)
(8)链接数组newarr=(“ arr1[@]"" {arr2[@]}”)两数组中间有空格。
(8)加载文件内容到数组arr=($(cat “filename”))

(三)函数

(1)函数的定义
function function_name()
{
statement
...
}

function_name()
{
statement
...
}
(2)函数的调用
function_name 参数1 参数2 .....
(3)返回值 可以用return返回,但是只能返回0-255之间的数。

例如:

#! /bin/bash

func()
{
val=$((11+22))
return $val
}
func
echo $? #系统变量获得返回值
(4)函数的参数

例如:

#! /bin/bash

func()
{
val=$(($1+$2)) #如果函数参数超过9时,要使用$(10)才行
return $val
}
func 22 33 #传递参数
echo $? #系统变量获得返回值

如果参数太多可以使用shift移动参数,其功能是将参数向左边移动一位,同时删除原来的第一个参数,因此没次shift一次$#就减去1。
例如:

#! /bin/bash
func()
{
while (($# > 0))
do
echo $(1
shift
done
}
func 0 1 2 3 5 6 7 8 9 10 #传递参数

有时候参数太多并需要分情况,这时候单纯的传参就不能满足需求了。此时需要另外一个函数来获得参数getopts().
一般形式:getopts optstring args
【optstring】形如”a:b:c” 如果字母后面跟冒号则说明可以为该选项提供参数值。同时该参数值保存到系统变量$OPTARGS中。

例如:

 #! /bin/bash

func()
{
while getopts "a:b:c" args
do
case $args in
a)
echo a‘s argument is $OPTARG
;;
b)
echo b‘s argument is $OPTARG
;;
*)
echo "having no argument "
;;
esac
done
}
func -a hello -b world
输出为:
a‘s argument is hello
b‘s argument is world
(5)函数库文件的使用,使得代码可以重用

例如test1.sh:

#! /bin/bash
fun()
{
if [ $1 -gt $2 ]
then
return $1
else
{
return $2
}
fi
}

这个脚本函数是比较两个数的大小,在另一个脚本中调用这个这个函数:

#! /bin/bash
. test.sh #加入库文件
fun 44 22 #直接调用函数
echo $?

一般吧脚本文件放入一个固定的区域,当调用时使用相对路径或者是绝路径才能笑到脚本库。