温故知新,Linux命令知多少,学习Bash Shell

image

缩写大全

  • pwd: print work directory打印当前目录 显示出当前工作目录的绝对路径
  • ps: process status(进程状态,类似于windows的任务管理器)
    • 常用参数:-auxf
    • ps -auxf 显示进程状态
  • df: disk free其功能是显示磁盘可用空间数目信息及空间结点信息。换句话说,就是报告在任何安装的设备或目录中,还剩多少自由的空间。
  • du: Disk usage
  • rpm:即RedHat Package Management,是RedHat的发明之一
  • rmdirRemove Directory(删除目录)
  • rmRemove(删除目录或文件)
  • cat: concatenate连锁
    • cat file1file2>>file3 把文件1和文件2的内容联合起来放到file3中
  • insmod: install module,载入模块
  • ln -s : link -soft 创建一个软链接,相当于创建一个快捷方式
  • mkdirMake Directory(创建目录)
  • touch: touch
  • man: Manual
  • suSwith user(切换用户)
  • cdChange directory
  • lsList files
  • mkfs: Make file system
  • fsckFile system check
  • uname: Unix name
  • lsmod: List modules
  • mv: Move file
  • cp: Copy file
  • ln: Link files
  • fg: Foreground
  • bg: Background
  • chown: Change owner
  • chgrp: Change group
  • chmod: Change mode
  • umount: Unmount
  • dd: 本来应根据其功能描述"Convert an copy"命名为"cc",但"cc"已经被用以代表"CComplier",所以命名为"dd"
  • tarTape archive (磁带档案)
  • lddList dynamic dependencies
  • insmodInstall module
  • rmmodRemove module
  • lsmodList module
  • 文件结尾的"rc"(如.bashrc、.xinitrc等):Resource configuration
  • Knnxxx /Snnxxx(位于rcx.d目录下):K(Kill);S(Service);nn(执行顺序号);xxx(服务标识)
  • .a(扩展名a):Archive,static library
  • .so(扩展名so):Shared object,dynamically linked library
  • .o(扩展名o):Object file,complied result of C/C++ source file
  • dpkgDebian package manager
  • aptAdvanced package tool(Debian或基于Debian的发行版中提供)

目录操作

显示文件(ls)

ls:表示列出当前目录下的文件内容,可以通过ls --help查看更多使用。

  • ls -a:表示全部文件包括隐藏文件。
  • ls -l:列出全部文件,显示文件属性权限,修改时间。

image

image

当使用ls -l的时候,在结果中。

第一列,是文件类型+文件权限。第1位表示文档类型,d表示目录,-表示文件,l表示链接文件,d表示可随机存取的设备,如U盘等,c表示一次性读取设备,如鼠标、键盘等。后9位,依次对应三种身份所拥有的权限,身份顺序为:owner、group、others,权限顺序为:readable、writable、excutable。如:-r-xr-x---的含义为当前文档是一个文件,拥有者可读、可执行,同一个群组下的用户,可读、可执行,其他人没有任何权限。

第二列,表示链接数,表示有多少个文件链接到inode号码。

第三列表示拥有者

第四列表示所属群组

第五列表示文档容量大小,单位字节。

第六列表示文档最后修改时间,注意不是文档的创建时间哦。

第七列表示文档名称。以点(.)开头的是隐藏文档。

这里特别注意,以.开头的是隐藏目录或者隐藏文件。

image

切换目录(cd)

cd表示切换目录。

  • cd .. 切换到上一层目录。
  • cd / 切换到根目录。
  • cd /home/taylorshi 切到指定目录。
  • cd ~ 切换到当前用户的根目录。

image

显示目录(pwd)

pwd可以显示当前目录绝对路径

image

创建目录(mkdir)

mkdir代表创建新的文件夹。

  • mkdir -p表示创建子目录。

image

image

删除目录(rm)

rm代表删除目录或文件。

  • rm file 删除指定文件。
  • rm -r 递归删除目录及其内容。
  • rm -f 表示强制删除,不提示确认。
  • rm -i 表示每次删除前提示确认。

image

image

image

创建文件(touch)

touch 可创建一个空文件。

  • touch 1.bat 创建一个名为1.bat的空文件。

