在使用shell脚本编程中,经常会遇到单引号、双引号、以及反单引号,这三者有何区别?
一、双引号
shell会对前缀为$的变量进行自动扩展
双引号的一般出现在含有空格的变量中,请看下例
$ echo $my_variable $ my_variable=Hello $ $ echo $my_variable Hello
非常简单!现在每次引用my_variable 环境变量的值,只要通过$my_variable引用即可。
如果要给变量赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。
$ my_variable=Hello World -bash: World: command not found $ $ my_variable="Hello World" $ $ echo $my_variable Hello World $
没有双引号的话, bash shell会以为下一个词是另一个要执行的命令。注意,你定义的局部环
境变量用的是小写字母,而到目前为止你所看到的***系统环境变量都是大写字母。***
这里使用单引号同样可行
]#t='hellp world' ]#echo $t hellp world
echo命令可用单引号或双引号来划定文本字符串
]#echo this is a test this is a test ]#echo Let's see if this'll work Lets see if thisll work
如何解决?
如果在字符串中用到了它们,你需要在
文本中使用其中一种引号,而用另外一种来将字符串划定起来
]#echo "Let's see if this'll work" Let's see if this'll work ]#echo 'Let's see if this'll work' Lets see if thisll work
再来看一个例子
$ cat test1 #!/bin/bash #This script displays the date and who's logged on echo The time and date are: date echo "Let's see who's logged into the system:" who $
如果想把文本字符串和命令输出显示在同一行中,可以用echo语句
的-n参数。
脱义
比如在bash中这样定义str=this is String,这样就会报错,为了避免出错就得使用 单引号’‘和双引号""。
单引号’’,双引号""的区别
- 单引号’‘剥夺了所有字符的特殊含义,单引号’'内就变成了单纯的字符。
- 双引号"“则对于双引号”"内的参数替换($)和命令替换(``)是个例外。
二、反单引号
反引号是命令替换,命令替换是指Shell可以先执行中的命令,将输出结果暂时保存,在适当的地方输出
反单引号的作用是可以从命令输出中提取信息,并将其赋给变量。把输出赋
给变量之后,就可以随意在脚本中使用了。这个特性在处理脚本数据时尤为方便。
有两种方法可以将命令输出赋给变量:
反引号字符( `)
$()格式
提示:在美式键盘上,它通常和波浪线( ~)位于同一键位
通过命令替换获得当前日期并用它来生成唯一文件名
#!/bin/bash # copy the /usr/bin directory listing to a log file today=$(date +%y%m%d) ls /usr/bin -al > log.$today
命令替换会创建一个***子shell来运行对应的命令***。子shell( subshell)是由运行该脚本的shell
所创建出来的一个独立的子shell( child shell)。正因如此,===由该子shell所执行命令是无法使用脚本中所创建的变量的。***===这点要特别注意
在命令行提示符下***使用路径./运行命令的话,也会创建出子shell;要是运行命令的时候
不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。
在命令行提示符下运行脚本时一定要留心!
三、单引号
用单引号引起来的所有内容都解释为字符串文字
在ssh远程执行命令的时候经常会遇到这个问题:
在远程主机上定义一个变量,在ssh 登录上去时想使用这个变量。该如何做?
看下面这个例子
[(TEST AP)root@test /tmp]#A=3 [(TEST AP)root@test /tmp]# [(TEST AP)root@test /tmp]#echo $A 3 [(TEST AP)root@test /tmp]# [(TEST AP)root@test /tmp]# [(TEST AP)root@test /tmp]# [(TEST AP)root@test /tmp]#echo $A 3 [(TEST AP)root@test /tmp]#ssh 192.168.10.204 'B=3; echo "A=$A"; echo "B=$B";' A= B=3 [(TEST AP)root@test /tmp]# [(TEST AP)root@test /tmp]#ssh 192.168.10.204 "B=3; echo "A=$A"; echo "B=$B";" A=3 B=
如何把A和B 同时打印出来呢?
[(TEST AP)root@test /tmp]#ssh 192.168.10.204 "B=3; echo "A=$A"; echo "B=\$B";" A=3 B=3
$意思是按$字面意义解释字符,因此我们按字面意义发送echo $B作为远程执行指令之一,而不是先让bash $B在本地扩展