​ 在没有碰到shell命令单引号和双引号之前,我一直以为shell里面''""是和JS里面一样没什么区别的;今天在做android重签名工具的时候,测试在修改应用名称带空格的情况下一直签名失败,如:测试 空格

问题1:shell命令传入带空格的参数

因为shell命名对参数的解析是通过空格的方式解析的

如:1    2   测试 ,那么对应的参数获取就是:$1=1; $2=2; $3=测试;

如果你参数带了空格

如:1    2   测试 空格,那么对应的参数获取就是:$1=1; $2=2; $3=测试;
其中‘空格’是对应参数 '$4'

解决方法

我们可以采用读取全末尾参数方式

APP_NAME=`echo ${@:3}`
表示读取第3个参数直到最后字符

问题2: sed -i 替换带空格的问题

rp=`echo ${@:1}`
file=$PWD/txt
sed -i '.bak' 's/**/'$rp'/g' $file

测试空格输入,报错了,当时花了很多时间去google这个问题,当时搜索的思路是 “sed -i 替换文字 参数带空格”,但没什么收获。

sh shell.sh 测试 空格
error >>> sed: 1: "s/**/测试": unterminated substitute in regular expression

后面换了个思路,尝试更改单引号为双引号。

echo '$rp'
===> '$rp' 如果是单引号,则不会执行取值,直接输出''内所有内容
echo "$rp"
===> 测试 空格 如果是双引号,输出值内容

但是!我发现,如果用2个单引号包裹和一个双引号是一样的效果,没找到什么区别。

echo ''$rp''
===> 测试 空格

解决问题

修改shell如下,成功修改

#!/bin/bash
rp=`echo ${@:1}`
file=$PWD/txt
sed -i '.bak' "s/**/$rp/g" $file
#sed -i '.bak' 's/**/'$rp'/g' $file #为什么这样不行,讲道理 2个单引号和一个双引号效果一样,关于这个疑问,还没有解决

可以查看Demo