shell命令中 单引号和双引号的区别
在没有碰到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