电子说
作为一个嵌入式 Linux 工程师,肯定需要编写 shell 脚本进行一些自动化工作。刚好,我最近就有类似需求——一键交叉编译 DDS。本着“编写漂亮代码的原则”,我用到了 shell 函数 。
基本语法:
[function] function_name [()]
{
do something
[return int;]
}
[function] :虽然这个关键字可以省略不写,我还是建议写上,方便阅读;
function_name :函数名称;
do something :函数体,实现函数的具体功能;
[return int] :函数返回值,return 是关键字,int 为具体数值(0,1,2,…)。这个关键字也可以省略不写,这样函数将以最后一条命令运行的结果作为返回值。
注 :带方括号的关键字可以省略。
#!/bin/sh
test_fun
function test_fun()
{
echo "shell function test!"
}
test_fun
执行结果:
定义函数后,在调用函数时可以向函数传入参数。和编程语言不同的是,shell 中定义函数时 无需声明参数 ,即带参数的函数定义还是原始的格式:
[function] function_name [()]
{
do something
[return int;]
}
向函数传入参数时只需在调用的位置直接输入参数即可,中间用空格隔开 :
function_name arg1 arg2 arg3 ...
在函数内部访问参数时使用 的形式,n 为 1,2,3,4 …
#!/bin/sh
function test_fun()
{
echo "arg1:${1}"
echo "arg2:${2}"
echo "arg3:${3}"
echo "arg4:${4}"
echo "arg num:$#"
echo "\\${0}:${0}"
}
#调用函数
test_fun "apple" "pear" "banana" "orange"
${0} :代表的是脚本的名称,和 C 语言 main 函数中的 argv[0] 意义相同。
$# :存储的是参数的个数。
***** 和 @ 都表示传递给函数的所有参数的集合。没有被双引号包围时,这两个的值相同。如果被双引号包围,那么意义就不同了:
"$*" 表示将所有的参数合并到一起, 成为一个参数 ;
"$@" 表示所有的参数仍然是分离的。
通过 for
循环就能看出区别:
#!/bin/sh
function test_fun()
{
echo "item in \\$*"
for var in "$*"
do
echo "$var"
done
echo "item in \\$@"
for var in "$@"
do
echo "$var"
done
}
你可能会遇到这样的场景——在函数中,你只想 使用后面的几个参数,忽略前面的参数 。
这个时候就可以使用 shift
关键字了。
shift n
将全部参数 向左移动 n 个位置 ,后面的参数移动到前面参数的位置,前面的参数被丢弃。比如 shift 2
指令的最终结果是把原来的 **{3} 移动到 {1} 的位置,{4}移动到 **{2} 的位置 …
#!/bin/sh
function test_fun()
{
echo "\\${1}:${1}"
echo "\\${2}:${2}"
echo "\\${3}:${3}"
echo "\\${4}:${4}"
shift 1
echo "after shift 1:"
echo "\\${1}:${1}"
echo "\\${2}:${2}"
echo "\\${3}:${3}"
}
test_fun "apple" "pear" "banana" "orange"
全部0条评论
快来发表一下你的评论吧 !