shell脚本传参中包含有空格的参数
作者:sodaloveer 发布时间:2022-05-30 21:50:59
问题描述
调用并传参数给其他shell脚本,传的参数带有空格,被调用的shell脚本只取了这个参数的第一个单词。
代码如下
# 传参脚本 test_pre.sh
[wqf@b1i10 test]$ cat test_pre.sh
binFilePath="/apps/test"
logpath="/apps/test"
std_time="2023-01-31 18:00:00"
sh $binFilePath/test.sh $std_time > $logpath/test_$(date +%Y%m%d%H%M).log 2>&1 &
# 调用脚本 test.sh
[wqf@b1i10 test]$ cat test.sh
std_time=$1
echo $std_time
测试结果如下,可以看到只取了该参数的第一个单词
[wqf@b1i10 test]$ cat test_202302061655.log
2023-01-31
原因分析
脚本的参数传递使用的是位置参数,且默认就是空格来间隔各个位置上的参数,所以只取std_time前半个部分“2023-01-31”。
解决方案
方法一:传递参数时将带上引号,引号内的所有内容都将作为一个参数,如果该参数中没有变量,单引号双引号都可以;有变量的话就用双引号。
代码如下
# 传参脚本 test_pre.sh
[wqf@b1i10 test]$ cat test_pre.sh
binFilePath="/apps/test"
logpath="/apps/test"
std_time="2023-01-31 18:00:00"
sh $binFilePath/test.sh "$std_time" > $logpath/test_$(date +%Y%m%d%H%M).log 2>&1 &
# 调用脚本 test.sh
[wqf@b1i10 test]$ cat test.sh
std_time=$1
echo $std_time
测试结果
[wqf@b1i10 test]$ cat test_202302061716.log
2023-01-31 18:00:00
方法二:使用 $* 或者 $@ 传递该参数,会以一个单字符串显示所有传递的参数。不同之外在于 $* 会把所有包含的位置参数当成一个整体,而 $@ 会把所有位置参数当成单独的字段(相当于一个列表)。 本例中它们的用法一样。
代码如下
# 传参脚本 test_pre.sh
[wqf@b1i10 test]$ cat test_pre.sh
binFilePath="/apps/test"
logpath="/apps/test"
std_time="2023-01-31 18:00:00"
sh $binFilePath/test.sh $std_time > $logpath/test_$(date +%Y%m%d%H%M).log 2>&1 &
# 调用脚本 test.sh
[wqf@b1i10 test]$ cat test.sh
#取第一个参数到的所有内容(直到最后)
std_time=${@:1}
echo $std_time
# 调用脚本 test.sh
[wqf@b1i10 test]$ cat test.sh
#取第一个参数到的所有内容(直到最后)
std_time=${*:1}
echo $std_time
以上代码测试结果都是一样的,不一一展示。
注意:假设要传的参数中含有多个空格,需要标明含有几个空格才能正确使用。比如,如果是第二个参数,该参数中含有两个空格可以写成:${@:2:3}
拓展
传递给函数的某个参数含有空格
传递给函数的某个参数含有空格,除了以上两种方法之外,还可以有方法三:直接将对应的变量在函数中使用,脚本调用,没办法使用这种方式传递变量。
假设函数脚本的代码如下
[wqf@b1i10 ~]$cat test_1.sh
test_param(){
std_time=$1
echo "std_time:" $std_time
}
std_time="2023-01-31 18:00:00"
echo "std_time:" $std_time
test_param $std_time
测试结果
[wqf@b1i10 ~]$ sh test_1.sh
std_time: 2023-01-31 18:00:00
std_time: 2023-01-31
使用方法三的代码如下:
[wqf@b1i10 ~]$cat test_1.sh
test_param(){
std_time=$std_time
echo "std_time:" $std_time
}
std_time="2023-01-31 18:00:00"
echo "std_time:" $std_time
test_param
使用方法三的测试结果:
[wqf@b1i10 ~]$ sh test_1.sh
std_time: 2023-01-31 18:00:00
std_time: 2023-01-31 18:00:00
使用方法一的代码如下:
[wqf@b1i10 ~]$cat test_1.sh
test_param(){
std_time=$1
echo "std_time:" $std_time
}
std_time="2023-01-31 18:00:00"
echo "std_time:" $std_time
test_param "$std_time"
使用方法二的代码如下:
[wqf@b1i10 ~]$cat test_1.sh
test_param(){
std_time=${@:1}
echo "std_time:" $std_time
}
std_time="2023-01-31 18:00:00"
echo "std_time:" $std_time
test_param "$std_time"
[wqf@b1i10 ~]$cat test_1.sh
test_param(){
std_time=${*:1}
echo "std_time:" $std_time
}
std_time="2023-01-31 18:00:00"
echo "std_time:" $std_time
test_param "$std_time"
以上测试结果都是一致,不一一展示。
来源:https://blog.csdn.net/sodaloveer/article/details/128904265
猜你喜欢
- 继阿里巴巴集团与深圳签署协议、在深圳建国际总部和南方总部后,互联网最大的中文搜索引擎——百度也有意在
- 在搜索引擎优化相关的文章中中经常遇到“SPAM”一词,SPAM通常用来指垃圾邮件,不过在搜索引擎营销中所说的SPAM是专门针对那些欺骗搜索引
- 本文介绍了如何通过使用Windows Server 2003来配置网络地址转换(NAT)服务器。Windows Server 2003“路由
- 核心提示: 本文将论述一些SEO优化的致命错误做法。尽管其中很多是老生长谈的话题了,但是作为SEO关键要素,非常有必要重复强调。1、用FLA
- 做SEO的人都知道链接在SEO中的重要性,我原来也写过关于正确使用链接认识链接的一些文章,但现在仍然还是存在者各式各样的垃圾链接形式。今天这
- 北京时间10月10日消息,据国外媒体报道,谷歌实验产品Google Squared在功能上有所改进,可处理的数据量增长了四倍,还可以支持数据
- 最近发现DEDE调用广告占用CPU过高,所以还是改为了JS调用,不得不舍弃到期自动下架的功能了。(JS也能实现过期自动更换广告功能,期待高手
- 昨天特意去机房安装64位系统,带了一个250G新硬盘去。为了减少断网的时间,首先把硬盘分好区,把许多数据也拷到一个分区里。我用的是windo
- 2001年3月14日,董勤锋在电脑公司的PC机上搭建了落伍者论坛,不久许多站长涌入,把这里当成栖息的家园。董勤锋在落伍者论坛上的ID是:拒绝
- 本文来自于2018年09月19日在 Adobe Systems Inc 举行的Apache Spark Meetup。即将发布的 Apach
- 据国外媒体报道,微软董事会主席比尔·盖茨(Bill Gates)周二表示,互联网技术将在今后十年发生巨大变革。盖茨是在受韩国总统李明博接见时
- 通过VMware Tools实现物理机与虚拟机之间的文件共享。然而CentOS 7在安装(或更新)VMware Tools可能会遇到一些问题
- 网站程序上传到服务器的各种方法汇总,制作好网页程序后,如何把网页上传到申请的空间呢?为初学者做一个汇总。上传的定义 上传就是将信息从个人计算
- 康盛创想(Comsenz)推出的Manyou开放平台(官方体验地址:http://uchome.developer.manyou.com)与
- 我们可能因为一些特殊需求网站服务器使用 Windows Server 系统来跑,没有采用Linux环境。而Webp格式的图像越来越多的网站采
- 本篇文章介绍了在Linux下用 mkdir 命令来创建目录和子目录的用法,现在我们要学习在 Linux 系统下创建目录。在 Linux 下,
- 今天给Godaddy主机用户介绍下.htaccess。.htaccess文档让你可以自定义你的站点或者站点上的某个具体的目录的行为。例如,如
- 在springboot项目启动有三种方式:1、运行主方法程序2、使用命令mvn spring-boot:run 在命令行运行3、使用 mvn
- 站长最关心什么,IP和金钱,也许还有更多。至少我最看重这两样,因为我是个做垃圾站的站长,我没有时间去思索和考虑网站对用户的体验度,也没有时间
- 基于RHEL8/CentOS8的nmcli常见命令使用# 查看ip(类似于ifconfig、ip addr)nmcli# 创建connect