shell技巧分享(七)

2018-06-21 LEo 更多博文 » 博客 » GitHub »

原文链接 http://reborncodinglife.com/2018/06/21/shell-tricks-7/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


这是一个系列文章,主要分享shell(部分功能仅适用于bash)的使用建议和技巧,每次分享3点,希望你能有所收获。

1 echo替换字符串

$ s="123abc123abc"
$ echo ${s/123/456}
456abc123abc
$ echo ${s//123/456}
456abc456abc

如果需要替换字符串中的某些字符,可以借助echo命令实现该功能。由示例中可以看到,使用一个斜杠(/)只替换首次出现的字符,使用2个斜杠(//)替换所有字符。

2 备份文件

lbak函数定义:

lbak(){
    if [[ $# -ge 1 ]]; then
        cp -rf $1 $1.bak
    fi
}

示例:

$ ls
$ touch test
$ echo 123 > test
$ cat test 
123
$ lbak test 
$ ls
test  test.bak
$ cat test.bak 
123

在linux上修改某些关键文件时,建议先将原文件备份再修改,不然修改后出问题,想恢复比较不易。通过定义一个lbak函数,自动实现文件备份,生成后缀名为bak的备份文件。由示例中可以看到,创建的test文件,在修改之前,通过lbak命令备份该文件,备份后会在当前目录自动生成一个test.bak文件,如果修改完test文件后,需要恢复该文件,直接将test.bak覆盖test文件即可,所以也可以定义一个lunbak函数,用于自动将备份文件恢复。

3 命令行子命令自动补齐

$ cat demo.bash 
_demo()
{
    COMPREPLY=()
    local cur=${COMP_WORDS[COMP_CWORD]};
    local cmd=${COMP_WORDS[COMP_CWORD-1]};
    case $cmd in

    'demo')
          COMPREPLY=( $(compgen -W 'foo bar help version' -- $cur) ) ;;
    '*')
          ;;
    esac
}

complete -F _demo demo
$ source demo.bash 
$ demo 
bar      foo      help     version  

linux的自动补齐功能非常强大,通过其提供的框架,可以给自己的命令行添加自动补齐功能。由示例中可以看到,首先创建一个demo.bash的shell脚本,该脚本需具有可执行权限,然后在当前终端source该脚本。此时,如果执行demo命令,按tab键会自动打印出相应的子命令,如果输入子命令的首字母按tab键,会自动补齐子命令,很方便就能实现子命令的自动补齐功能。