脚本涉及
* 注释
* 传入参数
* 函数
* 执行
* 调试
1、注释
#以后的语句,shell不会解析。
多行注释可以考虑采用:<<
2、传参
$0 表示执行的程序,是相对于执行目录的路径;
$1,$2,$3分别表示第几个参数。
bash最多只支持传入9个参数,如果超过了9个,想要传入的话就需要在传入参数的索引外加上花括号{}
3、函数
[function] name() {
..
}
Function 可以省略。除了可以在脚本文件中使用函数外, 还可以shell中定义。这些定义会在本次shell结束后消失。
如果没有return,返回值是最后一句指令的返回值。
3、执行方式
chmod u+x xxx.sh; ./xxx.sh
bash xxx.sh (这种方式会开启一个sub shell)
source xxx.sh (在当前shell中执行 . Xxx.sh 同义)
例1演示:
# test1.sh脚本中的内容如下
echo "获取脚本执行的参数: $0"
echo "获取第一个参数:$1"
echo "获取第二个参数:$2"
echo "获取参数的个数:$#"
echo "获取到的参数(str):$*"
echo "获取到的参数(每一个参数都是一个str):$@"
echo "获取当前进程的ID号(PID):$$"
[16210504@izuf60jasqavbxb9efockpz test]$ ./test1.sh 1 2 3 4 5
获取脚本执行的参数: ./test1.sh
获取第一个参数:1
获取第二个参数:2
获取参数的个数:5
获取到的参数(str):1 2 3 4 5
获取到的参数(每一个参数都是一个str):1 2 3 4 5
获取当前进程的ID号(PID):22183
可以看到传入的参数被分别读取,其中$*
和$@
都获取到了全部的参数,实际上是不同的:
$*获取到的是一个str整体:"1 2 3 4 5"
$@获取到的是单个的str: "1" "2" "3" "4" "5"
例2演示
bash最多只支持传入9个参数,如果超过了9个,想要传入的话就需要在传入参数的索引外加上花括号{}
#脚本内容如下
functest(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10}"
echo "第十一个参数为 ${11} !"
echo "参数的总个数有 $# 个!"
}
functest a b c d e f g h i j k l m
执行脚本
[16210504@izuf60jasqavbxb9efockpz test]$ ./test2.sh
第一个参数为 a !
第二个参数为 b !
第十个参数为 a0 !
第十个参数为 j
第十一个参数为 k !
参数的总个数有 13 个!
由结果可以看到,同样是取第十个参数,第一个取到的是a0
,第二个取到的才是正确的参数j,
这是因为超过9个参数后,脚本认为$10
其实是$1
再加上0
;而$1
代表第一个参数a
,所以就输出了a0
;
例3演示
先说需求:任意输入内容,将输入内容打印出来,一直循环操作;若输入quit
就退出
#脚本内容如下
while true
do read -p "please enter you number: " input
if [ $input == "quit" ]
then
echo "您已选择了退出"
break
else
echo "您输入的内容是:"$input
fi
done
执行脚本:
[16210504@izuf60jasqavbxb9efockpz Allen_qin]$ ./InputTest.sh
please enter you number: 1
您输入的内容是:1
please enter you number: 2
您输入的内容是:2
please enter you number: 3
您输入的内容是:3
please enter you number: 4
您输入的内容是:4
please enter you number: ggg
您输入的内容是:ggg
please enter you number: quit
您已选择了退出
例4演示
需求说明:任意输入两个数字,输出数字的和、差、乘、商
#脚本内容如下
read -p "enter1:" num1
read -p "enter2:" num2
echo "和"=$((num1+num2))
echo "差"=$((num1-num2))
echo "积"=$((num1*num2))
echo "商"=$((num1/num2))
执行结果:
[16210504@izuf60jasqavbxb9efockpz Allen_qin]$ ./test4.sh
enter1:1
enter2:2
和=3
差=-1
积=2
商=0
- 由上面的结果看到一个现象,除法的结果是0,应该是0.5才对,这是因为在bash中默认取整;我们想要得到类似浮点型的结果,需要借助于awk的方法来实现:
awk ”BEGIN{}"
可以运行自定义命令,但是想要调用外部定义的变量,需要使用\"$var\"
形式
运行结果:#修改后的脚本 read -p "enter1:" num1 read -p "enter2:" num2 echo "和"=$((num1+num2)) echo "差"=$((num1-num2)) echo "积"=$((num1*num2)) echo "除"=`awk "BEGIN{print \"$num1\"/\"$num2\"}"`
[16210504@izuf60jasqavbxb9efockpz test]$ ./test4.sh enter1:1 enter2:2 和=3 差=-1 积=2 除=0.5