image

image

创建链接(ln)

ln 创建快捷方式

  • ln -s $targetFile $targetLink 给目标文件创建目标快捷方式。

image

编辑文件(vi/vim)

vi 或者 vim可以编辑一个文件。

  • vi file可以编辑指定文件。
  • vim file可以编辑指定文件。

image

image

拷贝文件(cp)

cp 代表拷贝文件或者目录

  • cp source target 拷贝source文件到target
  • cp -p 连同文件属性一起复制过去。
  • cp -r 递归复制目录及其子目录内的所有内容。

image

image

移动文件(mv)

mv 代表移动文件或目录

  • mv -f 强制移动。
  • mv sourceDir targetDir 将所有源文件移动至指定的目录中。

image

image

image

文件属性(rwx)

Linux中文件都有属性,通过rwx三个参数表示,可通过ls -l查看到,如果没有权限会用-替代。

image

image

其中:

  • r:表示可读(read) 数字表示4
  • w:代表可写(write) 数字表示2
  • x:代表可执行(execute) 数字表示1

全部的属性权限就是777,对应-rwxrwxrwx

image

我们看到,通过ls -l看到的权限是10位,其中第一位代表文件类型,如果是文件,那就是-,如果是目录会显示d,如果是链接,显示l

接下来是9位权限,每3位为一组,依次代表了ownergroupothers三个组,以-rw-r--r--为例,含义为:

针对这个文件,其拥有者可读可写,同一群组用户可读,其他人可读。

再举个例子,以-r-xr-x---为例,含义为:

针对这个文件,其拥有者可读可执行,同一个群组用户可读可执行,其他人无权限。

再举个例子,以drwxr-xr-x为例,含义为:

针对这个目录,其拥有者可读可写可执行,同一个群组用户可读可执行,其他人可读可执行。

控制权限(chmod)

chmod (Change Mode)可以修改针对文件或者目录的控制权限。

image

只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式),符号模式指定文件的权限。

image

  • chmod 权限 file 给指定文件修改权限。
  • chmod + 增加权限。
  • chmod - 取消权限。

image

image

image

# 权限 rwx 二进制
7 读 + 写 + 执行 rwx 111
6 读 + 写 rw- 110
5 读 + 执行 r-x 101
4 只读 r-- 100
3 写 + 执行 -wx 011
2 只写 -w- 010
1 只执行 --x 001
0 --- 000

例如, 765将这样解释:

  • 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如rwx,也就是4+2+1,应该是7
  • 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如rw-,也就是4+2+0,应该是6
  • 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如r-x,也就是4+0+1,应该是5

image

查看文件(cat)

cat 表示从第一行开始读显示文件内容。

  • cat file 显示全部文本内容。
  • cat -n 表示显示文件的行数。

image

image

tac 表示从最后一行开始显示。

image

more 表示查看文件内容。

在看文件页面,我们可以通过B键进行切换上一页,空格是下一页。

image

less:表示一页一页的查询内容

  • 空格:翻页
  • 键盘 ↑:表示上一页
  • 键盘 ↓:表示下一页

image

/XXX:表示查看XXX

  • n:往下查找XXX
  • q:退出less

image

head -n :表示显示前几行,n表示数字输入只显示前几行

image

tail -n:表示显示后几行,n表示数字输入只显示最后几行

image

查找文件(find)

find 表示查找文件内容。

  • find -name 表示根据文件名进行查找。
  • find -tpye 表示根据文件类型查找。

例如:

find projects -name '*.bat'

image

这个-type后面跟的类型参数也是有约定的,不能随便:

  • d:目录
  • c:字型装置文件
  • b:区块装置文件
  • p:具名贮列
  • f:一般文件
  • l:符号连结
  • s:socket

image

find妙用之查找文件并删除

find . -maxdepth 1 -type f -not -name '*.dll' -exec rm -r {} \;

这个代表从当前目录(.)查找类型为一般文件(f)不是*.dll的文件,然后执行-exec的命令,删除它(rm -r {} \)。

find妙用之删除空文件夹

find . -type d -empty -delete

这个代表从当前目录(.)查找类型为目录(d)的目录,筛选空文件夹(-empty),然后执行删除(-delete)。

