shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Posted Sanmao_li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]相关的知识,希望对你有一定的参考价值。

1.$(command) 等价于 `command`

echo $(command) 执行过程:

shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令 echo $(ls)中的 $(ls)位置,即替换了$(ls),再执行echo命令。这里要注意的是$(cmd)中的命令的错误输出是不会被替换的,替换的只是标准输出

[root@192 shell_scripts]# echo $(pwd)
/home/liqing/shell_scripts
[root@192 shell_scripts]# echo $(pwd1)
bash: pwd1: 未找到命令...
相似命令是: pwd

2.$var 是变量替换;$ 用于变量替换。一般情况下,$var 与$var 并没有啥不一样。但是用 $ 会比较精确的界定变量名称的范围.

[root@192 shell_scripts]# uname=lisan
[root@192 shell_scripts]# echo $uname
lisan
#$ 会比较精确的界定变量名称的范围.
[root@192 shell_scripts]# echo $uname_a
lisan_a
[root@192 shell_scripts]# echo $uname_a

[root@192 shell_scripts]#

$ 的一些特异功能:从指定字符(子字符串)开始截取

file=/tmp/study/scripts/my.file.sh

格式

结果

说明

$string: start :length

$file:0:5

/tmp

从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。

$string: start

$file:5

/study/scripts/my.file.sh

从 string 字符串的左边第 start 个字符开始截取,直到最后。

$string: 0-start :length

$file:0-8:5

file.

从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。

$string: 0-start

$file:0-8

file.sh

从 string 字符串的右边第 start 个字符开始截取,直到最后。

$string#*chars

$file#*/

tmp/study/scripts/my.file.sh

从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。

$string##*chars

$file##*/

my.file.sh

从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。

$string%*chars

$file%*.

/tmp/study/scripts/my

从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。

$string%%*chars

$file%%*.

/tmp/study/scripts/my.file

从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。




3.$!var是引用间接变量;如下:

[root@192 shell_scripts]# var1="var2"
[root@192 shell_scripts]# var2="This is a dog"
[root@192 shell_scripts]# echo $var1
var2
[root@192 shell_scripts]# echo $var2
This is a dog
[root@192 shell_scripts]# echo $!var1
This is a dog
[root@192 shell_scripts]#

4.$#var 可计算出变量的长度:

[root@192 shell_scripts]# var2="This is a dog"
[root@192 shell_scripts]# echo $#var2
13

5.$[]与\\$(())用途一致:用来作整数运算。在 bash 中,$(( ))的整数运算符号大致有这些: \\ + - * / % & | ^ ! AND、OR、XOR、NOT运算

注意:这种扩展计算是整数型的计算,不支持浮点型和字符串等。

[root@192 shell_scripts]# echo $((3+2))
5
[root@192 shell_scripts]# echo $((3.0+2))
bash: 3.0+2: 语法错误: 无效的算术运算符 (错误符号是 ".0+2")
[root@192 shell_scripts]# echo $[3/2]
1
[root@192 shell_scripts]# echo $[3/2.0]
bash: 3/2.0: 语法错误: 无效的算术运算符 (错误符号是 ".0")

若是逻辑判断,表达式为真则为1,假则为0

[root@192 shell_scripts]# echo $((1>2))
0
[root@192 shell_scripts]# echo $((1<2))
1
[root@192 shell_scripts]# echo $[3>2]
1
[root@192 shell_scripts]# echo $[3>20]
0

三目运算以及重定义变量值

[root@192 shell_scripts]# a=1
[root@192 shell_scripts]# echo $[a++]
2
[root@192 shell_scripts]# echo $((a++))
3
[root@192 shell_scripts]#

6.[] (( ))及[[ ]]:即为test命令的另一种形式。
但要注意许多:

  • 你必须在左括号的右侧和右括号的左侧各加一个空格,否则会报错。
  • test命令使用标准的数学比较符号来表示字符串的比较,而用文本符号来表示数值的比较。很多人会记反了。使用反了,shell可能得不到正确的结果
  • 大于符号或小于符号必须要转义,否则会被理解成重定向。

