· 位置参数和特殊变量
. shift命令
. 函数
. 函数返回值
. 函数执行成功与否判断
. 命令行参数遍历
. shell脚本的调试方法
# 位置参数和特殊变量
# $0:相当于C语言main函数中的argv[0]还有$1,$2...
# 这些称为位置参数,相当于C语言中的argv[1],argv[2]...
# $#:相当于C语言中main函数中的argc-1
# $@:表示参数列表$1,$2...,可以用在for循环中的in后面
# $?:上一条命令的退出码
# $$:当前shell的进程号
echo "\$0 -> $0"
echo "\$1 -> $1"
echo "\$2 -> $2"
echo "\$3 -> $3"
echo "\$# -> $#"
echo "\$@ -> $@"
echo "\$? -> $?"
# shift位置参数可以用shift命令左移
# 比如shift 3表示原来的$4现在变成$1
# 原来的$5变成$2等,原来的$1,$2,$3丢弃,$0不移动
# 不带参数的shift命令相当于shift 1
shift 2
echo "\$0 -> $0"
echo "\$1 -> $1"
echo "\$2 -> $2"
echo "\$3 -> $3"
echo "\$# -> $#"
echo "\$@ -> $@"
echo "\$? -> $?"
# 如何遍历命令行参数
# 方法1
for i in $@
do
echo $i
done
# 方法2
while [ $# -ne 0 ]
do
echo $1
shift 1
done
# 函数,函数定义中没有返回值也没有参数列表
function myfun()
{
echo "hello world"
}
myfun #调用函数
# shell中的函数必须先定义才能调用
# 函数传参,传参时将shell函数当成迷你脚本
# shell函数没有参数列表并不表示不能传参数
# 事实上函数就像是迷你脚本,调用函数时可以传任一个参数
# 在函数内同样是用$1,$2等变量来提取参数
function myfun()
{
echo $0
echo $1
echo $2
echo $#
echo $@
echo "hello world"
}
myfun arg1 arg2
# $0并不会作为函数参数进行传参任务
# 函数中的位置参数相当于函数的局部变量
# 改变这些变量并不会影响函数外面的$1,$2等变量
# 函数返回值
# 函数调用或者返回时,将shell函数当成命令
# 只要是命令,那么函数调用成功与否,可以通过$?判定
# 一般函数中可以用return命令返回,如果return后面
# 跟一个数字则表示函数的退出码
function myfun()
{
echo "exec some code"
return 123
}
myfun
echo $?
# 如何判断函数执行是否正确?
# 方式1
function myfun()
{
echo "exec some code"
return 123
}
myfun
if [ $? -eq 123 ];then
echo "exec success"
else
echo "exec false"
fi
# if条件认为0为真,非0为假
# if条件判断是根据命令的退出码判断的
# 方式2
function myfun()
{
echo "hello world"
return 0
}
if myfun;then
echo "exec success"
else
echo "exec false"
fi
# 方式3
# echo方式,不关心函数的退出码而关心他的数据
function myfun()
{
echo "success"
}
ret=$(myfun)
if [ "X$ret" == "Xsuccess" ];then
echo "exec success"
fi
# shell脚本的调试方法:通过调试选项进行
# -n:读一遍脚本中的命令但不执行
# -v:一边执行脚本一边将执行过的脚本命令打印到标准错误输出
# -x:提供跟踪执行信息,将执行的每一条命令和结果依次打印出
# 使用这些选项的三种方法
# 方法1:命令行使用
echo "haha1"
echo "haha2"
echo "haha3"
myint=90
if [$myint -lt 100];then # 错误语句
echo "yes"
fi
# 方法2:在脚本开头提供参数 #! /bin/sh -x
! /bin/sh -x
echo "haha1"
echo "haha2"
echo "haha3"
myint=90
if [$myint -lt 100];then # 错误语句
echo "yes"
fi
# 方法3:在脚本中用set命令启用或禁用参数
# set -x和set +x 分别表示开启和禁用-x参数,
# 这样就可以只对脚本中的某一段进行跟踪调试
echo "haha1"
echo "haha2"
set +x
echo "haha3"
echo "haha4"
echo "haha5"
set -x
echo "haha6"
echo "haha7"