假设我们定义了一个变量为:

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

利用 ${ } 还可针对不同的变数状态赋值(没设定、空值、非空值):

  • ${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 定义为非空值。 (保留空值及非空值)
  • ${file:=my.file.txt} :若 $file 没设定或为空值,则使用 my.file.txt 作默认值,同时将 $file 定义为非空值。 (保留非空值)
  • ${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 个字?...

接下来介绍一下  bash 的数组(array)处理方法:
一般而言,A="a b c def" 这样的变量只是将 $A 替换为一个单一的字串,
但是改为 A=(a b c def) ,则是将 $A 定义为数组。
bash 的数组替换方法可参考如下方法:

  • ${A[@]} 或 ${A[*]} 可得到 a b c def (全部数组)
  • ${A[0]} 可得到 a (第一个数组),${A[1]} 则为第二个数组...
  • ${#A[@]} 或 ${#A[*]} 可得到 4 (全部数组数量)
  • ${#A[0]} 可得到 1 (即第一个数组(a)的长度),${A[3]} 可得到 3 (第一个数组(def)的长度)
  • A[3]=xyz 则是将第 4 个数组重新定义为 xyz ...

一句话总结:bash 很强大!

bash{} 方法总结的更多相关文章

  1. AIX下安装bash

    在AIX系统下,默认是没有安装bash环境的,对于经常操作的维护人员来说,非常不方便,所以下面我们来动手安装bash. 1.确认系统是否已安装bash 方法1:之间敲bash命令,若提示没有此命令则没 ...

  2. python反转字符串(简单方法)及简单的文件操作示例

    Python反转字符串的最简单方法是用切片: >>> a=' >>> print a[::-1] 654321 切片介绍:切片操作符中的第一个数(冒号之前)表示切片 ...

  3. Shell中判断字符串是否为数字的6种方法分享

    #!/bin/bash ## 方法1 a=1234;echo "$a"|[ -n "`sed -n '/^[0-9][0-9]*$/p'`" ] &&a ...

  4. Linux下批量修改文件名方法

    对于在Linux中修改文件名的方式一般我们会用mv命令进行修改,但是mv命令是无法处理大量文件修改名称. 但是在处理大量文件的时候该如何进行批量修改呢? 方法一:mv配合for循环方式进行修改 [ro ...

  5. linux 匹配字符串是否为数字

    #!/bin/bash ## 方法1 a=1234;echo "$a"|[ -n "`sed -n '/^[0-9][0-9]*$/p'`" ] &&a ...

  6. shell 判断字符串是否为数字

    本篇文章主要介绍了"shell 判断字符串是否为数字",主要涉及到shell 判断字符串是否为数字方面的内容,对于shell 判断字符串是否为数字感兴趣的同学可以参考一下. #!/ ...

  7. 我的docker 使用笔记

    0 容器启动 docker run image_name(镜像名称) echo "hello word" 1 启动容器 退出后 重新进入 方法一 sudo docker exec ...

  8. ubuntu dash

    缘由:写一些脚本放在/etc/rc.loca自动执行开机启动报错 fiail to start /etc/rc.local 查找资料 缘起:ubuntu在6.0后默认bash改为了dash  导致很多 ...

  9. shell基本理论知识

    (1)查看系统上安装了哪些shell # cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/dash /bin/bash / ...

随机推荐

  1. CI控制器的继承问题

    在项目中经常用到这样一种情况,后台中每个页面都要判断Session来确定用户是否登陆状态.对于在Codeigniter中,那么就会考虑每个控制器继承一个公用控制器. 比如:AdminBase 为应用后 ...

  2. HDU 3791

    http://acm.hdu.edu.cn/showproblem.php?pid=3791 建立二叉树,对比是否相同 #include <iostream> #include <c ...

  3. Selenium - IWebDriver.SwitchTo() frame 和 Window 的用法

    IWebDriver.SwitchTo().Frame(IWebElement frame) 如果一个页面是一个html元素, 只有一个head, 一个body, 那么使用IWebDriver.Fin ...

  4. Linux--/tmp目录文件重启后自动删除

    源博客 http://blog.itpub.net/24996904/viewspace-769327/ 在/etc/default/目录下有个rcS文件,文件内容如下:## /etc/default ...

  5. android webview如何加载asset目录里的页面

    在asset里的页面都可以这样获得 file:///android_asset/index.html

  6. 世纪互联运营的Microsoft Azure正式支持FreeBSD虚拟机镜像

    自2012年开始,微软云计算与企业事业部和Citrix思杰,NetApp达成合作,共同开发出第一版针对Hyper-V虚拟设备驱动以及相关的用户态程序,并将此称之为集成服务(Integration Se ...

  7. mapreduce入门之wordcount注释详解

    mapreduce版本:0.2.0之前 说明: 该注释为之前学习时找到的一篇,现在只是在入门以后对该注释做了一些修正以及添加. 由于版本问题,该代码并没有在集群环境中运行,只将其做为理解mapredu ...

  8. 四 GPU 并行编程的存储系统架构

    前言 在用 CUDA 对 GPU 进行并行编程的过程中,除了需要对线程架构要有深刻的认识外,也需要对存储系统架构有深入的了解. 这两个部分是 GPU 编程中最为基础,也是最为重要的部分,需要花时间去理 ...

  9. 2016 ACM/ICPC Asia Regional Dalian Online 1002/HDU 5869

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  10. tyvj 1049 最长不下降子序列 n^2/nlogn

    P1049 最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 ...