find妙用之删除非空文件夹

find . -type d -name log -exec rm -r {} \;

find妙用之复杂表达式删除

find . -type d \( -name 'log' -or -name 'kk' \) -exec rm -rf {} \;

这个代表从当前目录(.)查找类型为目录(d)的目录,筛选名称为log(-name log)或者名称为kk(-or -name kk)的文件夹,这里-o/-or代表或者(OR),然后执行删除(-exec rm -rf {})。

find妙用之打印查找结果

find . -type d \( -name 'log' -or -name 'kk' \) -print

这里使用-print可以打印查找结果。

查找环境变量(which)

which :查找环境变量下符合内容条件返回对应的目录。

which bash

image

查找字符串(grep)

grep用于查找文件中字符串。

  • grep $filter $file 从file中按filter筛选内容。
  • grep -i $filter $file 从file中按filter筛选内容,不缺乏大小写。
  • grep -c $filter $file 匹配的函数。

image

image

image

配合其他语句

find projects -name '*.bat' | grep "1"

image

解压文件(tar)

tar 解压命令。

image

  • -c或--create:建立新的备份文件;

  • -C <目录>:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。

  • -d:记录文件的差别;

  • -x或--extract或--get:从备份文件中还原文件;

  • -t或--list:列出备份文件的内容;

  • -z或--gzip或--ungzip:通过gzip指令处理备份文件;

  • -Z或--compress或--uncompress:通过compress指令处理备份文件;

  • -f<备份文件>或--file=<备份文件>:指定备份文件;

  • -v或--verbose:显示指令执行过程;

  • -r:添加文件到已经压缩的文件;

  • -u:添加改变了和现有的文件到已经存在的压缩文件;

  • -j:支持bzip2解压文件;

  • -v:显示操作过程;

  • -l:文件系统边界设置;

  • -k:保留原有文件不覆盖;

  • -m:保留文件不被覆盖;

  • -w:确认压缩文件的正确性;

  • -p或--same-permissions:用原来的文件权限还原文件;

  • -P或--absolute-names:文件名使用绝对名称,不移除文件名称前的“/”号;

  • -N <日期格式> 或 --newer=<日期时间>:只将较指定日期更新的文件保存到备份文件里;

  • --exclude=<范本样式>:排除符合范本样式的文件。

  • tar -zcvf $target.tgz $dirName 将dirName目录打包成$target.tgz文件。

  • tar -zxvf $target.tgz 解压$target.tgz文件到当前目录。

  • tar --exclude=$dirName/$excludeFile $target.tgz $dirName 将dirName目录中除excludeFile文件外的打包成$target.tgz文件。

  • tar -tzvf $target.tgz 列出压缩文件target.tgz中的文件,但不解压。

  • tar -zcvf $target.tar.gz $targetFiletargetFile打包成target.tar.gz文件。

image

image

image

image

image

image

磁盘使用(df)

df (disk free)用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。

  • df -a : --all 包含所有的具有0 Blocks的文件系统。
  • df --total 显示所有的信息。

image

image

第一列指定文件系统的名称,第二列指定一个特定的文件系统1K-块1K是1024字节为单位的总内存。已用和可用列正在使用中,分别指定的内存量。

使用列指定使用的内存的百分比,而最后一栏"安装在"指定的文件系统的挂载点。

image

系统占用(top)

top 实时显示进程的动态。

image

  • 第一行表示:系统时间,用户连接数,15分钟的平均负载

  • 第二行表示:进程信息

  • 第三行表示:cpu信息

  • 第四行表示:内存信息

  • top -p $processId 查看指定processId进程的占用情况。

image

系统信息(arch)

显示架构信息

arch

image

或者通过uname也可以查看

uname -m

image

显示内核版本信息

uname -r

image

image

显示CPU信息

cat /proc/cpuinfo

image

显示内核信息

cat /proc/version

image

显示系统时间

date

image

端口信息(netstat)

sudo apt install net-tools

netstat 查看端口信息。

image

netstat

image

查看全部端口信息

netstat -a

image

进程信息(ps)

ps 查看进程信息

image

查看所有进程

ps -e

image

查看所有进程,包括UID

ps -ef

image

强制干掉进程

