${} ——变量替换

通常 $var 与 ${var} 没有区别,但是用 ${} 会比较精确的界定变量名称的范围。

name='Ace'
echo "result1: my name is $name1."
echo "result2: my name is ${name}1." 执行结果:
result1: my name is .
result2: my name is Ace1.

${变量名1#$变量名2} 
此外的含义为从变量名1的内容中将变量名2所代表的内容除去,但有一个限制,即必须从第1位开始,且当连续使用时要用下述方法进行转义赋值: 
变量3=` echo ${变量1#$变量名2} `,然后再引用变量3才能正确的进行操作

i=/etc/rc$runlevel.d/K05saslauthd
subsys=${i#/etc/rc$runlevel.d/K??} echo "result is : $subsys"
t1=`echo ${i#/etc/rc$runlevel.d/K??}`
echo "t1 value is : $t1" 执行结果:

result is : saslauthd
  t1 value is : saslauthd

取路径、文件名、后缀

先赋值一个变量为一个路径,如下:  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} 获取变量长度 27

根据状态为变量赋值

命令 解释 备注
${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=txt} 若 $file 没设定,则回传 txt ,并将 $file 赋值为 txt 空值及非空值不作处理
${file:=txt} 若 $file 没设定或空值,则回传 txt ,将 $file 赋值为txt 非空值时不作处理
${file?my.file.txt} 若 $file 没设定,则将 my.file.txt 输出至 STDERR 空值及非空值不作处理
${file:?my.file.txt} 若 $file没设定或空值,则将my.file.txt输出至STDERR 非空值时不作处理

tips:
以上的理解在于, 你一定要分清楚 unset 与 null 及 non-null 这三种赋值状态. 一般而言, : 与 null 有关, 若不带 : 的话, null 不受影响, 若带 : 则连 null 也受影响.

数组

  1.  A="a b c def" # 定义字符串
  2. A=(a b c def) # 定义字符数组
命令 解释 结果
${A[@]} 返回数组全部元素 a b c def
${A[*]} 同上 a b c def
${A[0]} 返回数组第一个元素 a
${#A[@]} 返回数组元素总个数 4
${#A[*]} 同上 4
${#A[3]} 返回第四个元素的长度,即def的长度 3
A[3]=xyz 则是将第四个组数重新定义为 xyz  
$(( ))与整数运算

bash中整数运算符号

符号 功能
    + - * /           分别为加、减、乘、除
    %         余数运算
    & | ^ !         分别为“AND、OR、XOR、NOT”

在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用。

a=;b=;c=
echo "result1 is :$((a+b*c))"
echo "result2 is :$(($a+$b*$c))" 执行结果:
result1 is :
result2 is :

进制转换
$(( ))可以将其他进制转成十进制数显示出来。用法如下:
echo $((N#xx))
其中,N为进制,xx为该进制下某个数值,命令执行后可以得到该进制数转成十进制后的值。

echo $((#)) # 二进制转十进制
echo $((#2a)) # 十六进制转十进制
echo $((#)) # 八进制转十进制 执行结果

重定义变量值

a=;b=
((a++));echo $a
((a--));echo $a
((a<b));echo $? 执行结果:
6
5
0

使用(( ))作整数测试时,不要跟[ ]的整数测试搞混乱了。

 $( )` `(反引号)  ——命令替换

命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。

Example 1:

echo today is $(date "+%Y-%m-%d")

执行结果:
today is --

在操作上,这两者都是达到相应的效果,但是建议使用$( ),理由如下:

  • ``很容易与''搞混乱,尤其对初学者来说。
  • 在多层次的复合替换中,``必须要额外的跳脱处理(反斜线),而$( )比较直观。
  • 最后,$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。
# 将cmd1执行结果作为cmd2参数,再将cmd2结果作为cmd3的参数
cmd3 $(cmd2 $(cmd1)) # 如果是用反引号,直接引用是不行的,还需要作跳脱处理
cmd3 `cmd2 \`cmd1\``

Linux Shell 小知识的更多相关文章

  1. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

  2. Linux Shell 基础知识(一)

    1. 本文知识结构 2. shell 基础知识 2.1 shell 简单介绍 ​ GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + ...

  3. Linux Shell 小脚本经典收藏

    原文:http://www.cnblogs.com/Javame/p/3867686.html 1.在两个文件中找出相同的号码 diff -y xx.txt oo.txt | egrep -v &qu ...

  4. linux shell基本知识 sleep命令

    在有的shell(比如linux中的bash)中sleep还支持睡眠(分,小时) sleep 睡眠1秒 sleep 1s 睡眠1秒 sleep 1m 睡眠1分 sleep 1h 睡眠1小时

  5. linux shell 小技能

    环境: [root@test ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@test ~]# uname -a Linux ...

  6. Linux Shell基础知识

    一.文件系统和安全 chmod命令 chmod命令有两种模式,一种是符号模式,用ugo执行用户,用rwx执行权限:另一种是绝对模式,用八进制不同位置的不同值来代表不同用户的不同权限. 符号模式 chm ...

  7. linux shell基本知识

    shell script的一些注意事项: .#这个符号是注释本行,通常用来做批注用,#!除外,是用来标注用哪种shell执行本脚本, .执行顺序为从上到下,从做到右 .忽略空行,tab空格 .脚本换行 ...

  8. Linux Shell 基础知识(二)

    1.本文知识结构 2.文件的查询与检索 2.1. cd 目录切换 找到文件/目录位置:cd 切换到上一个工作目录: cd - 切换到home目录: cd or cd ~ 显示当前路径: pwd 更改当 ...

  9. Linux系统小知识

    换Linux系统快半年了,刚开始总是碰到各种各样的问题,虽然斗解决了,由于没有记录,过一段时间就忘了,故在这里记录一下. 选择国内镜像源: Manjaro有一个很好用的命令rankmirrors.ra ...

随机推荐

  1. The Evaluation of Determinant(求行列式mod一个数的值)

    #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #i ...

  2. Oops, 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine error

    环境: Win7 64位 + VS2005 + Office2013 64位 现象:程序为一个Excel导入程序,导入时报「'Microsoft.ACE.OLEDB.12.0' provider is ...

  3. [PsTools]psexec.exe使用范例-运行远程电脑程序(exe、bat等)

    前置条件 先下载psexec.exe.放置到C盘根文件夹 下载地址:http://download.csdn.net/detail/whylaughing/8885893 命令范例:(注意空格) C: ...

  4. Android Studio VS Eclipse (还在用Eclipse?你OUT了!)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990).谢谢支持! 公司派来一个去美国參加完AnDevCon大会的来给我们分享大会上学习的内容. AnDevC ...

  5. “2014年ArcGIS影像高级培训班——5月份北京站”火热报名中!

    您从事遥感类的相关工作吗?您正对着一景景影像数据不知从何下手吗?您有TB级甚至更高量级的影像数据须要有效管理.即时分享吗?您须要构建Web端的应用实现影像实时处理.在线分析吗? 您是否已经找到有效的解 ...

  6. 51nod 1353 树

    树背包 设f[i][j]表示第i个点,和子节点组成的联通块大小为j,其他都可行的方案 j=0表示可行的总方案 #include<cstdio> #include<iostream&g ...

  7. POJ 2610:Dog & Gopher

    Dog & Gopher Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4142   Accepted: 1747 ...

  8. [JSOI 2012] 玄武密码

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4327 [算法] AC自动机[代码] #include<bits/stdc++. ...

  9. Javascript中的Object对象

    Object是在javascript中一个被我们经常使用的类型,而且JS中的所有对象都是继承自Object对象的.虽说我们平时只是简单地使用了Object对象来存储数据,并没有使用到太多其他功能,但是 ...

  10. mysql大数据的分表

    在实际业务运作中,我们经常遇到一个表中数据量过大的问题,这样的话,问题就来了.如何将一个表中的数据均衡的放到多个表中? 我的建议是,新建一个表,但是只有一个自增的id字段,将其作为分表的依据.有大数据 ...