shell传递参数 单双引号区别 您所在的位置:网站首页 shell脚本单引号 shell传递参数 单双引号区别

shell传递参数 单双引号区别

2023-09-19 05:10| 来源: 网络整理| 查看: 265

shell传递参数

$0 对应的是当前 Shell 脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,而$1、$2、$3……则分别对应着第 N 个位置的参数值,如图 所示。

 

 

举例子说明:

 

 在上面例子中,echo内容在" "(双引号)中,如果 '  '(单引号)中。看下运行结果

 

 其中,被赋值的变量按照脚本内容一模一样打印出来了。对比单引号和双引号可参考博文:linux shell中的单引号与双引号的区别(看完就不会有引号的疑问了)

 

在 shell prompt敲打键盘、直到按下enter的时候,输入的字符就是command line(命令行)了,然后shell才会以进程方式执行你所提交的命令。在command line输入的每一个文字,对shell来说,有什么类别之分呢?command line的每一个charactor(字符)分为两种:1.*literal(字面意义)    2.*meta(元)

① *literal:也就是普通纯文字,对shell来说没有特殊功能。② *meta:对shell来说,具有特定功能的保留字。

凡是 abcd、123456 等这些“文字”都是literal。几乎每次都会碰到的meta组成如下:*IFS:由 三者之一组成(我们常用space)。*CR:由产生。

IFS是用来拆分command line的每一个词(word)用的,因为shell command line是按词来处理的。而CR则是用来结束command line用的,这也是为何我们敲命令就会执行的原因。除了IFS和CR外,常用的meta还有:

= :  设定变量。$ :  做变量或运算替换(请不要与 shell prompt 搞混了)。> :  重定向 stdout。< :  重定向 stdin。|:   管道命令。& :  重定向 file descriptor ,或将命令置于后台执行。( ): 將其內的命令置于 nested subshell 执行,或用于运算或命令替换。{ }: 將其內的命令置于 non-named function 中执行,或用在变量替换的界定范围。; :  在前一个命令结束时,而忽略其返回值,继续执行下一個命令。&& : 在前一個命令结束时,若返回值为 true,继续执行下一個命令。|| : 在前一個命令结束时,若返回值为 false,继续执行下一個命令。!:   执行 history 列表中的命令

 

假如我们要在command line中将这些保留元字符的功能关闭的话,就要用到 quoting 处理了。

在bash中,我们常用的 quoting有如下三种方法:*hard quote:' '(单引号):凡在hard quote中的所有meta均被关闭。*soft quote:" "(双引号):在soft quote中的大部分meta都会被关闭,但某些保留(如$)。*escape:\ (反斜线):只有紧接在escape(跳脱字符)之后的单一meta才被关闭。

 

下面的例子將有助于我们对 quoting 的了解:

        $ A=B C        # 空白键未被关闭,作为IFS 处理。        $ C: command not found.         $ echo $A                $ A="B C"        # 空白键已被关闭,仅作空白符号处理。        $ echo $A        B C

在第一次设定 A 变量时,由于空白键没有被关闭,command line 将被解读为:* A=B 然后碰到,再执行 C 命令在第二次设定 A 变量时,由于空白键置于 soft quote 中,因此被关闭,不再作为 IFS :* A=BC事实上,空白键无论在 soft quote 还是在 hard quote 中,均会被关闭。Enter 鍵亦然:        $ A='B        > C        > '        $ echo "$A"        B        C

在上例中,由于 被置于 hard quote 当中,因此不再作为 CR 字符來处理。这里的 单纯只是一个断行符号(new-line)而已,由于 command line 并沒得到 CR 字符,因此进入第二個 shell prompt (PS2,以 > 符号表示),command line 并不会结束,直到第三行,我们输入的 并不在  hard quote 里面,因此并沒被关闭,此时,command line 碰到 CR 字符,于是结束、交给 shell 來处理。

上例的 要是被置于 soft quote 中的话, CR 也会同样被关闭:        $ A="B        > C        > "        $ echo $A        B C

然而,由于 echo $A 时的变量沒置于 soft quote 中, 没有得到CR字符;会被解释为 IFS ,而不是解释为 New Line 字符。

 

总结:

command line的每一个charactor分两种,分别是 *literal  *meta 。其中literal指的是普通纯文字,例如 abcd、123456 等这些“文字”都是literal。

而meta对于shell来说,具有特定功能的保留字,我们经常碰到的meta分为 IFS CR;区别如下

*IFS:由 三者之一组成(我们常用space)。  作用:IFS是用来拆分command line的每一个词(word)用的*CR:由产生。  作用:CR结束command line用的,这也是为何我们敲命令就会执行的原因。

除了IFS,CR。常用的meta还有:

= :  设定变量。$ :  做变量或运算替换(请不要与 shell prompt 搞混了)。> :  重定向 stdout。< :  重定向 stdin。|:   管道命令。& :  重定向 file descriptor ,或将命令置于后台执行。( ): 將其內的命令置于 nested subshell 执行,或用于运算或命令替换。{ }: 將其內的命令置于 non-named function 中执行,或用在变量替换的界定范围。; :  在前一个命令结束时,而忽略其返回值,继续执行下一個命令。&& : 在前一個命令结束时,若返回值为 true,继续执行下一個命令。|| : 在前一個命令结束时,若返回值为 false,继续执行下一個命令。!:   执行 history 列表中的命令

 

 

1、单引号、双引号用于用户把带有空格的字符串赋值给变量的分界符。

  [root@localhost sh]# str="Today is Monday"  [root@localhost sh]# echo $str  Today is Monday  如果没有单引号或双引号,shell会把空格后的字符串解释为命令。  [root@localhost sh]# str=Today is Monday  bash: is: command not found

 

2、单引号和双引号的区别。单引号告诉shell忽略所有特殊字符,而双引号忽略大多数,但不包括   $     \     `

双引号中的'$'(参数替换)和'`'(命令替换)是例外,所以,两者基本上没有什么区别,除非在内容中遇到了参数替换符$和命令替换符`。

如:num=3

echo ‘$num’   

 $num

echo “$num”3



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有