shell

shell积累

2019-03-13  本文已影响15人  二手三流科学家

首先,给出我的bash版本
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

  1. 脚本中获取当前文件绝对路径:

    abPath=$(dirname $(readlink -f "$0"))
    abPath=$(cd "$(dirname "$0")";pwd)
    
  2. .bashrc中的配置

    alias ll='ls -AhFl --time-style='\''+%F %T'\'' --color=always'
    
  3. .vimrc中的配置

    set nu
    set smarttab
    set expandtab
    set tabstop=4
    set softtabstop=4
    set shiftwidth=4
    set ai
    set si
    set encoding=utf-8
    set fileencoding=utf-8
    set termencoding=utf-8
    
    
  4. 使用grep求两个文件的异同

    #给出`man`文档相关参数项
    #-f FILE, --file=FILE
    #Obtain  patterns  from  FILE,  one  per  line.
    #The empty file contains zero patterns, and therefore matches nothing. 
    #-F, --fixed-strings
    #Interpret  PATTERN as a list of fixed strings,separated by newlines,
    #any of which is to be matched.
    #找到FILE1和FILE2中共有的行
    grep -Ff FILE1 FILE2
    #找到FILE2中存在,FILE1中不存在的行
    grep -vFf FILE1 FILE2 
    
  5. 判断一个变量是否是整数的方法

    function isInt() {
        #$((${1} + 10)) &> /dev/null #这种不行
        #expr ${1} + 0 &> /dev/null #这种可行
        ((${1}+1)) &>/dev/null #这种办法可行
        if [ $? -eq "0" ] ;then 
            #echo 是整数
            return 0
        else
            #echo 不是整数
            return 1
        fi  
    }
    
    
  6. bash做逻辑运算的注意事项:

    #!/bin/bash
    
    [ 'abc'=='27789' ] && echo '字符串相等' || echo '字符串不相等' #输出字符串相等
    
    var=""
    [ -n $var ] && echo '不为空' || echo '空' #输出 不为空
    
    [ -n $undefinedVar ] && echo $undefinedVar不为空 || echo $undefinedVar为空 #输出$undefinedVar不为空
    #我的bash版本貌似不支持[[ 10 >= 8 ]] [[ 10 <= 8 ]]这样的表达式
    
    #总结:
    #尽量避免使用`(())`和`[[]]`语法做逻辑运算
    #使用整数做逻辑运算时,
    #使用`-eq`、`-lt`、`-gt`、`-ne`、`-ge`、`-le`操作符和`[]`语法
    #使用字符串做逻辑运算时,
    #使用`==`、`=`、`!=`、`-n`、`-z`操作符和`[]`语法
    #使用文件做逻辑运算时,
    #使用`[]`语法
    #`[]`左右两边和其内容之间一定要有空格,
    #逻辑表达式的操作符和操作数之间一定要有空格
    #使用字符串做逻辑运算,如果字符串是变量,一定要加双引号
    #`-a`、`-o`只能用于`[]`语法内部,`&&`、`||`还可以用户连接多个`[]`语法 
    
  7. ls递归遍历文件

    #!/bin/bash
    
    #传入一个目录,递归列出这个目录下的所有非目录文件
    #定义错误输出码
    #1 输入参数不是目录
    #2 输入参数个数不是一个
    
    function ls_file_r() {
        [ ! -d "${1}" ] && echo '请输入一个目录' && return 1
        [ "${#}" -ne 1 ] && echo '请输入一个目录' && return 2
      
        #local: can only be used in a function
        local dirname=$(echo ${1} | tr -s '/') #防止用户输入./sonemdir////这样的路径
        dirname=${dirname%/}
        [ -z "${dirname}" ] && dirname='/'
        funcname=${FUNCNAME[0]}
        for filename in $(ls  ${dirname}) 
        do  
            #未解决的问题,在有的目录下回出现死循环,一直输出相似的东西,比如/proc/
            #[ "$filename" == "proc" ] && continue
            if [ -d ${dirname}'/'${filename} ];then
                ${funcname} ${dirname}'/'${filename}
            else
                echo ${dirname}'/'${filename}
            fi  
        done
    }
    
    
  8. shell模拟PHParray_keys函数:

    #如果采用传参给函数的方式,会有如下问题
    #array_keys.sh:
    #!/bin/sh
    #array="$@" #这样可以接收几个空格分隔的字符串
    #array=("$@")  #这样可以接收到数组
    #调用脚本处:
    #sh test.sh ${someArr[*]} #这样传递进去的是数组,但是丢失了键值,在脚本中数组从0开始索引
    #sh test.sh "${someArr[*]}" #这样传递了一个空格分隔的字符串
    
    #基于以上原因,无法将这个功能封装为函数
    #array_keys.sh:
    #!/bin/sh
    array=([590]='abc' [73]='bbb' [3]=898)
    #shell会将数组按照键值大小自动排序
    count=${#array[*]}
    found=0     #计数器,记录当前找到了几个键
    search=0    #计数器,记录当前从零开始,已经测试到了多少
    ret=()      #存放键值的结果
    while [ $found -lt $count ]
    do
        if [ -n "${array[search]}" ];then
            found=$(($found + 1))   
            ret[found]=$search
        fi  
        search=$(($search + 1))
    done
    output=''
    for key in ${ret[*]}
    do
        output+="Key:${key}/Value:${array[key]}\n"
    done
    
    echo -e $output | column -s '/' -t  
    
    
上一篇 下一篇

猜你喜欢

热点阅读