Shell 小技巧

Shell 小技巧

${} 的使用

截断变量

  1. 去掉左边

    使用 # (最短匹配)或 ## (最长匹配)方法为 ${var#<模式>}

     var=DUMMY
     echo ${var#*M}   # MY
     echo ${var##*M}  # Y
    
  2. 去掉右边

    使用 % (最短匹配)或 %% (最长匹配)方法为 ${var%<模式>}

     var=DUMMY
     echo ${var%M*}   # DUM
     echo ${var%%M*}  # DU
    

字符串提取

索引从0开始,使用 :<索引> 定位开始和数量,不包含数量时把剩下的全部提取,方法为 ${var:<开始>[:<数量>]}

var=DUMMY
echo ${var:2}   # MMY
echo ${var:2:2} # MM

字符串替换

使用 / (第一个)或 // (所有),方法为 ${var/<模式>/<模式>}

var=DUMMY
echo ${var/M/R}     # DURMY
echo ${var//M/R}    # DURRY

变量默认值

变量的值有3种情形,不存在、存在时空值、存在时非空值,针对其情形使用不同操作返回不同默认值。

符号 含义
`-` 不存在时返回默认值
`:-` 不存在或空值时返回默认值
`+` 存在时返回默认值
`:+` 非空值时返回默认值
`?` 不存在时返回默认值,输出到 `stderr`
`:?` 不存在或空值时返回默认值,输出到 `stderr`
`=` 不存在时返回默认值,并设置变量为默认值
`:=` 不存在或空值时返回默认值,并设置变量为默认值
unset var
echo ${var-"DUMMY"} # DUMMY
set | grep 'var=' || echo Not found # 不存在

var=
echo ${var:-"DUMMY"}    # DUMMY
echo ${var}             #

var=
echo ${var+"DUMMY"}     # DUMMY
echo ${var}             # 

var=FOO
echo ${var:+"DUMMY"}    # DUMMY
echo ${var}             # FOO

var=
echo ${var?"DUMMY"}     #

var=FOO
echo ${var:?"DUMMY"}    # FOO

unset var
echo ${var="DUMMY"} # DUMMY
echo ${var}         # DUMMY

var=
echo ${var:="DUMMY"}    # DUMMY
echo ${var}             # DUMMY

set的使用

set 用于设置 shell 的选项和参数,常用的包括

set -e 出错时马上退出

set -x 跟踪脚本的执行命令

set -- <参数> 把参数作为位置参数

#!/bin/sh
set -e
ARGS=$(getopt -o h -l help -- "$@")
eval set -- "$ARGS"
echo $ARGS

参数处理

使用 getopt 处理脚本的参数, -o 为短参数,-l为长参数,如果参数有值,那么这个参数要加上:,如

set -e
ARGS=$(getopt -o ht:v -l help,tag:,version -- "$@")
eval set -- "$ARGS"

然后,一般使用 while 循环和 case 进行参数的判断

while :; do
    case "$1" in
        (-h|--help)     usage
                        exit 0
                        ;;
        (-v|--version)  echo "0.0.1"
                        exit 0
                        ;;
        (-t|--tag)      shift
                        TAG=$1
                        ;;
        (--)            break
                        ;;
    esac
    shift
done

[处理剩下的位置参数]

vi 使用

yy 或 Y 复制当前行
nyy 或 nY 复制当前开始n行
p 粘贴到光标后
P 粘贴到光标前
dd 或 D 剪切当前行
ndd 或 nD 剪切当前开始n行
v+移动光标 选择(然后通过y复制或d剪切)
posted @ 2015-05-09 16:35  drop *  阅读(461)  评论(0编辑  收藏  举报