关于Shell脚本read传参问题

Shell脚本传参有两种方式:

方式1:sh  file.sh  arg1 arg 2....

方式2:read -p "提示"  arg 1 arg2

默认参数直接是以空格进行区分的,下面通过几个实例讲解一下传参遇到的问题及困惑

方式一:通过脚本实例展示

[[email protected] ~]# cat arg1.sh 
#!/bin/bash
funChag() {
  echo $1 $2
}

main() {
  echo $1 $2
  funChag $1 $2
}
main $*

测试:

[[email protected] ~]# sh arg1.sh 1 2 5 8
1 2
1 2
[[email protected] ~]# sh arg1.sh 1
1
1

脚本传参,无论怎样穿,都是按照顺序传参进去,按照空格分隔参数

方式二:read传参

测试脚本代码

[[email protected] ~]# 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传参是传递一个参数

[[email protected] ~]# sh arg.sh
please input two int :6 
6
6

传入一个参数,$Num2默认接收到的是空;

测试2:read传入多个参数(>=3)

[[email protected] ~]# 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”呢?

下面修改一下脚本,如下:

[[email protected] ~]# 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 $*

执行脚本结果如下:

[[email protected] ~]# 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

执行结果:

[[email protected] ~]# sh arg.sh 
脚本定义的参数:num1=6 num2=66 666
函数本身接收到的参数:s1=6 s2=66
接收参数:s1=6  s2=66 s3=666

由此:我们得到如下结论:

当赋值给函数的变量带有空格分隔时,比如“66 666”,函数在接收的时候,会当做两个参数进行接收,66和666分别接收

原文地址:http://blog.51cto.com/12034076/2094263

时间: 2024-11-09 01:30:46

关于Shell脚本read传参问题的相关文章

【MYSQL】在脚本中使用变量-执行脚本时传参

在shell脚本里可以定义变量,并在执行脚本时任意传参. #!/bin/bashdb_name=$1 #将第一个值赋给db_name变量sql_name=$2 #将第二个值赋给sql_name变量mysql -uroot -p123456 -h192.168.227.129 $db_name < $sql_name 在执行shell脚本时,在执行命令后面直接传参即可 ./sqlrecovery jinqy jinqy.sql

UI测试后生成测试报告,利用shell脚本上传svn

ui测试后生成测试报告,把报告保存在某一个固定路径 shell脚本把这个报告上传 #!/bin/bash -ile #svn下载文件 #svn checkout http://svn.xxx.com/svn/xxxx/trunk/UI/report --username xxx --password dsdfsdf; svn checkout http://svn.xxx.com.cn/svn/xxxx/trunk/UI/report cd report pwd #是否存在report 文件,如

jemter编写Mysql脚本___传参

jmeter的Mysql脚本中穿入参数,需要用到一个配置元件  jemter传参方式有两种: 一.sql语句中直接用${变量名} 1.在用户定义变量这个配置元件中定义号变量 2.JDBC请求的sql语句中引用 运行,即可成功运行脚本 二.sql语句中用?占位符引用 1.同上在用户定义变量这个配置元件中定义号变量 2.Query Type:Prepared Update Statement,   支持占位符的Query Type 还有Callable Satement,Prepared Selec

shell脚本的入参

shell脚本参数可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制.参数从第一个开始,在第九个结束.$0 程序名字$n 第n个参数值,n=1..9 $* 所有命令行参数[email protected]        所有命令行参数,如果它被包含在引号里,形如”[email protected]”,则每个参数也各自被引号包括$# 命令行参数个数 $$ 当前进程的进程ID(PID)$!  最近后台进程的进程ID $?  最近使用命令的退出状态 $$即脚本进程的ID,$?类似于

curl方式执行脚本时传参问题

参考: https://stackoverflow.com/questions/4642915/passing-parameters-to-bash-when-executing-a-script-fetched-by-curl/4642975 通常执行发布机上的脚本时习惯使用以下方式: curl http://example.com/script.sh | bash 若涉及到传入参数时,则可使用 1. curl http://example.com/script.sh | bash -s ar

shell命令行传参个数大于9个的参数写法

$10  $11  $12等都会被解析为 $1 方法是 ${10}   ${11}  用一对花括号把参数引起来

python--脚本传参与shell脚本传参(位置参数)

写一个最简单的shell脚本,了解shell脚本是如何传参 1. vim test1.sh name=$1 age=$2 echo ${name} echo ${age} 2.调用脚本并传参 sh test1.sh zhangsan 14 11.  vim test1.py test1.py import sys try: if sys.argv[1]: print(sys.argv[1]) except Exception as e: print('当前无参数') 22.调用脚本并传参 原文地

(九)shell中case语句、程序传参、while

2.2.6.1.case语句(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异(2)shell中的case语句天生没有break,也不需要break,和C语言中的switch case不同.shell中的case默认就是匹配上哪个执行哪个,不会说执行完了还去执行后面的其他case(就好像shell中的case语言默认都带了break). 2.2.6.2.调用shell程序的传参(1)C语言中可以通过main函数的argc和argv给程序传参(详情参考<4.

Linux Shell 通过传参的方式往/etc/user.conf里添加用户

实现通过传参的方式往/etc/user.conf里添加用户,具体要求如下:1)命令用法:USAGE: sh adduser {-add|-del|-search} username 2)传参要求:如果参数为-add时,表示添加后面接的用户名,如果参数为-del时,表示删除后面接的用户名,如果参数为-search时,表示查找后面接的用户名,3)如果有同名的用户则不能添加,没有对应用户则无需删除,查找到用户以及没有用户时给出明确提示.4)/etc/user.conf不能被所有外部用户直接删除及修改