Shell 小技巧
${}
的使用
截断变量
-
去掉左边
使用
#
(最短匹配)或##
(最长匹配)方法为${var#<模式>}
var=DUMMY
echo ${var#*M} # MY
echo ${var##*M} # Y -
去掉右边
使用
%
(最短匹配)或%%
(最长匹配)方法为${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剪切) |