shell传递参数 单双引号区别
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> <tab> <enter>三者之一组成(我们常用space)。
*CR:由<enter>产生。
IFS是用来拆分command line的每一个词(word)用的,因为shell command line是按词来处理的。而CR则是用来结束command line用的,这也是为何我们敲<enter>命令就会执行的原因。除了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 然后碰到<IFS>,再执行 C 命令
在第二次设定 A 变量时,由于空白键置于 soft quote 中,因此被关闭,不再作为 IFS :
* A=B<space>C
事实上,空白键无论在 soft quote 还是在 hard quote 中,均会被关闭。Enter 鍵亦然:
$ A=‘B
> C
> ‘
$ echo "$A"
B
C
在上例中,由于 <enter> 被置于 hard quote 当中,因此不再作为 CR 字符來处理。
这里的 <enter> 单纯只是一个断行符号(new-line)而已,由于 command line 并沒得到 CR 字符,
因此进入第二個 shell prompt (PS2,以 > 符号表示),command line 并不会结束,
直到第三行,我们输入的 <enter> 并不在 hard quote 里面,因此并沒被关闭,
此时,command line 碰到 CR 字符,于是结束、交给 shell 來处理。
上例的 <enter> 要是被置于 soft quote 中的话, CR 也会同样被关闭:
$ A="B
> C
> "
$ echo $A
B C
然而,由于 echo $A 时的变量沒置于 soft quote 中,<enter> 没有得到CR字符;会被解释为 IFS ,而不是解释为 New Line 字符。
总结:
command line的每一个charactor分两种,分别是 *literal *meta 。其中literal指的是普通纯文字,例如 abcd、123456 等这些“文字”都是literal。
而meta对于shell来说,具有特定功能的保留字,我们经常碰到的meta分为 IFS CR;区别如下
*IFS:由<space> <tab> <enter>三者之一组成(我们常用space)。 作用:IFS是用来拆分command line的每一个词(word)用的
*CR:由<enter>产生。 作用:CR结束command line用的,这也是为何我们敲<enter>命令就会执行的原因。
除了IFS,CR。常用的meta还有:
= : 设定变量。
$ : 做变量或运算替换(请不要与 shell prompt 搞混了)。
> : 重定向 stdout。
< : 重定向 stdin。
|: 管道命令。
& : 重定向 file descriptor ,或将命令置于后台执行。
( ): 將其內的命令置于 nested subshell 执行,或用于运算或命令替换。
{ }: 將其內的命令置于 non-named function 中执行,或用在变量替换的界定范围。
; : 在前一个命令结束时,而忽略其返回值,继续执行下一個命令。
&& : 在前一個命令结束时,若返回值为 true,继续执行下一個命令。
|| : 在前一個命令结束时,若返回值为 false,继续执行下一個命令。
!: 执行 history 列表中的命令
1、单引号、双引号用于用户把带有空格的字符串赋值给变量的分界符。
[ sh]# str="Today is Monday"
[ sh]# echo $str
Today is Monday
如果没有单引号或双引号,shell会把空格后的字符串解释为命令。
[ sh]# str=Today is Monday
bash: is: command not found
2、单引号和双引号的区别。单引号告诉shell忽略所有特殊字符,而双引号忽略大多数,但不包括 $ \ `
双引号中的‘$‘(参数替换)和‘`‘(命令替换)是例外,所以,两者基本上没有什么区别,除非在内容中遇到了参数替换符$和命令替换符`。
如:num=3
echo ‘$num’
$num
echo “$num”
3