温故知新,Linux命令知多少,学习Bash Shell
缩写大全
pwd
:print work directory
打印当前目录 显示出当前工作目录的绝对路径ps
:process status
(进程状态,类似于windows的任务管理器)- 常用参数:-auxf
- ps -auxf 显示进程状态
df
:disk free
其功能是显示磁盘可用空间数目信息及空间结点信息。换句话说,就是报告在任何安装的设备或目录中,还剩多少自由的空间。du
:Disk usage
rpm
:即RedHat Package Management
,是RedHat的发明之一rmdir
:Remove Directory
(删除目录)rm
:Remove
(删除目录或文件)cat
:concatenate
连锁- cat file1file2>>file3 把文件1和文件2的内容联合起来放到file3中
insmod
:install module
,载入模块ln -s
:link -soft
创建一个软链接,相当于创建一个快捷方式mkdir
:Make Directory
(创建目录)touch
:touch
man
:Manual
su
:Swith user
(切换用户)cd
:Change directory
ls
:List files
mkfs
:Make file system
fsck
:File 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"tar
:Tape archive
(磁带档案)ldd
:List dynamic dependencies
insmod
:Install module
rmmod
:Remove module
lsmod
:List 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 filedpkg
:Debian package manager
apt
:Advanced package tool
(Debian或基于Debian的发行版中提供)
目录操作
显示文件(ls)
ls
:表示列出当前目录下的文件内容,可以通过ls --help
查看更多使用。
ls -a
:表示全部文件包括隐藏文件。ls -l
:列出全部文件,显示文件属性权限,修改时间。
当使用ls -l
的时候,在结果中。
第一列,是文件类型+文件权限。第1位表示文档类型,d
表示目录,-
表示文件,l
表示链接文件,d表示可随机存取的设备,如U盘等,c表示一次性读取设备,如鼠标、键盘等。后9位,依次对应三种身份所拥有的权限,身份顺序为:owner、group、others,权限顺序为:readable、writable、excutable。如:-r-xr-x---的含义为当前文档是一个文件,拥有者可读、可执行,同一个群组下的用户,可读、可执行,其他人没有任何权限。
第二列,表示链接数,表示有多少个文件链接到inode号码。
第三列表示拥有者。
第四列表示所属群组。
第五列表示文档容量大小,单位字节。
第六列表示文档最后修改时间,注意不是文档的创建时间哦。
第七列表示文档名称。以点(.)开头的是隐藏文档。
这里特别注意,以.
开头的是隐藏目录或者隐藏文件。
切换目录(cd)
cd
表示切换目录。
cd ..
切换到上一层目录。cd /
切换到根目录。cd /home/taylorshi
切到指定目录。cd ~
切换到当前用户的根目录。
显示目录(pwd)
pwd
可以显示当前目录绝对路径
创建目录(mkdir)
mkdir
代表创建新的文件夹。
mkdir -p
表示创建子目录。
删除目录(rm)
rm
代表删除目录或文件。
rm file
删除指定文件。rm -r
递归删除目录及其内容。rm -f
表示强制删除,不提示确认。rm -i
表示每次删除前提示确认。
创建文件(touch)
touch
可创建一个空文件。
touch 1.bat
创建一个名为1.bat的空文件。
创建链接(ln)
ln
创建快捷方式
ln -s $targetFile $targetLink
给目标文件创建目标快捷方式。
编辑文件(vi/vim)
vi
或者 vim
可以编辑一个文件。
vi file
可以编辑指定文件。vim file
可以编辑指定文件。
拷贝文件(cp)
cp
代表拷贝文件或者目录
cp source target
拷贝source文件到targetcp -p
连同文件属性一起复制过去。cp -r
递归复制目录及其子目录内的所有内容。
移动文件(mv)
mv
代表移动文件或目录
mv -f
强制移动。mv sourceDir targetDir
将所有源文件移动至指定的目录中。
文件属性(rwx)
Linux中文件都有属性,通过rwx
三个参数表示,可通过ls -l
查看到,如果没有权限会用-
替代。
其中:
r
:表示可读(read) 数字表示4
w
:代表可写(write) 数字表示2
x
:代表可执行(execute) 数字表示1
全部的属性权限就是777,对应-rwxrwxrwx
我们看到,通过ls -l
看到的权限是10位,其中第一位代表文件类型,如果是文件,那就是-
,如果是目录会显示d
,如果是链接,显示l
接下来是9位权限,每3位为一组,依次代表了owner
、group
、others
三个组,以-rw-r--r--
为例,含义为:
针对这个文件,其拥有者可读可写,同一群组用户可读,其他人可读。
再举个例子,以-r-xr-x---
为例,含义为:
针对这个文件,其拥有者可读可执行,同一个群组用户可读可执行,其他人无权限。
再举个例子,以drwxr-xr-x
为例,含义为:
针对这个目录,其拥有者可读可写可执行,同一个群组用户可读可执行,其他人可读可执行。
控制权限(chmod)
chmod
(Change Mode)可以修改针对文件或者目录的控制权限。
只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式),符号模式指定文件的权限。
chmod 权限 file
给指定文件修改权限。chmod +
增加权限。chmod -
取消权限。
# | 权限 | 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
。
查看文件(cat)
cat
表示从第一行开始读显示文件内容。
cat file
显示全部文本内容。cat -n
表示显示文件的行数。
tac
表示从最后一行开始显示。
more
表示查看文件内容。
在看文件页面,我们可以通过B
键进行切换上一页,空格
是下一页。
less
:表示一页一页的查询内容
- 空格:翻页
- 键盘 ↑:表示上一页
- 键盘 ↓:表示下一页
/XXX:表示查看XXX
- n:往下查找XXX
- q:退出less
head -n
:表示显示前几行,n表示数字输入只显示前几行
tail -n
:表示显示后几行,n表示数字输入只显示最后几行
查找文件(find)
find
表示查找文件内容。
find -name
表示根据文件名进行查找。find -tpye
表示根据文件类型查找。
例如:
find projects -name '*.bat'
这个-type
后面跟的类型参数也是有约定的,不能随便:
d
:目录c
:字型装置文件b
:区块装置文件p
:具名贮列f
:一般文件l
:符号连结s
:socket
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
查找字符串(grep)
grep
用于查找文件中字符串。
grep $filter $file
从file中按filter筛选内容。grep -i $filter $file
从file中按filter筛选内容,不缺乏大小写。grep -c $filter $file
匹配的函数。
配合其他语句
find projects -name '*.bat' | grep "1"
解压文件(tar)
tar
解压命令。
-
-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 $targetFile
将targetFile
打包成target.tar.gz
文件。
磁盘使用(df)
df
(disk free)用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。
df -a
: --all 包含所有的具有0 Blocks的文件系统。df --total
显示所有的信息。
第一列指定文件系统的名称,第二列指定一个特定的文件系统1K-块1K是1024字节为单位的总内存。已用和可用列正在使用中,分别指定的内存量。
使用列指定使用的内存的百分比,而最后一栏"安装在"指定的文件系统的挂载点。
系统占用(top)
top
实时显示进程的动态。
-
第一行表示:系统时间,用户连接数,15分钟的平均负载
-
第二行表示:进程信息
-
第三行表示:cpu信息
-
第四行表示:内存信息
-
top -p $processId
查看指定processId进程的占用情况。
系统信息(arch)
显示架构信息
arch
或者通过uname也可以查看
uname -m
显示内核版本信息
uname -r
显示CPU信息
cat /proc/cpuinfo
显示内核信息
cat /proc/version
显示系统时间
date
端口信息(netstat)
sudo apt install net-tools
netstat
查看端口信息。
netstat
查看全部端口信息
netstat -a
进程信息(ps)
ps
查看进程信息
查看所有进程
ps -e
查看所有进程,包括UID
ps -ef
强制干掉进程
kill -9 $pid
$* 和 $@
在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
执行的任何操作都发生在内部并影响当前环境。
使用内置的.
命令获得相同的结果:
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 STRING orSTRING |
“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 ,-gt or-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."
遍历
对于array中的每个元素,将执行从“do”到“done”的语句或命令集。对于各个迭代,可以在循环内将每个元素作为i进行访问。请查看下面的示例,演示如何使用for循环遍历数组中的元素。
#!/bin/bash
#Array Declaration
arr=( "Welcome","to","xxxx.com" )
for i in "${arr[@]}"
do
echo $i
done
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"
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两个文件的属性:
大家都知道宇宙中“太阳黑洞”吧,所有的天体(含地球)一旦进入了太阳黑洞都会消失的无影无踪。这里的/dev/null就是Linux系统中的"黑洞"。
在类Unix系统中,/dev/null(空设备文件或黑洞文件)是一个特殊的设备文件,所有写入其中的数据,都会被丢弃的无影无踪,/dev/null通常被用于丢弃不需要的数据输出,或作为用于输入流的空文件。这些操作通常由重定向完成。
使用/dev/null
来清空文件:
cat /dev/null > test.sh
使用/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
搜索已安装软件
dpkg -l $filter
指定安装包安装(-i)
dpkg -i xxxxx.deb
卸载已安装的软件(-r)
卸载软件,但是保留配置。
dpkg -r $appId
彻底卸载已安装软件(-P)
彻底卸载软件,包括删除其配置。
dpkg -P $appId
查看软件包内容(-c)
dpkg -c $debFile
查看已安装软件信息(-s)
dpkg -s $appId
查看已安装软件位置(-L)
dpkg -L $appId
筛选已安装软件(-S)
dpkg -S $filter
快捷方式位置
/usr/share/applications
~/.local/share/applications
树形列举结构(tree)
sudo apt install tree
tree
软件安装(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
下载软件安装包(download)
sudo apt download $packageName
例如:
sudo apt download mono-devel
环境变量
命令变量(PATH)
当我们执行命令的时候,会发现,在任何目录都可以执行ls
,但是当前目录并没有它,执行命令时,是从PATH环境变量里面去找的。
PATH是一个特殊的环境变量,记录了Linux中所有命令的变量。
我们可以打印它,看看。
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
通过export
可以定义一个变量,这个变量指定为环境变量。
export PATH='/usr/bin'
我们还可以添加自己的路径来拼接之前的值,得到一个新的PATH环境变量。
export PATH='/usr/bin':$PATH
由于执行命令的时候,是从PATH的值的从左到右去查找的,我们将自己定义的目录放在最左侧,这样就实现自定义了,也不怕系统的覆盖。
参考
- Linux---linux常用命令
- Bash Shell $*, $@, $#, $$, $!, $?, $- 和 $_
- 使用 source 命令将函数和变量导入 Bash
- Linux chmod命令
- Linux ls命令
- Linux find命令
- Linux which命令
- Linux tar命令
- Ubuntu快捷方式存放的位置
- Linux 常用命令全拼
- Ubuntu系统dpkg命令使用详解
- Linux常用命令集合
- linux杀死进程的五种方法
- Linux grep命令
- Shell printf 命令
- shell local命令
- linux shell if语句使用方法
- /dev/null 和 /dev/zero的区别
- Shell脚本———— /dev/null 2>&1详解
- Linux中/dev/null和/dev/zero两个文件的作用和区别
- sed -i命令怎么使用
- find与rm实现查找并删除目录或文件
- linux shell:find命令批量删除文件夹或文件夹
- Linux apt命令
- Linux 命令学习之dpkg命令详解
- Linux里面export PATH作用是什么?
- export PATH = something:$ PATH是什么意思?