这里介绍两个我写的shell实用函数,有了它们就可以更方便地进行shell编程了。
需求:当别人共享给自己一个文件时,我不想直接查看该文件,而是想进入到该文件所在的目录去查看,因为还需要查看该目录下面的很多东西,那么要进入该文件所在的目录需要将文件名删除,然后进去,但当路径和文件名很长的时候,挨个字符删除文件名也比较麻烦,因此写了一个类似cd的函数,可以进入文件所在的目录下面,同时该函数也具备cd
的功能。
实现的功能:该函数命名为icd
(integrated cd),接收一个参数,若参数是一个文件,那么就进入到该文件所在的目录,若参数是一个目录,则进入到该目录,若参数是-
,则进入到上一级目录(此用法同cd
)
该函数的实现代码如下:
function icd(){
# my_cd:
if [[ $# -eq 0 ]]; then
echo "Usage: icd [ dir | file ] "
echo "icd means integrated cd"
return 1
fi
dir_or_file=$1
if [[ $dir_or_file == "-" ]]; then
cd -
elif [[ -d $dir_or_file ]]; then
# echo "dir"
cd $dir_or_file
elif [[ -f $dir_or_file ]]; then
filedir=$(dirname $dir_or_file)
cd $filedir
else
echo "Error! Wrong input! Must be a dir or a file"
fi
}
将上述代码保存到一个bash脚本(我保存在了utils.sh
文件里面)中,然后在shell或终端执行source utils.sh
,就可以调用该函数了。
icd
函数用法示例:
# 查看函数用法
icd
mkdir /tmp/adir # 新建一个目录
mkdir /tmp/bdir # 新建另一个目录
touch /tmp/adir/afile # 新建一个空文件
icd /tmp/adir/afile # 进入到该文件所在的目录
icd /tmp/bdir # 进入到bdir目录
icd - # 返回上一次所在目录
icd .
icd .. # 进入上一级目录
需求:在shell中使用grep搜索多个内容的时候比较麻烦,比如我想在文件a.txt中搜索python和linux,那么需要这样写:grep -E 'python|linux' a.txt
,当要搜索多个关键字时就要打很多个|
符号,有些麻烦,因此决定写一个简单的函数来更方便地对多个关键词进行搜索。
实现的功能:写了一个函数mgrep
(my grep的缩写),使用该函数在文件中搜索多个关键字的用法如下:
mgrep text1 text2 ... file.txt # 每个关键字用空格分隔,待搜索的文件放在最后面
# 原来的grep代码
grep -E 'python|linux' a.txt
# 使用mgrep搜索
mgrep python linux a.txt
该函数的实现代码如下:
其实实现起来并不难,代码主要做的工作是对输入文本进行处理,将其整理成 grep -E 'A|B'
的形式,然后使用grep
去搜索。
function mgrep(){
if [ $# -eq 0 ]; then
echo "Usage: mgrep text1 text2 ... target_file "
return
fi
num_args=$#
# return 0
search_text=""
num=0
for text in $@
do
num=$((num+1))
if [[ $num -ne $num_args ]]; then
search_text=$search_text"|"$text
else
target_file=$text
fi
done
search_text_final=$(echo $search_text | sed 's/|//' ) # 将第一个|去掉
# echo "text is $search_text_final, target_file=$target_file"
grep -E $search_text_final $target_file
}
同样,将上述代码保存到bash脚本(我保存在了utils.sh
文件里面)中,然后在shell或终端执行source utils.sh
,就可以调用该函数了。
以上就是本次分享的icd
和mgrep
函数的简单用法,如果你有什么好的建议欢迎指出,我们一起进步。