分享一些学习bash时的笔记

这不算是一份教程,只是浅记录一下我认为容易忘记的东西,并且分享一些好用的技巧

所以这篇博客写的没有什么逻辑...

rm指令

选项:

r:递归

f:强制

i:每次删的时候问一下,例如:

image-20220309215112470

这个指令很危险,删了基本上没法恢复(我曾经就因为把mv打成rm而误删了一堆文件(好在不太重要))

我想,仿照windows的做法,在某个地方建一个rubbish文件夹,要删除的时候mv {{filename}} rubbish

为了方便操作,我改了一下home/.bashrc文件(后面讲),加了这么几行:

1
2
3
4
5
6
7
8
function del ()
{
d=`date +%Y-%m-%d`
if [ ! -e "/home/Legend/rubbish/$d" ] ;then
mkdir "/home/Legend/rubbish/$d"
fi
mv $1 "/home/Legend/rubbish/$d"
}

这样,以后使用命令del filename就可以直接把这个文件移动到rubbish里面啦(并且是按日期分类的)

例如(忽略2022那个文件夹,我乱建的):

image-20220316194936171

(这个不太好用,本文后面还有一个更好用的版本)

diff

diff 用于比较文件之间的差异

-b 不检查空格

-B 不检查空行

-q 仅显示有无差异

如果两个文件完全相同,什么都不会输出(什么都不输出就,怪怪的)

image-20220316215847780

如果两个文件不同,会以这种方式显示:

image-20220316215956009

(有点像git合并冲突时生成的东西)

用于文本处理的指令

sed

sed [选项] 命令 输入文本

1
2
3
4
5
6
7
8
9
10
11
选项(常用):
-n:使用安静模式。在一般sed的用法中,输入文本的所有内容都会被输出。加上-n参数后,则只有经过sed 处理的内容才会被显示。
-e: 进行多项编辑,即对输入行应用多条sed命令时使用。
-i:直接修改读取的档案内容,而不是输出到屏幕。使用时应小心。
命令(常用):
a :新增,a后紧接着\,在当前行的后面添加一行文本
c :取代,c后紧接着\,用新的文本取代本行的文本
i :插入,i后紧接着\,在当前行的上面插入一行文本
d :删除,删除当前行的内容
p :显示,把选择的内容输出。通常 p 会与参数 sed -n 一起使用。
s :取代,格式为s/re/string,re表示正则表达式,string为字符串,功能为将正则表达式替换为字符串。

常用例子

1
2
sed -n "2,4P" filename #输出文件的[2,4)行
sed -n "2p" filename #输出文件的第二行

awk

例子:

1
2
awk -F: '{print $2}' txt
awk '$1>2 {print $1,$3}' txt

.bashrc

.bashrc相当于一个配置文件,存在于每个用户的家目录中,每次用户登录或者开启一个新的进程(使用命令bash)都会载入.bashrc文件。

.bashrc文件里面的内容其实就是bash脚本,我的理解是,每次开启一个新的进程的时候都会执行一遍这个脚本。

所以你在这个脚本里面定义的全局变量都会变成你的用户变量,在这个脚本里面写的东西也都会运行一遍。

怎么验证呢?

我在.bashrc最开始写了一句

1
echo "Drink some water please."

然后每开启一个新的进程就会看到这个:

image-20220316214449313

修改.bashrc文件的主要用处有以下几点:

  1. 设置全局变量。如果你想配置PATH,就可以在这个文件里修改

  2. 设置快捷指令。

    正如前面我自己定义的快捷指令del,.bashrc文件里面的函数可以被直接当做指令运行

  3. alias为已有指令设置别名,例如

    1
    2
    alias ll='ls -alF'
    alias la='ls -A'
  4. 设置提示符

    提示符就是这一堆东西:

    image-20220316215246924

    (不过我觉得这个看起来没啥用,不过这篇文章挺花哨,先mark

tips:在修改完.bashrc后新建一个进程或者重新打开终端才会起作用,或者直接 bash ~/.bashrc

用windows的子系统访问c盘

如果你和我一样装了windows的ubuntu子系统,想用它访问c盘的文件应该怎么办呢?

首先,你应该知道,可以在根目录下的/mnt/里面访问windows的c盘:

image-20220316204946774

据说这是一种叫“挂载”的技术,/mnt/文件夹也与这个有关,但是我现在还没有学到这,先走马观花

但是这样很不方便。

ln指令

不是对数函数

这里要学习一个指令:ln用于建立链接,也就类似于Windows的快捷方式

用法:ln [OPTION]... TARGET LINK_NAME

例如

1
ln -s test linkOfTest
image-20220316203459056

我们可以用ln指令在方便访问的地方建立一个c盘的链接,访问的时候直接cd ./linkname,方方便便。

当然也可以建立一些常用文件夹的链接。

另一些奇怪的散装知识

  • "`"反引号表示先执行反引号里面的内容,然后把这个指令执行的结果传递到前面的指令(有点类似于管道?)

    一个奇怪的例子:

    image-20220316223948699

    怎么解释呢?

    image-20220316230914936
  • 在bash脚本中

    ((a++))表示a自增1,例如这样:

    image-20220316224114886
  • 五颜六色的输出

    很炫酷,先mark一下

    CSDN博客_shell 设置输出颜色

  • 其实前面加的del指令还可以改一下,让他支持一次性删除多个文件

    不说了,放代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function del ()
    {
    y=`date +%Y`
    m=`date +%Y/%m`
    d=`date +%Y/%m/%d`
    dir="/home/Legend/rubbish/"
    if [ ! -e "$dir$y" ]; then mkdir "$dir$y"; fi
    if [ ! -e "$dir$m" ]; then mkdir "$dir$m"; fi
    if [ ! -e "$dir$d" ]; then mkdir "$dir$d"; fi
    for i in $*
    do
    mv $i "$dir$d"
    echo "Successfully deleted $i"
    done
    }

    这样就人性化多了!

    试了一下,完美!

    image-20220317095016988

    甚至可以这样:

    image-20220317095238520

    缺点是,如果删除同名文件,会将垃圾箱里面原来的覆盖掉

指令忘了怎么办

  • --help

    我觉得这个挺好用的,会列出来这个指令的基本功能,以及各个选项的作用,简单清晰易懂,适合速查,强烈推荐

  • tldr

    'too long don't read'的缩写

    这更像一个教程,就是给你举一些常用的例子,告诉你怎么写

    还是彩色的,会让你的眼前一抹绿

    (要是有中文版就好了TAT

  • man

    狗都不看

  • 上网查(误

  • 求助大佬(误


[后记]

bash这个玩意,指令真的记不住

只有熟能生巧但是windows这么好用,谁没事用Linux啊

除去os课不讲,我觉得这玩意的最大优势在于装逼批处理

大概是我现在还没有习惯于命令行并且不熟练才会觉得很难受吧