Linux—shell中$(( ))、$( )、``与${ }的区别

10人阅读 评论(0) 收藏 举报
分类:

命令替换

在bash中,$( )` `(反引号)都是用来作命令替换的。
命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。

exp 1

[root@localhost ~]# echo today is $(date "+%Y-%m-%d")
today is 2017-11-07
[root@localhost ~]# echo today is `date "+%Y-%m-%d"`
today is 2017-11-07

$( )与``
在操作上,这两者都是达到相应的效果,但是建议使用$( ),理由如下:

``很容易与''搞混乱,尤其对初学者来说,而$( )比较直观。
最后,$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。

exp 2

[root@localhost ~]#  echo Linux `echo Shell `echo today is `date "+%Y-%m-%d"```
Linux Shellecho today is 2017-11-07     #过多使用``会有问题
[root@localhost ~]# echo Linux `echo Shell $(echo today is $(date "+%Y-%m-%d"))`
Linux Shell today is 2017-11-07    ``和$()混合使用
[root@localhost ~]# echo Linux $(echo Shell $(echo today is $(date "+%Y-%m-%d")))
Linux Shell today is 2017-11-07    #多个$()同时使用也不会有问题

${ }变量替换

一般情况下,$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围

exp 1

[root@localhost ~]# A=Linux
[root@localhost ~]# echo $AB    #表示变量AB

[root@localhost ~]# echo ${A}B    #表示变量A后连接着B
LinuxB

取路径、文件名、后缀

复制代码
先赋值一个变量为一个路径,如下:
file=/dir1/dir2/dir3/my.file.txt