kill -9 $pid

image

$* 和 $@

在Bash中没有双引号时, 它们两个被扩展后, 结果是一样的, 都是表示外部输入的参数列表.

当有双引号时, 如 “$*”, “$@”, 这个时候, 前者表示的是用 IFS (Internal Field Separator) 分隔符连接起来的统一字符, 后者则表示的是输入的每个参数.

举例如下

文档名字为 test_1.sh

#!/bin/bash

export IFS=%

cnt=1
for i in “$*”
do
    echo “Number of $cnt parameter is: $i”
    (( cnt++ ))
done

echo
echo 

cnt=1
for i in “$@”
do 
    echo “Number of $cnt parametre is: $i”
    (( cnt++ ))
done

执行这个文件:

./test_1.sh “Hello, how are you?” Second Third Fourth

输出的结果会是:

Number of 1 parameter is: Hello, how are you?%Second%Third%Fourth


Number of 1 parameter is: Hello, how are you?
Number of 2 parameter is: Second
Number of 3 parameter is: Third
Number of 4 parameter is: Fourth

解释如下

被双括号后, “$*” 表示的是用内部分割符 IFS 连接起来的一个完整的统一字符串, 注意上面的打印输出只有一个参数.

而 ”$@” 仍然表示的是各个输入的参数. 所以这也就解释了, 除非特殊情况, 为什么推荐使用 $@ 而不是 $* 展开参数列表了.

$# 获得参数列表的总个数

如果接着上面的 test_1.sh 文件, 在最后添加:

echo Number of total parameters are $#

执行后获得另外新的结果将会是:

Number of total parameteers are 4

$$, $!, $? 获得进程ID信息

$$ 获得当前进程 ID
$! 获得之前(上一个)进程 ID
$? 获得之前(上一个)进程结束的状态码 (0 表示成功, 1 表示失败)

举例如下

例如我们有一个文档, test_2.sh

#!/bin/bash

echo “Current process ID is: $$”

sleep 100 &
echo “The most recent process ID is: $!”
echo “The most recent process exit status is: $?”

执行

./test_2.sh

输出的结果:

Current process ID is: 15599
The most recent process ID is: 15600
The most recent process ID exit status is: 0

然后接着执行

ps

输出的结果会是:

  PID   TTY       TIME      CMD
14941   pts/0   00:00:00    bash
15600   pts/0   00:00:00    sleep
15601   pts/0   00:00:00    ps

解释如下

注意: 不同的机器获得进程 ID 可能和上边的举例结果不一样.

当执行 ./test_2.sh 之后, 我们得到了执行这个文件的进程 ID: 15599 , 后台执行 sleep 后, 再执行 $!, 我们可以获得这个后台进程的 ID, 结果为 15600;

由于这个进程是一个 100 秒的后台进程, 在后边的 ps 命令中, 我们很容易的就看到了这个 ID 为 15600 的后台进程.

紧接着我们执行 $?, 注意, 这个获得的进程状态码是上一个的进程结束码, 由于我们上一个命令是 echo, 而echo 是顺利结束命令的, 所以我们获得了状态码 0 , 表示 echo 命令执行成功.

$- 和 $_

$- 是 set 命令的 –h 和 –B 的参数, 表示使用内置的 set 命令扩展解释之后的参数行, 
   具体分别表示为, 记住工作路径, 和允许使用 ! 历史扩展, 详细请参阅 set 命令.

$_ (下划线) 表示的是打印上一个输入参数行, 当这个命令在开头时, 打印输出文档的绝对路径名.

举例如下:

例如我们有一个文档, test_3.sh

#!/bin/bash
echo “Current absolute file path name is: $_”
echo “$-“
echo “Second $_”

let cnt=1
echo “Third $_”
echo “$cnt”
echo “Fourth $_”

执行命令:

./test_3.sh

输出的结果是:

Current absolute file path name is: ./test_3.sh
hB
Second hB
Third cnt=1
1
Fourth 1

解释如下:

由于我们是在当前路径下执行的文档, 那么在文档开始, 所有命令之前 $_ 获得就是文档的绝对路径名称, ./test_3.sh, 这里 . (点号) 表示当前路径.

