1 Star 9 Fork 6

bingios / pure-bash-bible-zh_CN

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
删除字符串前后空格.md 4.73 KB
一键复制 编辑 原始数据 按行查看 历史
阿笨猫 提交于 2019-08-24 22:07 . first commit

删除字符串前后空格

# sh
trim_string() {
	# Usage: trim_string "   example   string    "
	: "${1#"${1%%[![:space:]]*}"}"
	: "${_%"${_##*[![:space:]]}"}"
	printf '%s\n' "$_"
}

语法说明:

使用范例: trim_string "   aaa bbb  "

: "${1#"${1%%[![:space:]]*}"}"

  • 此处的1代表输入的第一个参数,即"   aaa bbb  "

  • 在Bash里边是一个占位符;

  • [:space:] 匹配一个包括换行符,回车等在内的所有空白符;

  • [![:space:]] 表示不包含空白符;

      如果!紧跟在一对方括号的左方括号之后,则表示不包括在方括号中列出的字符:
      例如:file[! 1-4].c  表示以file开头,第5个字符不是1-4之间数字的.c文件名
  • ${1%%[![:space:]]*} 表示去掉第一个参数中第一个不是空白符的字符及其右边的字符串,也就是说会返回字符串开头的所有空格"   "

  • 然后这行代码就变成了${1#"   "},表示去掉第一个参数第一次匹配的"   "及其左边的字符串;

  • 上述过程就完成了删除字符串开头空格的功能了。

: "${%"${##*[![:space:]]}"}"

  • _ 是一个shell参数,它扩展为上一个命令的最后一个参数。这里,就表示上一行命令的输出"aaa bbb  "
  • 剩余语法逻辑与第一句类似,此处不再赘述。

${ } 的一些特异功能

假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt

  • 我们可以用 ${ } 分别替换获得不同的值:
**${file#*/}** :去掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt

${file##*/} :去掉最后一条 / 及其左边的字符串:my.file.txt

${file#*.} :去掉第一个 . 及其左边的字符串:file.txt

${file##*.} :去掉最后一个 . 及其左边的字符串:txt

${file%/*} :去掉最后条 / 及其右边的字符串:/dir1/dir2/dir3

${file%%/*} :去掉第一条 / 及其右边的字符串:(空值)

${file%.*} :去掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file

${file%%.*} :去掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my

${file:0:5}:提取最左边的 5 个字节:/dir1

${file:5:5}:提取第 5 个字节右边的连续 5 个字节:/dir2

  记忆的方法为:

- `#` 是去掉左边(在键盘上 # 在 $ 之左边);
  • % 是去掉右边(在键盘上 % 在 $ 之右边);

  • 单一符号是匹配第一次(从左往右匹配,去掉第一组匹配上的);

  • 两个符号是匹配最后一次(从左往右,去掉最后一组匹配上的)。

  • 我们也可以对变量值里的字符串作替换:
**${file/dir/path}** :将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt

${file//dir/path} :将全部 dir 提换为 path:/path1/path2/path3/my.file.txt

echo ${MYSTRING//conservative/}  <=等价于=> echo ${MYSTRING//conservative} 相当于指定替换为空,即删除

  • 利用 ${ } 还可针对不同的变量状态赋值(没设定、空值、非空值)(unset 与 null 及 non-null)
**${file-my.file.txt}** :假如 $file 没有设定,则使用 my.file.txt 作传回值。(空值及非空值时不作处理)

${file:-my.file.txt} :假如 $file 没有设定或为空值,则使用my.file.txt 作传回值。 (非空值时不作处理)

${file+my.file.txt} :假如 $file 设为空值或非空值,均使用my.file.txt作传回值。(没设定时不作处理)

${file:+my.file.txt} :若 $file 为非空值,则使用 my.file.txt 作传回值。(没设定及空值时不作处理)

${file=my.file.txt} :若 $file 没设定,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。 (空值及非空值时不作处理)

**${file:=my.file.txt} **:若$file没设定或为空值,则使用my.file.txt作传回值,同时将 $file 赋值为my.file.txt 。(非空值时不作处理)

${file?my.file.txt} :若 $file 没设定,则将 my.file.txt 输出至STDERR。 (空值及非空值时不作处理)

${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (非空值时不作处理)

  • 此外,${#var} 可计算出变量值的长度:
**${#file}** 可得到 27 ,因为 /dir1/dir2/dir3/my.file.txt 刚好是 27 个字节...
其他
1
https://gitee.com/bingios/pure-bash-bible-zh_CN.git
git@gitee.com:bingios/pure-bash-bible-zh_CN.git
bingios
pure-bash-bible-zh_CN
pure-bash-bible-zh_CN
master

搜索帮助