安全重启:
按住​​​alt+<PrtSc>​​,然后依次按下reisub即可安全重启。

语法

条件判断

if elif else

#!/bin/bash
if [ condition1 ]; then
# Do something
elif [ condition2 ]; then
# Do something
else
# Do something
fi

判断某环境变量是否存在


上面的文章好像写反了
例子:判断环境变量DISPLAY是否存在(若不存在说明没有提供显示设备)

if [ $DISPLAY ]; then
# DISPLAY存在
else
# DISPLAY不存在
fi

或者

if [ ! $DISPLAY ]; then

表示​​如果$DISPLAY不存在​

字符串比较

if [ "2333" == "2333" ]; then
echo 2333
fi

大小判断

代码

含义

例子

-eq

=

​[ $1 -eq 2 ]​

-ne

!=

​[ $1 -ne 2 ]​

-le

<=

​[ $1 -le 2 ]​

-lt

<

​[ $1 -lt 2 ]​

-ge

>=

​[ $1 -ge 2 ]​

-gt

>

​[ $1 -gt 2 ]​

-a

&&

​[ $1 -gt 0 -a $1 -lt 10 ]​

-o

||

​[ $1 -lt 0 -o $1 -gt 10 ]​

-z

为空

​[ -z "$1" ]​

-n

非空

​[ -n "$1" ]​

其中​​-eq​​​和​​-ne​​​可以分别用​​=​​​和​​!=​​替换。

如果想像C语言那样进行条件判断,可以使用​​[[]]​​​。
例如下面这两句都表示​​​如果参数的个数等于0或者大于2​