执行 $- 后, 表示使用 set 的 –h 和 –B 选项, 这时传入的参数是 hB;

第二次执行 $_ 后, 获得上次传入的参数, 表示为 hB;

在第三次执行时, 由于上次对于 let 命令传入的参数是 cnt=1, 那么这时获得的参数是 cnt=1;

第四次执行时, 对于 echo 传入的参数是扩展后的 $cnt, 也就是 1, 那么这时获得参数就是 1.

Source

这是Bash附带的命令,要获取有关它的更多信息,可以输入help source

source: source filename [arguments]
    在当前shell中执行来自一个文件的命令。
    
    在当前shell中读取并执行来自FILENAME的命令。 $PATH中的
    条目被用来寻找包含FILENAME的目录。
    如果提供了任何ARGUMENTS,当FILENAME被执行时,它们将成为位置参数。
    当FILENAME被执行时。
    
    退出状态。
    返回在FILENAME中执行的最后一条命令的状态;如果FILENAME不能被读取,则失败。
    FILENAME不能被读取。

例如:

source ./xxxx.sh $@

代表读取并运行指定./xxxx.sh路径的文件,这里$@代表外部输入的参数列表。

source执行的任何操作都发生在内部并影响当前环境。

image

使用内置的.命令获得相同的结果:

image

if语句

基本上格式:

if [ expression ];
then
statements
fi

其中expression为判断条件,statements为满足条件后执行的语句。

多个条件并列场景:

if [ expression_1 && expression_2 ];
then
statements
fi

多个条件异或场景:

if [ expression_1 || expression_2 ];
then
statements
fi

多个条件组合场景:

if [ expression_1 && expression_2 || expression_3 ];
then
statements
fi

if语句选项常用清单

选项 描述
-a FILE 如果FILE存在则为真。
-b FILE 如果FILE存在且是一个块特殊文件则为真。
-c FILE 如果FILE存在且是一个字特殊文件则为真。
-d FILE 如果FILE存在且是一个目录则为真。
-e FILE 如果FILE存在则为真。
-f FILE 如果FILE存在且是一个普通文件则为真。
-g FILE 如果FILE存在且已经设置了SGID则为真。
-h FILE 如果FILE存在且是一个符号连接则为真。
-k FILE 如果FILE存在且已经设置了粘制位则为真。
-p FILE 如果FILE存在且是一个名字管道(F如果O)则为真。
-r FILE 如果FILE存在且是可读的则为真。
-s FILE 如果FILE存在且大小不为0则为真。
-t FD 如果文件描述符FD打开且指向一个终端则为真。
-u FILE 如果FILE存在且设置了SUID(set user ID)则为真。
-w FILE 如果FILE如果FILE存在且是可写的则为真。
-x FILE 如果FILE存在且是可执行的则为真。
-O FILE 如果FILE存在且属有效用户ID则为真。
-G FILE 如果FILE存在且属有效用户组则为真。
-L FILE 如果FILE存在且是一个符号连接则为真。
-N FILE 如果FILE存在and has been mod如果ied since it was last read则为真。
-S FILE 如果FILE存在且是一个套接字则为真。
FILE1 -nt FILE2 如果 FILE1 has been changed more recently than FILE2, or 如果FILE1 FILE2 does not则为真。exists and
FILE1 -ot FILE2 如果FILE1比FILE2要老,或者FILE2存在且FILE1不存在则为真。
FILE1- ef FILE2 如果FILE1和FILE2指向相同的设备和节点号则为真。
-o OPTIONNAME 如果shell选项“OPTIONNAME”开启则为真。
-z STRING “STRING”的长度为零则为真。
-n STRINGorSTRING “STRING”的长度为非零non-zero则为真。
STRING1 == STRING2 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
STRING1 != STRING2 如果字符串不相等则为真。
STRING1 < STRING2 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
STRING1 > STRING2 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
ARG1 OP ARG2 “OP” is one of-eq,-ne,-lt,-le,-gtor-ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

例如:

if [ ! -d "~/.mono/targets" ]; then
    mkdir -p ~/.mono/targets
fi

判断~/.mono/targets是否存在,如果不存在,那么创建它。

if妙用之判断包是否存在