(( ))及[[ ]] :

它们分别是[ ]的针对数学比较表达式和字符串表达式的加强版

其中(( )),不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了以下符号:

算术运算符                        说明/含义

+、-                    加法(或正号)、减法(或负号)

*、/、%         乘法、除法、取余(取模)

**                     幂运算

++、--         自增和自减,可以放在变量的前面也可以放在变量的后面

!、&&、||       逻辑非(取反)、逻辑与(and)、逻辑或(or)

<、<=、>、>=     比较符号(小于、小于等于、大于、大于等于)

==、!=、=       比较符号(相等、不相等;对于字符串,= 也可以表示相当于)

<<、>>              向左移位、向右移位

~、|、 &、^      按位取反、按位或、按位与、按位异或

=、+=、-=、*=、/=、%= 赋值运算符,例如 a+=1 相当于 a=a+1,a-=1 相当于 a=a-1

7.区别()和:

  • 相同点:

()和都是把一串的命令放在括号里面,如果命令在一行,则命令之间用;隔开

  • 不同点:

()只是把一串命令重新开一个子shell进行执行,不影响当前shell环境;对一串命令在当前shell执行,影响当前shell环境

()最后一个命令不用分号,最后一个命令要用分号

()里的第一个命令和左边括号不必有空格,的第一个命令和左括号之间必要要有一个空格

()和中括号里面的某个命令的重定向只影响改名了,但括号外的重定向则影响到括号里的所有命令

#不影响当前shell环境
[root@192 shell_scripts]# (pwd;cd /tmp;pwd)
/home/liqing/shell_scripts
/tmp
[root@192 shell_scripts]#
#()最后一个命令不用分号 ()最后一个命令不用分号 ()里的第一个命令和左边括号不必有空格
[root@192 shell_scripts]# (pwd;cd /home/liqing/shell_scripts;pwd)
/home/liqing/shell_scripts
/home/liqing/shell_scripts
[root@192 shell_scripts]#

[root@192 shell_scripts]# pwd;cd /tmp;pwd;
/home/liqing/shell_scripts
/tmp
[root@192 tmp]#

[root@192 tmp]# (pwd;cd /home/liqing/shell_scripts;pwd)
/tmp
/home/liqing/shell_scripts
#的第一个命令和左括号之间必要要有一个空格
[root@192 tmp]# pwd;cd /home/liqing/shell_scripts;pwd
bash: pwd: 未找到命令...
相似命令是: pwd
bash: pwd: 未找到命令...
相似命令是: pwd
#对一串命令在当前shell执行,影响当前shell环境
[root@192 shell_scripts]#
#最后一个命令要用分号
[root@192 shell_scripts]# pwd;cd /home/liqing/shell_scripts;pwd
>
> ^C
[root@192 shell_scripts]# pwd;cd /home/liqing/shell_scripts;pwd;
/home/liqing/shell_scripts
/home/liqing/shell_scripts
[root@192 shell_scripts]#

8.== 可用于判断变量是否相等,= 除了可用于判断变量是否相等外,还可以表示赋值。= 与 == 在 [ ] 中表示判断(字符串比较)时是等价的;在 (( )) 中 = 表示赋值, == 表示判断(整数比较),它们不等价


以上是关于shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本中的$*,$@和$#分别是啥意思?

shell,shell脚本结构和执行方法,data命令,shell脚本中的变量

六十七shell脚本介绍shell脚本结构和执行date命令用法shell脚本中的变量

shell脚本介绍 shell脚本结构和执行 date命令用法 shell脚本中的变量

shell脚本介绍,shell脚本结构和执行,date命令用法,shell脚本中的变量

shell脚本中如何输出标准错误和标准输出