总结:解决shell脚本参数传递包含空格问题

linux 专栏收录该内容
1 篇文章 0 订阅

解决这个问题前需要了解三个相关知识:

  1. $*表示“以一个单字符串显示所有向脚本传递的参数”,意思就是传入的参数所有值作为一个值
  2. $#表示传递的参数个数
  3. 参数下标是从下标1开始的。

传递参数存在空格的情况分为三种:第一种是向函数中传递的参数存在空格;第二种是向shell脚本中直接传递的参数(表示传递进来的参数直接被使用,不被间接传递给其他函数)存在空格;第三种是向shell脚本中间接传递的参数存在空格(即传递进来的参数再次传递给其他函数)

1、向函数中传递的参数存在空格

这中方式解决比较容易些,直接使用双引号括起来就可以,康康下列几个例子就可以明白了:

实例一:
#!/bin/bash
test() {
	echo 第一个参数:$1
	echo 第二个参数:$2
	echo 第三个参数:$3
}
test "1 2 3 4 5 6"

输出:
第一个参数:1 2 3 4 5 6
第二个参数:
第三个参数:


实例二:
#!/bin/bash
test() {
	echo 第一个参数:$1
	echo 第二个参数:$2
	echo 第三个参数:$3
}
test "1 2 3" "4 5 6"

输出:
第一个参数:1 2 3
第二个参数:4 5 6
第三个参数:

实例三:
#!/bin/bash
test() {
	echo 第一个参数:$1
	echo 第二个参数:$2
	echo 第三个参数:$3
}
test 1 "2 3 4 5" 6

输出:
第一个参数:1
第二个参数:2 3 4 5
第三个参数:6

2、向shell文件中直接传递的参数存在空格

这种方式的处理和第一种处理的一样,直接加空格就可以。

3、向shell文件种间接传递的参数存在空格

我们看下面的shell文件:

test.sh 
#/!bin/bash
echo "直接第一个参数:${1}"
echo "直接第二个参数:${2}"
echo "直接第三个参数:${3}"

test() {
        echo "间接第一个参数:${1}"
        echo "间接第二个参数:${2}"
        echo "间接第三个参数:${3}"

}
test $*
echo 所有参数:$*

使用命令执行:sh test.sh "1 2" "3 4" "5 6"

输出:

直接第一个参数:1 2
直接第二个参数:3 4
直接第三个参数:5 6
间接第一个参数:1
间接第二个参数:2
间接第三个参数:3
所有参数:1 2 3 4 5 6

可以看出将传入的参数立马传入函数中将丢失引号导致函数中无法正确获取到函数。

使用sh test.sh '"1 2" "3 4" "5 6"' (参数最外面用单引号包含),输出如下:

直接第一个参数:"1 2" "3 4" "5 6"
直接第二个参数:
直接第三个参数:
间接第一个参数:"1
间接第二个参数:2"
间接第三个参数:"3
所有参数:"1 2" "3 4" "5 6"

也无法得到理想的值。

最后我尝试一下方式获取,

#/!bin/bash
echo "直接第一个参数:${1}"
echo "直接第二个参数:${2}"
echo "直接第三个参数:${3}"

test() {
        echo "间接第一个参数:${*:1:2}" #从第1个参数开始获取2个参数
        echo "间接第二个参数:${*:3:2}" #从第3个参数开始获取2个参数
        echo "间接第三个参数:${*:5:2}" #从第5个参数开始获取2个参数

}
test $*
echo 所有参数:$*

执行:sh test.sh "1 2" "3 4" "5 6"
输出:
直接第一个参数:1 2
直接第二个参数:3 4
直接第三个参数:5 6
间接第一个参数:1 2
间接第二个参数:3 4
间接第三个参数:5 6
所有参数:1 2 3 4 5 6

通过${*:起始位置:参数个数}(如果不指定参数个数,获取的参数为开始位置到结束位置)可以实现想要的结果,但存在的问题是必须得明确的知道参数中空格的个数,如果需要执行sh test.sh "1 2" "3 4 5" "6 7",那就只能修改代码了,所以尽量避免间接的传多个值(间接传递单个值代码中使用$*接受即可解决,此处留给读者自行演示)。但可了解存在这种方式,说不定之后遇到一些特殊情况能够用到这种方式解决。

  • 2
    点赞
  • 3
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值