zoukankan      html  css  js  c++  java
  • shell相关知识

    在bash shell中,$( )与` ` (反引号)都是用来做命令替换用(command substitution)的。
    所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:
    *完成引号里的命令行,然后将其结果替换出来,再重组命令行。
    例如:

    $ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)

    在操作上,用$( )或` `都无所谓,只是我"个人"比较喜欢用$( ),理由是:
    1,  ` `很容易与' ' (单引号)搞混乱,尤其对初学者来说。
    有时在一些奇怪的字形显示中,两种符号是一模一样的(直竖两点)。
    当然了,有经验的朋友还是一眼就能分辩两者。只是,若能更好的避免混乱,又何乐不为呢?
    2,在多层次的复合替换中,` `须要额外的跳脱( /` )处理,而$( )则比较直观。例如:
    这是错的:

    command1 `command2 `command3` `

    原本的意图是要在command2 `command3`先将command3提换出来给command 2处理,然后再将结果传给command1 `command2 ...`来处理。
    然而,真正的结果在命令行中却是分成了`command2 `与``两段。
    正确的输入应该如下:

    command1 `command2 /`command3/` `

    要不然,换成$( )就没问题了:

    command1 $(command2 $(command3))

    只要你喜欢,做多少层的替换都没问题啦~~~  ^_^

    不过,$( )并不是没有弊端的...
    首先,` `基本上可用在全部的unix shell中使用,若写成shell script,其移植性比较高。
    而$( )并不见的每一种shell都能使用,我只能跟你说,若你用bash2的话,肯定没问题...  

     

    接下来,再让我们看${ }吧...它其实就是用来作变量替换用的啦。
    一般情况下,$var与${var}并没有啥不一样。
    但是用${ }会比较精确的界定变量名称的范围,比方说:

    $ A=B
    $ echo $AB

    原本是打算先将$A的结果替换出来,然后再补一个B字母于其后,但在命令行上,真正的结果却是只会替换变量名称为AB的值出来...
    若使用${ }就没问题了:

    $ echo ${A}B
    BB

    不过,假如你只看到${ }只能用来界定变量名称的话,那你就实在太小看bash了﹗
    有兴趣的话,你可先参考一下cu本版的精华文章:
    http://www.chinaunix.net/forum/viewtopic.php?t=201843
    参考以前的:http://www.cnblogs.com/youxin/p/3544179.html


    为了完整起见,我这里再用一些例子加以说明${ }的一些特异功能:
    假设我们定义了一个变量为:
    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

     

    获取文件名:

    basename 

    basename - strip directory and suffix from filenames

    SYNOPSIS
    basename NAME [SUFFIX]
    basename OPTION... NAME.

    basename /usr/bin/sort  ---> "sort"

    去除后缀:

    root@iZ23onhpqvwZ:~# basename ms.tgz .tgz

    ms

     

     https://www.jianshu.com/p/483fdf22e909

     https://blog.csdn.net/MirrorLean/article/details/74162664

  • 相关阅读:
    CS224N Assignment 1扩展阅读——词嵌入
    算法面经总结
    Leetcode刷题笔记(一)
    使用python-Statsmodels进行基于统计学的时间序列分析
    chinaunix book
    行政区划分
    视频网站
    sqlserver还原bak备份文件
    linux给终端设置代理
    ruby中exec,system,%x的区别
  • 原文地址:https://www.cnblogs.com/youxin/p/4218159.html
Copyright © 2011-2022 走看看