shell积累
2019-03-13 本文已影响15人
二手三流科学家
首先,给出我的bash版本
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
-
脚本中获取当前文件绝对路径:
abPath=$(dirname $(readlink -f "$0")) abPath=$(cd "$(dirname "$0")";pwd)
-
.bashrc中的配置
alias ll='ls -AhFl --time-style='\''+%F %T'\'' --color=always'
-
.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
-
使用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
-
判断一个变量是否是整数的方法
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 }
-
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`只能用于`[]`语法内部,`&&`、`||`还可以用户连接多个`[]`语法
-
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 }
-
shell
模拟PHP
的array_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