linux shell中‘‘,““和``的区别

简介: 在使用shell脚本编程中,经常会遇到单引号、双引号、以及反单引号,这三者有何区别?

在使用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在本地扩展

目录
相关文章
|
14天前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
1天前
|
Shell Linux
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
|
1天前
|
Shell Linux
linux shell脚本字符串 字段分隔符 存入数组 根据下标取值
linux shell脚本字符串 字段分隔符 存入数组 根据下标取值
|
1天前
|
Shell Linux
linux shell 脚本中变量截取
linux shell 脚本中变量截取
|
1天前
|
机器学习/深度学习 Shell Linux
linux shell脚本判断文件或文件夹是否存在循环操作
linux shell脚本判断文件或文件夹是否存在循环操作
|
1天前
|
Shell Linux
shell循环读文件 Linux脚本读文件
shell循环读文件 Linux脚本读文件
|
2天前
|
存储 Shell Linux
【Linux】编写一个简易的shell
【Linux】编写一个简易的shell
【Linux】编写一个简易的shell
|
1天前
|
编解码 Ubuntu Linux
linux 系统命令总结之ubuntu 系列命令 持续更新中
linux 系统命令总结之ubuntu 系列命令 持续更新中
|
1天前
|
Linux
linux centos history 查看命令历史 显示时间戳
linux centos history 查看命令历史 显示时间戳
|
2天前
|
Java Linux 应用服务中间件
【JavaEE进阶】 Linux常用命令
【JavaEE进阶】 Linux常用命令