shell脚本传参中包含有空格的参数

 更新时间:2023年03月22日 16:39:02   作者:sodaloveer  
本文主要介绍了shell脚本传参中包含有空格的参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

问题描述

调用并传参数给其他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"

以上测试结果都是一致,不一一展示。

到此这篇关于shell脚本传参中包含有空格的参数的文章就介绍到这了,更多相关shell传递带空格的参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux常用命令之pip命令示例详解

    linux常用命令之pip命令示例详解

    本文介绍了 pip 命令的基本语法、常用选项和参数,以及一些常见的使用示例,通过学习和掌握 pip 命令,你可以方便地管理和使用 Python 包,提高开发效率,感兴趣的朋友跟随小编一起看看吧
    2023-12-12
  • Shell最多支持多少个参数?

    Shell最多支持多少个参数?

    这篇文章主要介绍了Shell最多支持多少个参数?本文是对Shell最多可以输入多少个参数的一篇测试文章,需要的朋友可以参考下
    2014-10-10
  • 一个可交互的并发ping检测脚本

    一个可交互的并发ping检测脚本

    可交互的并发ping检测脚本,供大家学习参考。重点& 跟wait,这样“并发”的结果是输出结果不是能按顺序,后台返回。如果需要再排序下
    2013-02-02
  • linux shell实现获取用户输入指定范围的单个字符的两种方法

    linux shell实现获取用户输入指定范围的单个字符的两种方法

    用shell实现的,要求获取用户输一个字符a-zA-Z实现方法如下,需要的朋友可以参考下
    2013-03-03
  • Shell中获取脚本所在目录绝对路径的方法

    Shell中获取脚本所在目录绝对路径的方法

    这篇文章主要介绍了Shell中获取脚本所在目录绝对路径的方法,本文直接给出实现代码,需要的朋友可以参考下
    2015-01-01
  • C语言实现的ls命令源码分享

    C语言实现的ls命令源码分享

    这篇文章主要介绍了C语言实现的ls命令源码分享,本文是学习apue的练手之作,需要的朋友可以参考下
    2014-09-09
  • Shell脚本实现分析apache日志中ip所在的地区

    Shell脚本实现分析apache日志中ip所在的地区

    这篇文章主要介绍了Shell脚本实现分析apache日志中ip所在的地区,本文使用了一款nali工具实现,需要的朋友可以参考下
    2014-12-12
  • Shell alias给命令设置别名的实现方法

    Shell alias给命令设置别名的实现方法

    这篇文章主要介绍了Shell alias给命令设置别名的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 自动生成linux网卡配置脚本分享

    自动生成linux网卡配置脚本分享

    这篇文章主要介绍了自动生成linux网卡配置的脚本,因为Linux虚拟机在复制时候网卡信息会更新,所以导致需要重新配置网卡。本脚本功能,第一次添加网卡后,启动虚拟机,然后运行脚本(可以写在启动脚步中),然后根据ifconfig -a 的信息来创建ifcfg-ethX的配置文件或者修改对应的ifcfg-ethX的mac
    2014-03-03
  • Linux命令每天必学之 useradd/adduser 新增用户

    Linux命令每天必学之 useradd/adduser 新增用户

    Linux下useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户。接下来通过本文给大家介绍每天必学Linux命令之 useradd/adduser 新增用户的相关知识,需要的朋友参考下吧
    2018-10-10

最新评论