SHELL中有一些变量扩展的技巧,做下归纳总结

1、取字符串slice
规则一:${变量名:位置起点}
含义:由指定的位置起点开始,截取子字符串到字符串结束
例如:

var="/etc/passwd"
A=${var:}
echo $A
passwd

规则二:${变量名:位置起点:长度}
含义:由指定的位置起点开始,截取指定长度的字符串
例如:

var="/etc/passwd"
A=${var::}
echo $A etc

注意:位置起点是从0开始起算的。

例如:

var="/etc/passwd"
A=${var::}
echo $A /etc

2、取部分位置参数
命令行参数:$0表示命令本身,$1表示第一个参数,$2表示第二个参数,依此类推,$@表示所有的参数
位置参数有:$0、$1、$2、$@
规则一:${@:起点}
含义:表示由起点开始,取得后面所有的位置参数
例如:position.sh

#!/bin/bash
#显示命令本身
echo $
echo ${@:} #执行: chmod +x position.sh
./position.sh #结果: ./position.sh

规则二:${@:起点:个数}

含义:表示由起点开始,取得指定个数的位置参数
例如:position2.sh

#!/bin/bash
echo ${@::}
chmod +x position2.sh
./position2.sh

3、计算字符串长度
规则:${#变量名称}
含义:表示返回变量名称的字符串长度
例如:

string="/etc"
echo ${#string} #执行结果:

4、对比样式
规则一:${变量#样式}
含义:表示由变量值的最左边开始与样式进行对比,删除"最短相符合的字符串"
例一:

string="/etc/sysconfig/syslog"
echo ${string#/*/} #执行结果: sysconfig/syslog

例二:

string="//etc/sysconfig/syslog"
echo ${string#/*/} #执行结果: etc/sysconfig/syslog

说明:样式/*/,表示一对斜线之间有字符串(含空字符串),就对比符合

规则二:${变量##样式}
含义:表示由变量值的最左边开始与样式进行对比,删除"最长相符合的字符串"
例:

string="/etc/sysconfig/syslog"
echo ${string##/*/} #执行结果: syslog

规则三:${变量%样式}
含义:表示由变量值的最右边或最后边开始与样式进行对比,删除"最短相符的字符串"
例:

string="/etc/sysconfig/syslog"
echo ${string%/*} #执行结果: /etc/sysconfig

规则四:${变量%%样式}
含义:表示由变量值的最右边或最后边开始与样式进行对比,删除"最长相符的字符串"
例一:

string="www.baidu.com"
echo ${string%%.*} #执行结果: www

4、替换或删除部分字符串
规则一:${变量/样式/替换字符串}
含义:如果变量中有符合样式的字符串,则使用替换字符串替代,只替换第一个符合样式的字符串
例:

string="ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin"
echo ${string/:/,} #执行结果: ftp,x:::FTPUser:/var/ftp:/sbin/nologin

规则二:${变量//样式/替换字符串}
含义:如果变量中有符合样式的字符串,则使用替换字符串替代,替换全部符合样式的字符串
例如:

string="ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin"
echo ${string//:/,} #执行结果: ftp,x,,,FTPUser,/var/ftp,/sbin/nologin

5、把符合样式的字符串删除
规则一:${变量/样式/}
含义:删除符合样式的第一个字符串
例:

string="ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin"
echo ${string/:/} #执行结果: ftpx:::FTPUser:/var/ftp:/sbin/nologin

规则二:${变量//样式/}
含义:删除符合样式的所有字符串
例:

string="ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin"
echo ${string//:/} #执行结果: ftpx1450FTPUser/var/ftp/sbin/nologin

6、要求样式在字符串开始或结尾
在对比样式时,在样式前加上"#"号,表示该样式要出现在变量值的开头才算符合
在对比样式时,在样式前加上"%"号,表示该样式要出现在变量值的结尾才算符合
例一:

string="ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin"
echo ${string/#ftp/} #执行结果: :x:::FTPUser:/var/ftp:/sbin/nologin

例二:

string="ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin"
echo ${string/#:/}

执行结果:是个空值,没有在字符串开头找到":"冒号

例三:

string="ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin"
echo ${string/%nologin/bash} #执行结果: ftp:x:::FTPUser:/var/ftp:/sbin/bash

例四:

string="ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin"
echo ${string/%sbin/bin}

执行结果:是个空值,没有在变量值结尾找到匹配的样式

7、取变量名称列表
规则:${!开头字符串@}${!开头字符串*}
含义:把所有以指定字符串开头的变量名列出,各变量之间按空格分开
例:

syslog="syslog"
dir="/etc/sysconfig/"
dirfile="$dir/$syslog"
echo ${!di@} #执行结果: dir dirfile

8、取数组索引列表
规则:${!数组变量[@]}${!数组变量[*]}
含义:把数组变量所有的索引列出,各索引值之间用空格符分开
例一:

filelist=(/etc/passwd  /etc/issue  /etc/sysconfig/syslog)
echo ${!filelist[@]} #执行结果:

例二:

filelist=(/etc/passwd  /etc/issue  /etc/sysconfig/syslog)
for index in ${!filelist[@]}
do
echo "index $index:${filelist[$index]}"
done #执行结果: index :/etc/passwd
index :/etc/issue
index :/etc/sysconfig/syslog

shell变量扩展技巧的更多相关文章

  1. shell 变量定义技巧总结

    可以多学习和模仿操作系统自带的/etc/init.d/functions函数库脚本的定义思路,多学习Linux系统脚本中的定义,有经验的读者最终应形成一套适合自己的规范和习惯. (1)变量名及变量内容 ...

  2. (转)shell变量及扩展

    1.shell变量 shell变量赋值语句为”name=[value]“,等号两边不能有空格,可以给shell变量追加内容”name+=value“,取消shell变量的设置使用”unset name ...

  3. Shell基础(一):Shell基础应用、简单Shell脚本的设计、使用Shell变量、变量的扩展应用

    一.Shell基础应用 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 切换用户的Shell环境       2> 练习命令历史.命令别名       3 ...

  4. 三、Shell变量类型和运算符

    一.Shell变量的应用 1.Shell变量的种类     ·用户自定义变量:由用户自己定义.修改和使用     ·预定义变量:Bash预定义的特殊变量,不能直接修改     ·位置变量:通过命令行给 ...

  5. 《Linux shell变量总结回顾》RHEL6(转)

    文章版权:http://www.cnblogs.com/linux-super-meng/ 环境变量路径: [root@localhost ~]# set   //查看到的是局部变量和全局变量2种 [ ...

  6. (转载)linux中shell变量

    (转载)http://blog.csdn.net/zahuopuboss/article/details/8633891 为使shell编程更有效,系统提供了一些shell变量.shell变量可以保存 ...

  7. $ cd `dirname $0` 和PWD%/* shell变量的一些特殊用法

    在命令行状态下单纯执行 $ cd `dirname $0` 是毫无意义的.因为他返回当前路径的".". $0:当前Shell程序的文件名dirname $0,获取当前Shell程序 ...

  8. Linux下环境变量设置技巧

    Linux下环境变量设置技巧,不用/etc/profile而是在/etc/profile.d目录下新建特定的shell文件来设置 区别: 1.两个文件都是设置环境变量文件的,/etc/profile是 ...

  9. bash參考手冊之五(shell变量)续三

    LINENO 当前在运行的脚本或者shell函数的行号. LINES 命令select用来确定打印选择列表的列宽.收到SIGWINCH后,自己主动设置. MACHTYPE 是一个字符串,描写叙述了正在 ...

随机推荐

  1. Docker部署JavaWeb项目实战

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何在Ubuntu14.04 64位系统下来创建一个运行Javaweb应用程 ...

  2. C#中往数据库插入空值报错解决方法

    C#中的NUll于SQL中的null是不一样的, SQL中的null用C#表示出来就是DBNull.Value 在用C#往数据库里面插入记录的时候, 可能有的字段你不赋值,那么这个字段的值就为null ...

  3. FTP下载

    import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import ja ...

  4. git 使用教程 --基础一

    第一步:下载git   https://git-scm.com/ 第二步: 切到需要保存的文件夹下,执行: bogon:VBV mona$ git init #初始化,表示即将对当前文件夹进行版本控制 ...

  5. 大话设计模式之PHP篇 - 适配器模式

    定义将一个类的接口转换成客户希望的另外一个接口,使用原本不兼容的而不能在一起工作的那些类可以在一起工作. 角色Target适配目标,该角色定义把其他类转换为何种接口,也就是我们的期望接口.Adapte ...

  6. 友盟分享适配iOS9

    在新发布的iOS9系统上围绕用户数据的安全性和体验新增了一些安全特性,同时也影响了应用的实现以及集成方式,为了保证良好的稳定性和体验,需要做如下处理: 1.  HTTP传输安全 以iOS9 SDK编译 ...

  7. leetcode刷题1:两数之和two_sum

    题目:(难度:Easy) 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, ...

  8. ubuntu centos macos 配置上网代理

    因为我国强大的GFW,导致很多国外的应用无法安装,因为需要在系统中配置http/https代理. Ubuntu代理配置 配置方式非常简单,在~/.bashrc文件中增加: echo "exp ...

  9. sql server update时,是行锁还是表锁

    https://bbs.csdn.net/topics/120000749 http://www.cnblogs.com/s021368/articles/2148659.html 问题: udpat ...

  10. P3391 文艺平衡树

    hh 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...