shell中的变量与变量运算符

一、展开运算符:

1、${var:-default}

  • 描述:
    如果var存在且非null,则返回其值,否则返回default;不会对var进行赋值
  • 用途:
    如果变量未定义,则返回默认值
  • 范例:
    如果count未定义,则${count:-0}的值为0

2、${var:=default}

  • 描述:
    如果var存在且非null,则返回其值,否则设置var为default,并返回
  • 用途:
    如果变量未定义,则设置变量为默认值
  • 范例:
    如果count未定义,则${count:-0}设置count的值为0

3、${var:?message}

  • 描述:
    如果变量存在且非null,则返回其值,否则显示var:message,并退出当前的命令或者脚本;
    如果省略message会出现默认信息:parameter null or not set
  • 用途:
    为了捕捉由于变量未定义所导致的错误
  • 范例:
    如果count未定义,则${count:?’undefined!’}会显示:count: undefined! 并退出

4、${var:+word}

  • 描述:
    如果var存在且非null,则返回word,否则返回null
  • 用途:
    为测试变量的存在与否
  • 范例:
    如果count已经定义,则${count:+1} 返回1(也就是“真”)

二、模式匹配运算符:

假设变量path的值为: /home/leidy/nginx/leidy.cn.log

1、${var#pattern}

  • 用途:
    如果模式匹配与变量的开头处,则删除匹配的最短部分,并返回剩下的内容
  • 范例:
    ${path#/*/}的结果是: leidy/nginx/leidy.cn.log

2、${var##pattern}

  • 用途:
    如果模式匹配与变量的开头处,则删除匹配最长的部分,并返回剩下的部分
  • 范例:
    ${path##/*/}的结果是: leidy.cn.log

3、${var%pattern}

  • 用途:
    如果模式匹配与变量的结尾处,则删除匹配的最短部分,并返回剩下的部分
  • 范例:
    ${path%.*} 的结果是: /home/leidy/nginx/leidy.cn

4、${var%%pattern}

  • 用途:
    如果模式匹配与变量的结尾处,则删除匹配的最长部分,并返回剩下的部分
  • 范例:
    ${path%%.*}的结果是: /home/leidy/nginx/leidy

三、位置参数:

所谓位置参数(positional parameter),指的是shell脚本的命令行参数(argument);同时也表示shell函数内的函数参数。他们的名称以单个数字来命名,但是当这个数字大于9的时候就应该用大括号({})括起来

  • $#
    是传给脚本的参数个数
  • $0
    是脚本本身的名字(包含路径信息)
  • $1
    是传递给该shell脚本的第一个参数
  • $2
    是传递给该shell脚本的第二个参数
  • ${10}
    是传递给该shell脚本的第二个参数
  • $@
    是传给脚本的所有参数的列表
  • $*
    是以一个单字符串显示所有向脚本传递的参数
  • $$
    是脚本运行的当前进程ID号
  • $?
    是显示最后命令的退出状态,0表示没有错误,其他表示有错误
  • $!
    最近一个后台命令的进程ID。以此方式存储进程编号,可通过wait命令以供后续使用

“$@”和”$*”之间的区别:

shell> cat test.sh 
#!/bin/bash

function print_args_at {
    printf "%s\n" "$@"
}

function print_args_star {
    printf "%s\n" "$*"
}

print_args_at "one" "two three" "four"
print_args_star "one" "two three" "four"

shell> sh test.sh 
one
two three
four

one two three four

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Time limit is exhausted. Please reload CAPTCHA.