命令    解释    结果
${file#*/}    拿掉第一条 / 及其左边的字符串    dir1/dir2/dir3/my.file.txt
[root@localhost ~]# echo ${file#*/}
dir1/dir2/dir3/my.file.txt

${file##*/}    拿掉最后一条 / 及其左边的字符串    my.file.txt
[root@localhost ~]# echo ${file##*/}
my.file.txt

${file#*.}    拿掉第一个 . 及其左边的字符串    file.txt
[root@localhost ~]# echo ${file#*.}
file.txt

${file##*.}    拿掉最后一个 . 及其左边的字符串    txt
[root@localhost ~]# echo ${file##*.}
txt

${file%/*}    拿掉最后一条 / 及其右边的字符串    /dir1/dir2/dir3
[root@localhost ~]# echo ${file%/*}
/dir1/dir2/dir3

${file%%/*}    拿掉第一条 / 及其右边的字符串    (空值)
[root@localhost ~]# echo ${file%%/*}
(空值)

${file%.*}    拿掉最后一个 . 及其右边的字符串    /dir1/dir2/dir3/my.file
[root@localhost ~]# echo ${file%.*}
/dir1/dir2/dir3/my.file

${file%%.*}    拿掉第一个 . 及其右边的字符串    /dir1/dir2/dir3/my
[root@localhost ~]# echo ${file%%.*}
/dir1/dir2/dir3/my
记忆方法如下:

# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配;两个符号是最大匹配
*是用来匹配不要的字符,也就是想要去掉的那部分
还有指定字符分隔号,与*配合,决定取哪部分
复制代码

取子串及替换

命令                                    解释                              结果
${file:0:5}               提取最左边的 5 个字节                /dir1
${file:5:5}               提取第 5 个字节右边的连续 5 个字节         /dir2
${file/dir/path}            将第一个 dir 提换为 path              /path1/dir2/dir3/my.file.txt
${file//dir/path}        将全部 dir 提换为 path               /path1/path2/path3/my.file.txt
${#file}              获取变量长度                     27                            

根据状态为变量赋值

命令解释备注
${file-my.file.txt}若 $file 没设定,则使用 my.file.txt 作传回值空值及非空值不作处理
${file:-my.file.txt}若 $file 没有设定或为空值,则使用 my.file.txt 作传回值非空值时不作处理
${file+my.file.txt}若$file 设为空值或非空值,均使用my.file.txt作传回值没设定时不作处理
${file:+my.file.txt}若 $file 为非空值,则使用 my.file.txt 作传回值没设定及空值不作处理
${file=txt}若 $file 没设定,则回传 txt ,并将 $file 赋值为 txt空值及非空值不作处理
${file:=txt}若 $file 没设定或空值,则回传 txt ,将 $file 赋值为txt非空值时不作处理
${file?my.file.txt}若 $file 没设定,则将 my.file.txt 输出至 STDERR空值及非空值不作处理
${file:?my.file.txt}若 $file没设定或空值,则将my.file.txt输出至STDERR非空值时不作处理

 tips:

以上的理解在于, 你一定要分清楚 unset 与 null 及 non-null 这三种赋值状态. 一般而言, : 与 null 有关, 若不带 : 的话, null 不受影响, 若带 : 则连 null 也受影响.

数组

A="a b c def"   # 定义字符串
A=(a b c def)   # 定义字符数组
命令解释结果
${A[@]}返回数组全部元素a b c def
${A[*]}同上a b c def
${A[0]}返回数组第一个元素a
${#A[@]}返回数组元素总个数4
${#A[*]}同上4
${#A[3]}返回第四个元素的长度,即def的长度3
A[3]=xzy则是将第四个组数重新定义为 xyz 

$(( ))与整数运算

 

bash中整数运算符号

符号功能
+ - * /分别为加、减、乘、除
%余数运算
& | ^ !分别为“AND、OR、XOR、NOT”

 在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用。

复制代码
[root@localhost ~]# echo $((2*3))
6
[root@localhost ~]# a=5;b=7;c=2
[root@localhost ~]# echo $((a+b*c))
19
[root@localhost ~]# echo $(($a+$b*$c))
19
复制代码

进制转换

$(( ))可以将其他进制转成十进制数显示出来。用法如下:
echo $((N#xx))
其中,N为进制,xx为该进制下某个数值,命令执行后可以得到该进制数转成十进制后的值。

[root@localhost ~]# echo $((2#110))
6
[root@localhost ~]# echo $((16#2a))
42
[root@localhost ~]# echo $((8#11))
9

(())重定义变量值

复制代码
[root@localhost ~]# a=5;b=7
[root@localhost ~]# ((a++))
[root@localhost ~]# echo $a
6
[root@localhost ~]# ((a--));echo $a
5
[root@localhost ~]# ((a<b));echo $?
0
[root@localhost ~]# ((a>b));echo $?
1
复制代码

 

转 :shell $(( ))、$( )、``与${ }的区别

出处:https://www.cnblogs.com/chengd/p/7803664.html

查看评论

Linux中shell脚本``和 $()的异同

Linux中shell脚本``和 $()的异同
  • Foreordination_
  • Foreordination_
  • 2017-06-26 17:27:00
  • 445

Linux shell 中$() ` `,${},$[] $(()),[ ] (( )) [[ ]]作用与区别

对shell script常会遇到的$() ` `,${},$[] $(()),[ ] (( )) [[ ]]作了详细的解释。
  • x1269778817
  • x1269778817
  • 2015-06-17 17:03:03
  • 3266

Linux-SHELL中sh和bash的区别

什么是SHELL?shell的中文意思就是贝壳,其实比较类似于我们内核的壳。我们通过hsell和用户通信SHELL简而言之就是只要能够操作应用程序的接口都能够称为SHELL。狭义的shell指的是命令...
  • li563868273
  • li563868273
  • 2016-04-28 20:35:09
  • 15122

linux shell中的点命令------谈谈. ./a.sh和./a.sh的区别

在前面一面文章中, 我们深入分析过source命令的用途, 现在, 我们要来说说linux shell中的点命令。 不卖关子了, 直接说吧, linux shell中的点命令完全等同于source命令...
  • stpeace
  • stpeace
  • 2015-05-09 00:35:50
  • 10764

Linux 中的SHELL 速查

  • 2010年06月05日 13:40
  • 332KB
  • 下载

linux下shell编程print与printf的区别

1,print是ksh的内置命令,而printf是bash的内置命令 2,print 中不能使用%s ,%d 或%c; 3,print 自动换行,printf 没有自动换行。 比如下面脚本的输出: $...
  • shixin_0125
  • shixin_0125
  • 2017-11-30 17:17:15
  • 920

shell中单中括号与双中括号的区别

1.单括号TEST命令要对变量进行单词分离,当变量值包含空白符时,要用引号将变量括起来;而双括号的TEST命令不会对变量进行单词分离。 以下情况分为变量为单个单词,含有空格的词组。 [ro...
  • good_habits
  • good_habits
  • 2014-05-30 20:39:34
  • 3134

linux shell 和linux 命令的区别?windows shell 和 windows 命令呢?

shell翻译成壳的意思,它是包裹在linux内核外层的,一个可通过一系列的linux命令对操作系统发出相关指令的人机界面。 shell可以通过其条件语句和循环语句等,把一系列linux命令结合在一起...
  • Medivh_
  • Medivh_
  • 2016-12-11 14:36:04
  • 814

Linux中$()和${}的区别

这两个今天弄混了,以防以后再次犯错,在这里记录下来 $():这个小括号里放的是命令,和``反引号作用一样,执行这个命令 ${}:这里面放的是变量,用来引用的...
  • s3275492383
  • s3275492383
  • 2017-04-19 15:54:48
  • 2328

bash和shell的区别

Linux 中的 shell 有很多类型,其中最常用的几种是: Bourne shell (sh)、C shell (csh) 和 Korn shell (ksh), 各有优缺点。Bourne she...
  • MonMama
  • MonMama
  • 2016-11-29 11:22:21
  • 6461
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 2828
    排名: 1万+
    文章存档