0
点赞
收藏
分享

微信扫一扫

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


举报

相关推荐

0 条评论