Shell脚本传参有两种方式:
方式1:sh file.sh arg1 arg 2....
方式2:read -p "提示" arg 1 arg2
默认参数直接是以空格进行区分的,下面通过几个实例讲解一下传参遇到的问题及困惑
方式一:通过脚本实例展示
[root@data-1-2 ~]# cat arg1.sh #!/bin/bash funChag() { echo $1 $2 } main() { echo $1 $2 funChag $1 $2 } main $*
测试:
[root@data-1-2 ~]# sh arg1.sh 1 2 5 8 1 2 1 2 [root@data-1-2 ~]# sh arg1.sh 1 1 1
脚本传参,无论怎样穿,都是按照顺序传参进去,按照空格分隔参数
方式二:read传参
测试脚本代码
[root@data-1-2 ~]# cat arg.sh #!/bin/bash read -p "please input two int :" Num1 Num2 funChag() { echo $1 $2 } main() { # echo $Num1 $Num2 funChag $Num1 $Num2 } main $*
测试1:read传参是传递一个参数
[root@data-1-2 ~]# sh arg.sh please input two int :6 6 6
传入一个参数,$Num2默认接收到的是空;
测试2:read传入多个参数(>=3)
[root@data-1-2 ~]# sh arg.sh please input two int :6 66 666 6 66 666 #<==$Num1=6 $Num2=="66 666" 6 66 #<==$1=6 $2=66
上面传入两个参数,$Num1和Num2给变量$1和$2,为什么$2等于66,而非“66 666”呢?
下面修改一下脚本,如下:
[root@data-1-2 ~]# cat arg.sh #!/bin/bash read -p "please input two int :" Num1 Num2 funChag() { echo $1 $2 $3 #<==增加$3变量输出 } main() { echo $Num1 $Num2 funChag $Num1 $Num2 } main $*
执行脚本结果如下:
[root@data-1-2 ~]# sh arg.sh please input two int :6 66 666 6 66 666 #<==Num1=6 Num2="66 666" 6 66 666 #<=$1=6 $2=66 $3=666
由此,我们得出Shell传参的一个结论:看图吧
下面再来通过脚本验证一下上面结论:
#!/bin/bash Num1=6 Num2="66 666" main() { echo "脚本定义的参数:num1=$Num1 num2=$Num2" echo "函数本身接收到的参数:s1=$1 s2=$2" echo "接收参数:s1=$1 s2=$2 s3=$3" } main $Num1 $Num2
执行结果:
[root@data-1-2 ~]# sh arg.sh 脚本定义的参数:num1=6 num2=66 666 函数本身接收到的参数:s1=6 s2=66 接收参数:s1=6 s2=66 s3=666
由此:我们得到如下结论:
当赋值给函数的变量带有空格分隔时,比如“66 666”,函数在接收的时候,会当做两个参数进行接收,66和666分别接收