if [[ $# = 0 || $# > 2 ]]; then
if [ $# = 0 -o $# -gt 2 ]; then

判断文件类型

来源:​​https://jingyan.baidu.com/article/95c9d20d5ac536ec4e7561ad.html​

#!/bin/bash
if [ -z $1 ]; then #如果没有输入参数,也就是第一个参数的字符串长度为0
: #空语句
else
if [ -e $1 ]; then #如果文件存在的话
if [ -f $1 ]; then #如果文件是个普通文件?
echo $1" is a text file."
elif [ -d $1 ]; then #如果文件是个目录文件?
echo $1" is a directory."
elif [ -c $1 ]; then #如果文件是个字符设备?
echo $1" is a char device."
elif [ -b $1 ]; then #如果文件是个块设备?
echo $1" is a block device."
else #否则
echo $1" is unknow file."
fi
fi

函数

参考:​​https://www.runoob.com/linux/linux-shell-func.html​

定义

function FunctionName {
do_some_thing_here
return Interger
}

其中​​function​​​可以省略,也可以不return。
参数用法与脚本类似。(​​​$#​​​表个数,​​$1, $9, ${10}​​表具体参数)

使用

FunctionName par1 par2 par3

循环

while

参考:​​https://wiki.jikexueyuan.com/project/shell-tutorial/shell-while-loop.html​

while Command
do
Statement(s) to be executed if Command is true
done

或者

while [ Condition ]; do
Statement(s) to be executed if Condition is true
done

也可以对命令返回值取反,比如

while ! Command; do
Statement(s) to be executed if Command is false
done

for

for ((i=0; i<10; ++i))  
do
echo $i
done

注意是双括号。
还有其他用法。看参考链接

按应用

crontab

启动

service cron

按功能

查看磁盘占用情况

df

以默认应用打开文件

xdg-open

按照十六进制查看文件

hexdump -C FileName >

查看命令执行时间

time

去重


例如txt中有

jason
jason
jason
fffff
jason

执行以下命令

sort

输出

fffff
jason

输出到文件

sort

查看8进制文件权限

参考:http://novell.me/Linux/201410/stat-get-file-permission-with-octal-numb.html

stat

监视某命令的执行结果

watch

Interval: 执行间隔,以秒为单位

查看group里的用户


grep

加入某用户到某group

sudo usermod

获取精确到纳秒的当前时间

date

时间戳

date

把stderr和stdout都重定向到一个文件

./shell.sh > shell.log 2>&1

以另一用户的身份执行命令

sudo

查看端口占用情况

参考:​​https://jingyan.baidu.com/article/656db9183861cde381249c87.html​

lsof

查看8236端口的占用情况。无输出表示没有被占用。

查看发行版信息

lsb_release -a

我的输出:

No LSB modules are available.
Distributor ID: Deepin
Description: Deepin 15.11
Release: 15.11
Codename: stable

清空命令历史记录

参考:​​https://zhidao.baidu.com/question/1495253179240949419.html​

history

创建临时文件

mktemp

便会在​​/tmp​​​下创建一个文件并把文件名输出到stdout。
示例:

echo Please input:
read -s input
tmp=$(mktemp)
echo $input > $tmp
cat $tmp
rm $tmp

使用ImageMagick将多个jpg转换为A4大小的PDF

convert a.png b.png -compress jpeg -resize 1240x1753 \
-extent 1240x1753 -gravity center \

如果不想限定高度,可以

convert a.png b.png -compress jpeg -resize 1240 \
-extent 1240 -gravity center \

按命令

du

  • 查看当前目录下所有文件夹的大小
du

​-h​​​是​​--human-readable​​的缩写。

  • 查看当前目录的大小
du

​-s​​​是​​--summarize​​的缩写。

参考:​​https://jingyan.baidu.com/article/ca2d939d7867e0eb6c31ce80.html​

pidof 进程名

返回某进程名对应的pid
例子:
杀掉所有名字为ssh-agent的进程

kill $(pidof ssh-agent)

ip

查看本机ip地址

ip

dpkg

dpkg --list

显示当前已经安装的软件

grep

查找当前目录下有某字符串的文件:

grep

-r:递归查找
-n:显示行号
-i:忽略大小写
*:当前目录所有文件。可以换成某个文件名。

find

find [目录] [查找规则] [查找完后执行的action]
查找规则:
-name 根据文件名查找(精确查找)
-iname 不区分大小写

例子

  • 在当前目录下找到所有名字为input.txt的文件并将其放入回收站
find . -name "input.txt" -exec trash-put {} \;

其中{}替代查找到的文件,”;”是-exec的结束符

  • 在当前目录下不区分大小写地找以Edition.pdf结尾的文件
find
  • 在根目录下查找名字为gsettings的文件或文件夹,但是忽略目录/mnt和/media

这些都不对,不知道为什么

sudo find / -name “gsettings” ! -path “/mnt/*” ! -path “/media/*”
sudo find / -path /media -path /mnt -prune -o -name gsettings
sudo find . -name media -name mnt -prune -o -name gsettings
sudo find . -path ./media -path ./mnt -prune -o -name gsettings
sudo find . -name b !

locate

locate

查找文件(文件夹)

sed

保护链接

​sed -i​​​会破坏符号链接和硬链接。
​​​sed --follow-symlinks -i​​​保护软链接,但是不保护硬链接。
​​​sed -i -c​​会保护符号链接和硬链接(但是我的sed没有这个选项,可能只有新版本才有)。

把文件中的CRLF替换成LF

sed -i 's/\r//g'

-i指直接修改文件,而不是把修改结果输出到stdout。
模式可以分解为

s/  \r  /   /  g

其中s是指替换,g是全局替换,/是分隔符。总体的意思是把\r替换成空字符串,也就是删掉\r(也就是CR)。

把文件中的LF替换成CRLF

sed -i 's/$/\r/g'

​$​​的意思是每行的末尾。在每行的末尾把空字符串替换成\r(CR),也就是插入\r(CR)。在linux中换行是LF,所以相当于在LF前面插入一个CR,变成CRLF。

保留每行的最后一个单词

sed -i 's/.* //g'

正则表达式里,点​​.​​​几乎可以匹配任何字符,所以​​.*​​​会尽量匹配尽量长的字符串。​​.*空格​​​表示最长的以空格结尾的字符串。​​s/.* //g​​表示把每行的最长的以空格结尾的字符串删掉。所以每行只留下了最后一个单词了。

也可从stdin读取。
例:获取git版本号

git --version | sed 's/.* //g'

在每个单词前插入

sed 's/\b\S*\b/test&/g'

​\b​​​: 单词边界
​​​&​​: 前面匹配的字符串

其他

​linux中怎么用shell显示文件某一行或几行内容​