解决linux shell中传递包含空格的参数问题

 更新时间:2023年09月25日 15:24:41   作者:L_学无止境  
这篇文章主要介绍了如何解决linux shell中传递包含空格的参数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

linux shell中传递包含空格的参数

昨天一同事遇到一个问题,往函数中传递的一个参数是一个sql语句时,函数里只取了这个sql的第一个单词,

他的写法大概类似这样:

test_param()
{
p1=$1
p2=$2
echo "p2:"$p2
}
where_condition=`echo "where a=b;"`
echo "where_condition:"$where_condition
test_param a $where_condition

可以看到函数中只取了该参数的第一个单词。

这是因为函数的参数传递使用的是位置参数,且默认就是空格来间隔各个位置上的参数,所以他这种写法第二个参数的值就成了"where" 。

下面总结一下我想到的解决办法:

一、传递给函数的某个参数含有空格

1.传递的带空格的参数是最后一个参数

这种情况解决办法比较多,下面分别总结下:

方法一:

传递参数时将带上引号,引号内的所有内容都将作为一个参数,如果该参数中没有变量,单引号双引号都可以;有变量的话就用双引号。

test_param()
{
p1=$1
p2=$2
echo "p2:"$p2
}
#第二个参数传递参数时带上引号
where_condition=`echo "where a=b;"`
echo "where_condition:"$where_condition
test_param a "$where_condition"

测试结果:

方法二:

不使用该参数,而是将其对应的变量直接在函数中使用

test_param()
{
p1=$1
p2=$where_condition
echo "p2:"$p2
}
#调用函数时不传递该参数,而是直接在函数中使用变量
where_condition=`echo "where a=b;"`
echo "where_condition:"$where_condition
test_param a 

方法三:

使用$*或者$@传递该参数,会以一个单字符串显示所有传递的参数。

不同之处在于$*会把所有包含的位置参数当成一个整体,而$@会把所有位置参数当成单独的字段(相当于一个列表)。

本例中它们的用法一样。

test_param()
{
p1=$1
#取第二个位置参数到最后的所有内容
p2=`echo ${@:2}`
echo "p2:"$p2
}
where_condition="where a=b;"
echo "where_condition:"$where_condition
test_param a $where_condition
test_param()
{
p1=$1
#取第二个位置参数到最后的所有内容
p2=${*:2}
echo "p2:"$p2
}
where_condition="where a=b;"
echo "where_condition:"$where_condition
test_param a $where_condition

以上代码的测试结果都是一样的,就不一一列出来了。 

2.传递的带空格的参数不是最后一个参数

当该参数不是最后一个参数时,方法一跟方法二无需更改,方法三则需要明确知道该参数中含有几个空格才能正确使用,不然则不适用。

比如,如果是第二个参数,该参数中含有两个空格可以写成:${@:2:3}。

二、传递给shell脚本的参数带有空格

我们来简单模拟一下这种情况。

p1=$1
p2=$2
echo "p2:"$p2

调用时如果直接传也是只能取到该参数的第一个单词。

使用方法一加上引号试试,参数获取正确:

因为是脚本调用,没办法使用第二种方式传递变量。 

试一下第三种方法:

p1=$1
p2=${*:2}
echo "p2:"$p2

虽然没有加引号,仍然可以正常使用。

也就是说,传递给shell脚本的参数带有空格时可以使用方法一和方法三。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用shell脚本一键部署LNMP架构的方法

    使用shell脚本一键部署LNMP架构的方法

    这篇文章主要介绍了使用shell脚本一键部署LNMP架构的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • linux 文件管理命令之dirname \ find \ finds \ in \ indir详解

    linux 文件管理命令之dirname \ find \ finds \ in \ indir详解

    这篇文章主要介绍了linux文件管理命令之dirname\find\finds\in\indir详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 一个简单的linux命令 mkdir

    一个简单的linux命令 mkdir

    这篇文章主要介绍了一个简单的linux命令mkdir,mkdir 命令用于创建指定名称的目录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • linux下命令行操作快捷键及技巧(分享)

    linux下命令行操作快捷键及技巧(分享)

    下面小编就为大家带来一篇linux下命令行操作快捷键及技巧(分享)。小编觉的挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • shell脚本一键安装php7的实例(推荐)

    shell脚本一键安装php7的实例(推荐)

    下面小编就为大家带来一篇shell脚本一键安装php7的实例(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 脚本实现SSH登录邮件报警

    脚本实现SSH登录邮件报警

    自动化运维中,登录保护是一个很重要的环节这篇文章主要介绍如何给自己的服务器添加ssh登录邮件告警,需要的朋友可以参考下
    2015-07-07
  • 学习Linux网络编程基本函数

    学习Linux网络编程基本函数

    这篇文章主要介绍了学习Linux网络编程,网络编程的一些基本函数:也是实现tcp协议通讯的基本步骤,实现代码在最后,IP需要修改为自己的IP,即可通信
    2021-08-08
  • shell脚本编程之循环语句

    shell脚本编程之循环语句

    这篇文章主要介绍了shell脚本编程之循环语句的相关资料,需要的朋友可以参考下
    2016-01-01
  • 关于ssh连不上问题的解决方法(必看)

    关于ssh连不上问题的解决方法(必看)

    下面小编就为大家带来一篇关于ssh连不上问题的解决方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Linux 文件查找打包压缩及解压命令详解

    Linux 文件查找打包压缩及解压命令详解

    这篇文章主要介绍了Linux 文件查找,打包压缩及解压,文件查找和压缩解压是Linux系统中非常常见的操作,掌握了相关命令和技巧,可以提高我们的工作效率和文件管理能力,需要的朋友可以参考下
    2023-11-11

最新评论