参数扩展  Parameter Expansion

本文简单介绍linux命令行中的参数扩展的部分内容。在实际生物信息学分析中,参数扩展是十分实用的小技巧。可以用来快速处理大量的重命名文件,获取文件路径,获取文件类型,替换文件文件夹的路径等等

参数扩展可以用于对字符串的操作,主要用途包括以下:

  1. 字符串大小写替换
  2. 字符串替换
  3. 字符串删减
  4. 字符串切片
  5. 字符串长度

Case modification 大小写转换

  • ${PARAMETER^} : 第一个字母大写
  • ${PARAMETER^^} : 全部大写
  • ${PARAMETER,} : 第一个字母小写
  • ${PARAMETER,,} : 全部小写
  • ${PARAMETER~} :第一个字母大小写反转
  • ${PARAMETER~~} :全部大小写反转
# 转换大写
$ X="abc"
$ echo ${X^}
Abc
$ echo ${X^^}
ABC

# 转换小写
$ Y="ABC"
$ echo ${Y,}
aBC
$ echo ${Y,,}
abc

# 翻转大小写
$ echo ${X~}
Abc
$ echo ${X~~}
ABC
$ echo ${Y~~}
abc
$ echo ${Y~}
aBC

Substring replace 字符串替换

  • ${PARAMETER/PATTERN/STRING} : 将第一个PATTERN 替换为STRING
  • ${PARAMETER//PATTERN/STRING} : 将所有PATTERN 替换为STRING
  • ${PARAMETER/PATTERN} :删除第一个PATTERN (将第一个PATTERN 替换为nullstring)
  • ${PARAMETER//PATTERN} :删除将所有PATTERN
  • # 从字符串开头开始匹配
  • % 从字符串末尾开始匹配

MYSTRING="xxxxxxxxxx"
echo ${MYSTRING/x/y}
yxxxxxxxxx

echo ${MYSTRING//x/y}
yyyyyyyyyy

echo ${MYSTRING/#x/y} 
yxxxxxxxxx
echo ${MYSTRING/%x/y} 
xxxxxxxxxy

echo ${MYSTRING//x/}
# is equivalent to
echo ${MYSTRING//x}

# change suffix for a file 
MYSTRING="abc.txt"
echo ${MYSTRING/txt/md}
abc.md

# change prefix for a file 
echo ${MYSTRING/abc/edf}
edf.txt

Substring removal  字符串删减

  • ${PARAMETER#PATTERN} :删除第一个PATTERN
  • ${PARAMETER##PATTERN} :删除所有PATTERN
  • ${PARAMETER%PATTERN} :删除第一个PATTERN (从末尾开始)
  • ${PARAMETER%%PATTERN} :删除所有PATTERN (从末尾开始)
$ MYSTRING="This is a simple sentence with some simple words."
$ echo ${MYSTRING#*simple}
sentence with some simple words.

$ echo ${MYSTRING##*simple}
words.

$ echo ${MYSTRING%simple*}
This is a simple sentence with some

$ echo ${MYSTRING%%simple*}
This is a

$ Get name without extension
MYFILEPATH="/home/work/example.txt"
$ echo ${MYFILEPATH%.*}
/home/work/example

# Get extension
$ echo ${MYFILEPATH##*.}
txt

# Get directory name
echo ${MYFILEPATH%/*}
/home/work

# Get filename
$ echo ${MYFILEPATH##*/}
example.txt

String slicing 字符串切片

  • ${PARAMETER:OFFSET} : OFFSET指从起始位置的偏倚
  • ${PARAMETER:OFFSET:LENGTH} : OFFSET指从起始位置的偏倚,可以为空,LENGTH 则指偏移后截取的长度,负数则指截取到到末位前的长度。
a=myfile.txt.gz

echo $a
myfile.txt.gz

echo ${a::-3}
myfile.txt

echo ${a:2}
file.txt.gz

echo ${a:2:-3}
file.txt

String length 字符串长度

${#PARAMETER} : 获取变量所指字符串的长度

$ MYSTRING="abcd"
$ echo ${#MYSTRING} 
4

Indirection 间接指向

  • ${!PARAMETER} `间接指向变量所指字符串所表示点变量
$ A=1
$ B="A"
$ echo $B
A
$ echo ${!B}
1

参考

https://wiki.bash-hackers.org/syntax/pe

https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 注销 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 注销 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 注销 /  更改 )

Connecting to %s