设为首页 收藏本站
查看: 872|回复: 0

shell 编程中空格的使用,双引号,单引号,反引号

[复制链接]

尚未签到

发表于 2015-10-25 14:34:35 | 显示全部楼层 |阅读模式
http://blog.iyunv.com/panda19881/article/details/6626727

1.定义变量时, =号的两边不可以留空格.
eg:
gender=femal————right
gender =femal———–wrong
gender= femal———–wrong
2.条件测试语句 [ 符号的两边都要留空格.
eg:
if [ $gender = femal ]; then——-right.
echo “you are femal”;
fi

if[ $gender...-----------------------wrong
if [$gender...----------------------wrong.

3.条件测试的内容,如果是字符串比较的话, 比较符号两边要留空格!
eg:
if [ $gender = femal ]; then——-right.
if [ $gender= femal ]; then——–wrong.
if [ $gender=femal ]; then———wrong.

4.如果if 和 then写在同一行, 那么,注意, then的前面要跟上 ; 号.如果 then 换行写, 那么也没问题.
eg:
if [ $gender = femal ]; then——-right.
if [ $gender = femal ]
then——————————-right.
if [ $gender = femal ] then——-wrong. then前面少了 ; 号.
提示出错信息:
syntax error near unexpected token then
同理,还有很多出错信息 比如
syntax error near unexpected token fi 等都是这样引起的.

5.if 后面一定要跟上 then. 同理
elif 后面一定要跟上 then.
不然提示出错信息:
syntax error near unexpected token else

1)if 语句后面需要跟着then,同时前面要有分号;
2) 空格非常重要,shell 会认为空格前的为一个命令,如果a=3 认为是赋值操作,如果写成a = 3,那么就会认为a为一个命令 this=`ls -l |grep ‘^-’ | wc -l `
3) 操作符之间要用空格分开 ,如 test ! -d $1,其中的!和-d就要用空格分开
空格是命令解析中的重要分隔符

6. 命令和其后的参数或对象之间一定要有空格
if [ -x"~/Workspace/shell/a.sh" ];then

只有 -x 后有空格才表示紧跟其后的字符串是否指向一个可执行的文件名,否则就成了测试 -x"~/Workspace/shell/a.sh" 这个字符串是不是空。
7.取变量值的符号'$'和后边的变量或括号不能有空格

http://blog.sina.com.cn/s/blog_5f5716580100l9k1.html

hard quote:单引号,关闭所有的meta(什么是meta,自己查吧)
soft quote:双引号,关闭大部分的meta,但是某些保留,例如$
这里也提一下escape:反斜杠,它只会关闭紧跟escape之后的字符。

参考cu上经典的十三问,hard quote关闭shell的meta,而soft quote关闭大部分的shell meta,但是$例外,对于bash的来说,命令的解释是从左到右的,首先遇到hard quote和soft quote,所作的解释是不一样,看这个例子:
$ a=1
$ echo "$a"
1          #$被bash解释到
$ echo "'$a'"
'1'          #hardquote被关闭
$ echo '$a'
$a          #$被hardquote关闭
$ echo '"$a"'
"$a"       #所有都被关闭了

如果能够理解上面的了,那基本知道怎么用单引号和双引号了。

而对于awk、ed等等命令,需要区分shell meta和command meta
对于awk来说,它的{ }:是将其内的命令置于non-named function 中执行,awk用{ }来区分命令段,例如BEGIN,END等等。举个例子:
$ awk {print $1} b.txt
awk: line 2: missing } near end of file

看看报错,如果直接使用{ },那么我们知道{ }没有被shell关闭,也就是说它看成shell的meta了,当然报错了,所以要关闭,同时shell中的$也关闭,也就是$需要成为awk的meta了,很好理解吧?如下输出了内容。
awk '{print $1}' b.txt
./0/137/qq/.zhangqx
./0/10/qq/.zyyao
./0/115/qq/.ywt

既然要要关闭{ },那么也可以用soft quote,
awk "{print $0}" b.txt
0
0
0
可以看到,soft quote预期的关闭了{ },但是$还是被shell解释了,这次我们可以用escape,将$关闭了。
$ awk "{print \$0}" b.txt
./0/137/qq/.zhangqx
./0/10/qq/.zyyao
./0/115/qq/.ywt

说到这里,可以大家都一点明白了,并不是awk '{ }' urfile是awk的固定语法,而是为了让awk能够跳脱shell的偷取其命令和参数,看看这个例子就明白了。
$ awk \{print\ \$0\} b.txt
./0/137/qq/.zhangqx
./0/10/qq/.zyyao

所作的一切是为了让awk或者自己的meta,请切记注意print后的空格,也要关闭,要不又被shell解释了。

2. 双引号 ( " " )
双引号作用与单引号类似,区别在于它没有那么严格。单引号告诉shell忽略所有特殊字符,而双引号只要求忽略大多数,具体说,括在双引号中的三种特殊字符不被忽略:$,\,` ,即双引号会解释字符串的特别意思,而单引号直接使用字符串.

3、. 反斜杠 backslash-escaped( \ )
反斜杠一般用作转义字符,或称逃脱字符,linux如果echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号
echo -e "\n"
反斜杠的另一种作用,就是当反斜杠用于一行的最后一个字符时,shell把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。

BTW
4、$()和``的区别
反引号和$()的功能是命令替换,将反引号或$()中的字符串做为命令来执行,我们在用shell编程时经常用的到 将系统命令的执行结果赋给一个变量
但反引号内不能再引用反引号,而$()中可以引用反引号
  


1. 除了赋值操作=左右两边不能有空格,其他都要有空格
2. 如果在一行写多句,每一句就要用;分隔
3. 字符串变量也可以自动变成整数 a='123'; echo `expr $a + 1`


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-130669-1-1.html 上篇帖子: linux中shell变量$#,$@,$0,$1,$2的含义解释: 下篇帖子: Linux--Shell 编程-bash,命令替换,if分支嵌套,运算,输入输出
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表