zoukankan      html  css  js  c++  java
  • 【shell 中$() ` `,${},${!},${#},$[] $(()),[ ] (( )) [[ ]]】

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

    #错误输出并不会替换;所以该变量为空
    [root@bogon t]# var=$(cat 3.txt)   
    cat: 3.txt: 没有那个文件或目录
    [root@bogon t]# echo $var
     
    $var显然是空的
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.${var} 是变量替换:当你要显示变量值加一些随意的字符。可以在脚本中修改文件名:mv /1/$file /1/${file}.bak;

    [root@manager day5]# name=lisi
    [root@manager day5]# echo $name
    lisi
    [root@manager day5]# echo $name_aa
    
    [root@manager day5]# echo ${name}_aa
    lisi_aa
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    ${ }的一些特异功能
    定义一个变量:
    file=/dir1/dir2/dir3/my.file.txt
    可以用${ }分别替换获得不同的值:
    ${file#*/} 拿掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
    ${file##*/} 拿掉最后一个 / 及其左边的字符串:my.file.txt
    ${file#*.} 拿掉第一个 . 及其左边的字符串:file.txt
    ${file##*.} 拿掉最后一个 . 及其左边的字符串:txt
    ${file%/*} 拿掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
    ${file%%/*} 拿掉第一个 / 及其右边的字符串:(空值)
    ${file%.*} 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
    ${加粗样式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
    3.${#var} 可计算出变量的长度:

    [root@manager day5]# a=cxndicd
    [root@manager day5]# echo ${#a}
    7
    
    • 1
    • 2
    • 3

    4.${!var}是引用间接变量;如下:

    v1="v2"
    v2="hello"
    echo ${!v1}
    
    • 1
    • 2
    • 3

    5.$[]与$(())用途一致:用来作整数运算。在 bash 中,$(( ))的整数运算符号大致有这些: + - * / % & | ^ ! AND、OR、XOR、NOT运算
    注意:这种扩展计算是整数型的计算,不支持浮点型和字符串等。

    [root@manager day5]# echo $((3+2))
    5
    [root@manager day5]# echo $((3.0+2))
    -bash: 3.0+2: 语法错误: 无效的算术运算符 (错误符号是 ".0+2")
    [root@manager day5]# echo $[3/2]
    1
    [root@manager day5]# echo $[3.0/2]
    -bash: 3.0/2: 语法错误: 无效的算术运算符 (错误符号是 ".0/2")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    [root@manager day5]# echo $((1>2))
    0
    [root@manager day5]# echo $((1<2))
    1
    [root@manager day5]# echo $[3>2]
    1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    [root@manager day5]# echo $[3>2?a:b]
    3
    [root@manager day5]# echo $a
    3
    
    [root@manager day5]# a=1
    [root@manager day5]# echo $[a=1+2]
    3
    [root@manager day5]# echo $a
    3
    
    [root@manager day5]# a=1
    [root@manager day5]# echo $[a++]
    1
    [root@manager day5]# echo $a
    2
    [root@manager day5]# echo $[a++]
    2
    [root@manager day5]# echo $a
    3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    6.区别()和{}:
    相同点:()和{}都是把一串的命令放在括号里面,如果命令在一行,则命令之间用;隔开
    不同点:
    ()只是把一串命令重新开一个子shell进行执行,不影响当前shell环境;{}对一串命令在当前shell执行,影响当前shell环境
    ()最后一个命令不用分号,{}最后一个命令要用分号
    ()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必要要有一个空格
    ()和{}中括号里面的某个命令的重定向只影响改名了,但括号外的重定向则影响到括号里的所有命令

    #()在子shell中执行,不影响当前shell环境
    [root@www day4]# (pwd;cd /tmp;pwd) 
    /scripts/day4
    /tmp
    [root@www day4]# 
    #{}在当前shell执行,影响当前shell环境,并且命令左边有空格,命令最后有分号
    [root@www day4]# { pwd;cd /tmp;pwd;} 
    /scripts/day4
    /tmp
    [root@www tmp]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    [root@manager day5]# s1="foo"
    [root@manager day5]# s2="foo"
    [root@manager day5]# [ $s1=$2 ] && echo "equal"
    equal
    [root@manager day5]# [ $s1==$2 ] && echo "equal"
    equal
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在 (( )) 中 = 表示赋值, == 表示判断(整数比较),它们不等价

    [root@manager day5]# ((n=5))
    [root@manager day5]# echo $n
    5
    [root@manager day5]# ((n==5)) && echo "equal"
    equal



    https://blog.csdn.net/qq_40003309/article/details/106907677
  • 相关阅读:
    java通过UUID生成16位唯一订单号
    spring framework体系结构及内部各模块jar之间的maven依赖关系
    Java操作PDF之iText超入门
    对象拷贝
    Alluxio 1.5集群搭建
    InfluxDb中写入重复数据问题解决方案
    苹果笔记本中为虚拟机扩充硬盘的方法
    Grafana中整个Dashboard报错问题解决
    使用WebEx录制视频并转换为MP4
    Spark配置参数优先级
  • 原文地址:https://www.cnblogs.com/breakingbrad/p/13853471.html
Copyright © 2011-2022 走看看