mono_runtime=$(dpkg -l | grep mono-runtime)
if [ -z "$mono_runtime" ]; then
    cp -r /opt/apps/xxxxxxxxxxxxxxxxxxxxx/files/etc/* /etc
fi

这里通过dpkg -l来查找本地包,筛选mono-runtime,如果结果为空-z,那么执行cp动作。

if妙用之检查安装依赖,缺少就补

# 检查安装依赖,缺少就补
if [ -a '/usr/bin/mono' ]; then
    echo "Mono Devel is Installed"
else
    echo "Start Install Mono Devel"
    sudo apt install mono-devel -y

    if [ -a '/usr/bin/mono' ]; then
        echo "Mono Devel is Installed"
    else
        echo "Mono Devel Install Failed"
    fi
fi

for语句

与其他编程语言一样,bash shell脚本也支持for循环以执行重复性任务。它有助于在字符串中的一系列单词或数组中的元素上迭代一组特定的语句。例如,可以多次运行UNIX命令(或任务),也可以仅使用for循环读取和处理命令列表。

for $variable in $list
do
commands
done
for (( expression1; expression2; expression3 ))
do
commands
done

for循环语句有一些关键点需要记住:

  • bash中for循环的每个块均以do关键字开头,后跟该块中的命令。
  • for循环语句由done关键字关闭。
  • for循环的迭代时间取决于声明的列表变量。
  • 循环将从列表中选择一项,在循环中使用的变量上分配值。
  • 在do和done之间执行命令后,循环返回顶部,并从列表中选择下一项,然后重复整个过程。
  • 列表可以包含数字或字符串等,以空格分隔。

举例

#!/bin/bash
#This is the basic example of 'for loop'.

learn="Start learning from xxxxx.com"

for learn in $learn
do
echo $learn
done

echo "Thank You."

image

遍历

对于array中的每个元素,将执行从“do”到“done”的语句或命令集。对于各个迭代,可以在循环内将每个元素作为i进行访问。请查看下面的示例,演示如何使用for循环遍历数组中的元素。

#!/bin/bash

#Array Declaration
arr=( "Welcome","to","xxxx.com" )

for i in "${arr[@]}"
do
echo $i
done

image

printf打印

printf命令模仿C程序库(library)里的printf()程序。

printf由POSIX标准所定义,因此使用printf的脚本比使用echo移植性好。

printf使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的printf不会像echo自动添加换行符,我们可以手动添加\n

printf  format-string  [arguments...]
  • format-string: 为格式控制字符串
  • arguments: 为参数列表。

例如:

printf "Hello, Shell\n"

image

local局部变量

一般用于shell内局部变量的定义,多使用在函数内部。

输出黑洞

有个看起来很奇怪的的东西叫/dev/null,所有写入它的东西都会消失,读取也读取不到内容,就像个黑洞一样。

1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 接着,标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

在类Unix操作系统中,设备节点并不一定要对应物理设备。没有这种对应关系的设备被称之为伪设备。操作系统运用了它们实现多种多样的功能,/dev/null和/dev/zero就是这样的设备,类似的还有/dev/urandom、/dev/tty等。

先检查下/dev/null和/dev/zero两个文件的属性:

image

大家都知道宇宙中“太阳黑洞”吧,所有的天体(含地球)一旦进入了太阳黑洞都会消失的无影无踪。这里的/dev/null就是Linux系统中的"黑洞"。

在类Unix系统中,/dev/null(空设备文件或黑洞文件)是一个特殊的设备文件,所有写入其中的数据,都会被丢弃的无影无踪,/dev/null通常被用于丢弃不需要的数据输出,或作为用于输入流的空文件。这些操作通常由重定向完成。

使用/dev/null来清空文件:

cat /dev/null > test.sh

image

使用/dev/null将无用的输出流写入到黑洞丢弃:

curl -l https://www.baidu.com 2>/dev/null

将定时任务脚本结尾加上>/dev/null 2>&1

在书写定时任务总,规范的写法就是将所有定时任务脚本结尾加上>/dev/null 2>&1,让所有的输出流(包括错误的和正确的)都定向到空设备丢弃。

和/dev/null类似,/dev/zero也是一个特殊的字符设备文件,当我们使用或读取它的时候,它会提供无限连续不断的空的数据流(特殊的数据格式流)。

流编辑器sed

sed全名为stream editor,流编辑器,用程序的方式来编辑文本,功能相当的强大。是贝尔实验室的Lee E.McMahon在1973年到1974年之间开发完成,目前可以在大多数操作系统中使用,sed的出现作为grep的继任者。与vim等编辑器不同,sed是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。sed基本上就是在玩正则模式匹配,所以,玩sed的人,正则表达式一般都比较强。

sed会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具,换句话说,正则表达式就是记录文本规则的代码。许多程序设计语言都支持利用正则表达式进行字符串操作。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

简单描述一下正则表达式的匹配过程,就是拿正则表达式所表示的字符串去和原文字符串内容去匹配,直到匹配到原文内容字符串中的一个完整子串就表示匹配成功。举个例子,有一行文件内容"thisisbetterdesk",这里用"esk"去匹配,匹配过程是这样的:首先拿e去匹配文件行内容,从this开始,直到better的e,第一个字符匹配成功,接着s去匹配better字符e后边的t字符,没有匹配成功;然后重新拿esk中的e去和better的第二个t去匹配,没有成功,接着原始内容的下一个字符,直到desk中的e字符,逐个匹配s,k字符,到此为止,esk成功匹配,正则表达式匹配完毕,整个过程就是这样,即使再复杂的正则表达式的匹配过程也是按照此过程来进行的。

sed 参数 动作
  • -n:使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来。
  • -e:直接在命令列模式上进行sed的动作编辑;
  • -f:直接将sed的动作写在一个文件内,-f filename则可以运行filename内的sed动作;
  • -r:sed的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
  • -i:直接修改读取的文件内容,而不是输出到终端。

包管理(dpkg)

dpkg,全称Package manager for Debian,是Debian和基于Debian的系统中一个主要的包管理工具,可以用来安装、构建、卸载、管理deb格式的软件包。

列举本地安装(--list)

dpkg --list

或者

dpkg -l

image

搜索已安装软件

dpkg -l $filter

image

指定安装包安装(-i)

dpkg -i xxxxx.deb

卸载已安装的软件(-r)

卸载软件,但是保留配置。

dpkg -r $appId

彻底卸载已安装软件(-P)

彻底卸载软件,包括删除其配置。

dpkg -P $appId

查看软件包内容(-c)

dpkg -c $debFile

查看已安装软件信息(-s)

dpkg -s $appId

image

查看已安装软件位置(-L)

dpkg -L $appId

image

筛选已安装软件(-S)

dpkg -S $filter

快捷方式位置

/usr/share/applications

image

~/.local/share/applications

image

树形列举结构(tree)

sudo apt install tree
tree

image

软件安装(APT)

定义

高级包装工具(Advanced Packaging Tool,简称APT),是一个在Debian和Ubuntu中的Shell前端软件包管理器。在Debian中APT构建在dpkg之上。

执行apt命令需要管理员权限。

其主要由如下三个部分构成:

  • apt-get
  • apt-cache
  • apt-file

公共可选参数:

  • -h,帮助。
  • -y,当安装过程提示选择全部为yes
  • -q,不显示安装的过程,也就是静默安装。

列出可更新名单(update)

sudo apt update

image

下载软件安装包(download)

sudo apt download $packageName

例如:

sudo apt download mono-devel

环境变量

命令变量(PATH)

当我们执行命令的时候,会发现,在任何目录都可以执行ls,但是当前目录并没有它,执行命令时,是从PATH环境变量里面去找的。

PATH是一个特殊的环境变量,记录了Linux中所有命令的变量。

我们可以打印它,看看。

echo $PATH

image

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

通过export可以定义一个变量,这个变量指定为环境变量。

export PATH='/usr/bin'

image

我们还可以添加自己的路径来拼接之前的值,得到一个新的PATH环境变量。

export PATH='/usr/bin':$PATH

由于执行命令的时候,是从PATH的值的从左到右去查找的,我们将自己定义的目录放在最左侧,这样就实现自定义了,也不怕系统的覆盖。

参考

posted @ 2022-07-22 19:53  TaylorShi  阅读(106)  评论(0编辑  收藏  举报