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传参的一个结论:看图吧

关于Shell脚本read传参问题_脚本传参

下面再来通过脚本验证一下上面结论:

#!/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分别接收