• shell中的文件、变量、字符串判断表达式及$等特殊字符


    特殊字符

    Shell脚本变量的含义

    1、$#:表示执行脚本或函数传入参数的个数,加上变量${#v}表示变量v的长度
    2、$*:表示执行脚本传入参数的列表(不包括$0)
    3、$$:表示进程的id;Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
    4、$!:Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
    5、$@:表示执行脚本传入参数的所有个数(不包括$0)
    6、$0:表示执行的脚本名称
    7、$1:表示第一个参数
    8、$2:表示第二个参数
    9、$?:表示上条命令或整个脚本执行的状态,0表示正常,其他表示错误
    10、$[expression]:使用 []对表达式expression进行求值,与命令expr不同的是:[ ] 用于插值,则 expr 用于将值进行输出。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    总结:

    • 使用 $# 获取脚本或函数参数的个数
    • 使用 ${#v} 获取变量字符串v的长度
    • 使用 $? 上条命令的返回值。
    • 使用 $(函数名) 执行并获取命令的输出内容,并赋值给变量,等于双引号的功能
    # 单引号 '' 括起来的字符串不会进行插值,并使用 $# 获取脚本或函数参数的个数
    echo 'echo $#' > ping.sh
    sh ping.sh 1 2 3
    # 上面脚本的结果为:3
    # 使用${#}获取变量字符串长度
    
    s=helloworld
    echo "s.length = ${#s}"
    # 输出结果是:s.length = 10
    
    # 使用 $(函数名) 执行并获取命令的输出内容,并赋值给变量
    echo `date`
    2016年 06月 05日 星期日 12:39:08 CST
    echo $(date)
    2016年 06月 05日 星期日 12:39:34 CST
    
    
    echo $[1024 + 2048]
    # 结果为:3072
    expr 1024 + 2048
    # 结果为:3072
    a=1024
    b=2048
    echo $[ a + b ]
    # 结果为:3072
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    $* 和 $@的差异

    变量替换

    假设我们定义了一个变量file=/dir1/dir2/dir3/my.file.txt,使用${ }分别替换,得到不同的变量值:

    file=${file#*/},删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
    file=${file##*/},删掉最后一个 / 及其左边的字符串:my.file.txt
    file=${file#*.},删掉第一个 . 及其左边的字符串:file.txt
    file=${file##*.},删掉最后一个 . 及其左边的字符串:txt
    file=${file%/*},删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
    file=${file%%/*},删掉第一个 / 及其右边的字符串:(空值)
    file=${file%.*},删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
    file=${file%%.*},删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    记忆方法

    # 是去掉左边(键盘上#在 $ 的左边)
    % 是去掉右边(键盘上% 在$ 的右边)
    单一个上面的符号是最小匹配
    两个上面的符号是最大匹配
    
    • 1
    • 2
    • 3
    • 4

    文件表达式

    在shell脚本中,if表达式对文件判断时,文件前面的-d、-e、-f、-L、-r、-x等表示什么意思呢?

    -e filename # e即exist,表示如果filename存在,则为真
    -d filename # d即dictionary,表示如果filename为目录,则为真 
    -f filename # f即file,表示如果filename为常规文件,则为真
    -L filename # L即symbolic links,表示符号链接,如果 filename为符号链接,则为真
    -r filename # r即readable,如果 filename可读,则为真 
    -w filename # w即writable,如果 filename可写,则为真 
    -x filename # x即executable,如果 filename可执行,则为真
    -s filename # 如果文件长度不为0,则为真
    -h filename # 如果文件是软链接,则为真
    filename1 -nt filename2 # newer than,如果 filename1比 filename2新,则为真。 
    filename1 -ot filename2 # older than,如果 filename1比 filename2旧,则为真。 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    变量表达式

    在shell中,数字型变量与字符型变量表达式之间的判断是不同的。使用eq、ne表示数字型变量之间是否相等,而使用=、!=进行字符串变量之间关系的判断。

    整数变量表达式

    -eq # equal,等于
    -ne # not equal,不等于
    -gt # greater,大于
    -ge # greater than or equal,大于等于
    -lt # less than,小于
    -le # less than or equal,小于等于
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    字符串变量表达式

    在shell脚本中,if表达式对字符串判断时,文件前面的-n、-z等又表示什么意思呢?

    字符串判等、判空

    If  [ $a = $b ]            		  # 表示如果字符串string1等于string2,则为真
    if  [ $string1 !=  $string2 ]     # 如果string1不等于string2,则为真       
    if  [ -n $string  ]               # 如果string 非空(非0),则为真
    if  [ -z $string  ]               # 如果string 为空(或0),则为真
    if  [ $sting ]                    # 如果string 非空,返回0 (和-n类似) 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    PS:字符串允许使用赋值号=做等号,而不是==

    逻辑非

    在shell中,逻辑非使用! 表示。

    if [ ! 表达式 ]
    if [ ! -d $num ]    # 如果不存在目录$num
    
    • 1
    • 2

    逻辑与

    在shell中,逻辑与使用-a 表示,a即and。

    if [ 表达式1  -a  表达式2 ]
    
    • 1

    逻辑或

    在shell中,逻辑或使用-o 表示,o即or。

    if [ 表达式1  –o 表达式2 ]
    
    • 1
  • 相关阅读:
    关于使用 uniapp Vue3 开发分享页面 语法糖 setup 开发获取ref踩坑
    SpringCloud-基于SpringAMQP实现消息队列
    数据库分库分表的原则
    在AndroidR user版本的设备上,如何默认打开USB调试,如何去掉USB调试确认弹窗
    又一家芯片新势力杀入车载领域
    Yarn资源调度器
    uniapp 区分uniapp内部扫码还是通过其他方式扫码
    02_SHELL编程之流程控制和循环语句
    游戏专属i9-13900k服务器配置一个月多少钱
    第三次工业革命(六)
  • 原文地址:https://blog.csdn.net/love666666shen/article/details/127996892