(windows10) ubuntu config --default-user root 指定子系统的登录账号
(windows10) wsl 进入子系统
命令&权限
- 快捷键
按键 | 行动 |
---|---|
Ctrl-a | 移动光标到行首。 |
Ctrl-e | 移动光标到行尾。 |
Ctrl-k | 剪切从光标位置到行尾的文本。 |
Ctrl-u | 剪切从光标位置到行首的文本。 |
Ctrl-y | 把剪切环中的文本粘贴到光标位置。 |
Ctrl-l | 清空屏幕,移动光标到左上角。clear 命令完成同样的工作。 |
Alt-f | 光标前移一个字。 |
Alt-b | 光标后移一个字。 |
Alt-l | 把从光标位置到字尾的字符转换成小写字母。 |
Alt-u | 把从光标位置到字尾的字符转换成大写字母。 |
- 通配符
接受文件名作为参数的命令,支持下列通配符
字符类 | 意义 |
---|---|
* | 匹配任意多个字符(包括零个或一个) |
? | 匹配任意一个字符(不包括零个) |
[characters] | 匹配任意一个属于字符集中的字符 |
[!characters] | 匹配任意一个不是字符集中的字符 |
[:lower:] | 匹配任意一个小写字母 |
[:upper] | 匹配任意一个大写字母 |
---- | ---- |
* | 所有文件 |
g* | 文件名以“g”开头的文件 |
b*.txt | 以”b” 开头,中间有零个或任意多个字符,并以”.txt” 结尾的文件 |
Data??? | 以“Data”开头,其后紧接着 3 个字符的文件 |
[abc]* | 文件名以”a”,”b”, 或”c” 开头的文件 |
B.[0-9][0-9][0-9] | 以”B.” 开头,并紧接着 3 个数字的文件 |
[[:upper:]]* | 以大写字母开头的文件 |
[![:digit:]]* | 不以数字开头的文件 |
*[[:lower:]123] | 文件名以小写字母结尾,或以“1”,“2”,或“3”结尾的文件 |
创建软连接
ln -s src link
当源文件被删除时,软链接失效,而硬链接还可以继续用来访问源文件。去掉[-s] 参数可创建硬链接。查看命令类型
type ls
命令有四种类型:
1. 是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样。属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++ 语言写成的程序, 也可以是由脚本语言写成的程序,比如说 shell,perl,python,ruby,等等。
2. 是一个内建于 shell 自身的命令。bash 支持若干命令,内部叫做 shell 内部命令(builtins)。例如,cd 命令,就是一个 shell 内部命令。
3. 是一个 shell 函数。这些是小规模的 shell 脚本,它们混合到环境变量中。在后续的章节里,我们将讨论配置环境变量以及书写 shell 函数。但是现在,仅仅意识到它们的存在就可以了。
4. 是一个命令别名。我们可以定义自己的命令,建立在其它命令之上。
别名命令
alias m='mkdir m' 创建
unalias m 删除重定向
ls -al aa 1>>ls-output.txt 2>&1
ls -al aa &>>ls-output.txt(等价)
将标准输入重定向至文件,标准错误重定向至标准输出(即文件)
2> /dev/null 隐藏标准错误显示文件
tail -f /var/log/messages 实时显示最后10行,这个文件是记录系统的一举一动历史记录
history | grep mv
!88 历史记录展开,再次键入该条历史记录文件类型
属性 | 文件类型 |
---|---|
- | 一个普通文件 |
d | 一个目录 |
l | 一个符号链接。注意对于符号链接文件,剩余的文件属性总是”rwxrwxrwx”,而且都是虚拟值。真正的文件属性是指符号链接所指向的文件的属性。 |
c | 一个字符设备文件。这种文件类型是指按照字节流,来处理数据的设备。比如说终端机,或者调制解调器 |
b | 一个块设备文件。这种文件类型是指按照数据块,来处理数据的设备,例如一个硬盘,或者 CD-ROM 盘。 |
文件权限
chmod u+x,go=rw 1.txt 给文件拥有者执行权限并给组和其他人读和执行的
权限。多种设定可以用逗号分开。
chown [owner][:[group]] 1.txt 更改文件或目录的所有者和用户组添加用户
adduser unual 创建用户
passwd unual 修改用户的密码
进程
- 查看进程快照信息
ps aux
USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND |
---|---|---|---|---|---|---|---|---|---|---|
root | 1 | 0.0 | 0.0 | 8324 | 152 | ? | Ss | 21:38 | 0:00 | /init |
root | 3 | 0.0 | 0.0 | 8328 | 156 | tty1 | Ss | 21:38 | 0:00 | /init |
unual | 4 | 0.0 | 0.0 | 16892 | 3428 | tty1 | S | 21:38 | 0:00 | -bash |
unual | 21 | 0.0 | 0.0 | 17380 | 1920 | tty1 | R | 21:43 | 0:00 | ps aux |
字段 | 含义 |
---|---|
USER | 用户 ID. 进程的所有者。 |
%CPU | 以百分比表示的 CPU 使用率 |
%MEM | 以百分比表示的内存使用率 |
VSZ | 虚拟内存大小 |
RSS | 进程占用的物理内存的大小,以千字节为单位。 |
START | 进程运行的起始时间。若超过 24 小时,则用天表示。 |
STAT字段 | 含义 |
---|---|
R | 运行。这意味着,进程正在运行或准备运行。 |
S | 正在睡眠。进程没有运行,而是,正在等待一个事件,比如说,一个按键或者网络数据包。 |
D | 不可中断睡眠。进程正在等待 I/O,比方说,一个磁盘驱动器的 I/O。 |
T | 已停止. 已经指示进程停止运行。稍后介绍更多。 |
Z | 一个死进程或“僵尸”进程。这是一个已经终止的子进程,但是它的父进程还没有清空它。(父进程没有把子进程从进程表中删除) |
< | 一个高优先级进程。这可能会授予一个进程更多重要的资源,给它更多的 CPU 时间。进程的这种属性叫做 niceness。具有高优先级的进程据说是不好的(less nice),因为它占用了比较多的 CPU 时间,这样就给其它进程留下很少时间。 |
N | 低优先级进程。一个低优先级进程(一个“好”进程)只有当其它高优先级进程执行之后,才会得到处理器时间。 |
- 查看计算机运行状态和进程
top
top - 21:56:19 up 17 min, 0 users, load average: 0.52, 0.58, 0.59
Tasks: 4 total, 1 running, 3 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 1.1 sy, 0.0 ni, 98.5 id, 0.0 wa, 0.2 hi, 0.0 si, 0.0 st
KiB Mem : 8295652 total, 5215984 free, 2850316 used, 229352 buff/cache
KiB Swap: 25165824 total, 25150436 free, 15388 used. 5311604 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22 unual 20 0 17620 2036 1504 R 0.3 0.0 0:00.07 top
1 root 20 0 8324 152 128 S 0.0 0.0 0:00.06 init
3 root 20 0 8328 156 120 S 0.0 0.0 0:00.00 init
4 unual 20 0 16892 3428 3324 S 0.0 0.0 0:00.06 bash
行号 | 字段 | 含义 |
---|---|---|
1 | top | 程序名。 |
21:56:19 | 当前时间。 | |
up 17min | 这是正常运行时间。它是计算机从上次启动到现在所运行的时间。在这个例子里,系统已经运行了17分钟。 | |
load average:0.52, 0.58, 0.59 | 加载平均值是指,等待运行的进程数目,也就是说,处于运行状态的进程个数,这些进程共享 CPU。展示了三个数值,每个数值对应不同的时间周期。第一个是前 60 秒的平均值,下一个是前 5 分钟的平均值,最后一个是前 15 分钟的平均值。若平均值低于 1.0,则指示计算机工作不忙碌。 | |
2 | Tasks: | 总结了进程数目和各种进程状态。 |
3 | Cpu(s): | 这一行描述了 CPU 正在执行的进程的特性。 |
0.2us | 0.2% of the CPU is being used for user processes. 这意味着进程在内核之外。 | |
1.1sy | 1.1% 的 CPU 时间被用于系统(内核)进程。 | |
0.0ni | 0.0% 的 CPU 时间被用于”nice”(低优先级)进程。 | |
98.5id | 98.5% 的 CPU 时间是空闲的。 | |
0.0wa | 0.0% 的 CPU 时间来等待 I/O。 | |
4 | Mem: | 展示物理内存的使用情况。 |
5 | Swap: | 展示交换分区(虚拟内存)的使用情况。 |
后台任务
xlogo &以列出从终端中启动的任务
jobs
[1]+ Running xlogo &将后台任务返回前台
fg %1暂停任务
ctrl + z将任务移到后台
bg %1通过 kill 命令给进程发送信号
kill [-signal] PID
编号 | 名字 | 含义 |
---|---|---|
1 | HUP | 挂起。这是美好往昔的痕迹,那时候终端机通过电话线和调制解调器连接到远端的计算机。这个信号被用来告诉程序,控制的终端机已经“挂起”。通过关闭一个终端会话,可以说明这个信号的作用。发送这个信号到终端机上的前台程序,程序会终止。许多守护进程也使用这个信号,来重新初始化。这意味着,当发送这个信号到一个守护进程后,这个进程会重新启动,并且重新读取它的配置文件。Apache 网络服务器守护进程就是一个例子。 |
2 | INT | 中断。实现和 Ctrl-c 一样的功能,由终端发送。通常,它会终止一个程序。 |
9 | KILL | 杀死。这个信号很特别。鉴于进程可能会选择不同的方式,来处理发送给它的信号,其中也包含忽略信号,这样呢,从不发送 Kill 信号到目标进程。而是内核立即终止这个进程。当一个进程以这种方式终止的时候,它没有机会去做些“清理”工作,或者是保存劳动成果。因为这个原因,把 KILL 信号看作杀手锏,当其它终止信号失败后,再使用它。 |
15 | TERM | 终止。这是 kill 命令发送的默认信号。如果程序仍然“活着”,可以接受信号,那么这个程序将终止。 |
18 | CONT | 继续。在停止一段时间后,进程恢复运行。 |
19 | STOP | 停止。这个信号导致进程停止运行,而没有终止。像KILL 信号,它不被发送到目标进程,因此它不能被忽略。 |
eg: kill -9 108
[1] Killed top
树型结构的进程列表
pstree系统资源使用快照
vmstat
输出一个系统资源使用快照,包括内存,交换分区和磁盘I/O。为了看到连续的显示结果,则在命令名后加上延时的时间(以秒为单位)。例如,“vmstat 5”。终止输出,按下Ctrl-c 组合键。
SHELL
- shell环境变量
登录 shell 会话会提示用户输入用户名和密码;例如,我们启动一个虚拟控制台会话。当我们在 GUI 模式下运行终端会话时,非登录 shell 会话会出现。
类别 | 文件 | 内容 |
---|---|---|
登录shell | /etc/profile | 应用于所有用户的全局配置脚本。 |
˜/.bash_profile | 用户私人的启动文件。可以用来扩展或重写全局配置脚本中的设置。 | |
˜/.bash_login | 如果文件 ˜/.bash profile 没有找到,bash 会尝试读取这个脚本。 | |
˜/.profile | 如果文件 ˜/.bash profile 或文件 ˜/.bash login 都没有找到,bash 会试图读取这个文件。这是基于 Debian 发行版的默认设置,比方说 Ubuntu。 | |
非登录shell | /etc/bash.bashrc | 应用于所有用户的全局配置文件。 |
˜/.bashrc | 用户私有的启动文件。可以用来扩展或重写全局配置脚本中的设置。 |
-
登录shell:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) ->( ~/.bashrc -> /etc/bashrc) -> ~/.bash_logout
- profile(由Bourne Shell和Korn Shell使用)和.bash_login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell
- bash_profile中一般会执行.bashrc
交互式非登陆shell: ~/.bashrc -> /etc/bashrc
在普通用户看来,文件 ∼/.bashrc 可能是最重要的启动文件,因为它几乎总是被读取。
VI编辑器
按键 | 移动光标 |
---|---|
l or 右箭头 | 向右移动一个字符 |
h or 左箭头 | 向左移动一个字符 |
j or 下箭头 | 向下移动一行 |
k or 上箭头 | 向上移动一行 |
0 | (零按键) 移动到当前行的行首。 |
ˆ | 移动到当前行的第一个非空字符。 |
$ | 移动到当前行的末尾。 |
w | 移动到下一个单词或标点符号的开头。 |
W | 移动到下一个单词的开头,忽略标点符号。 |
b | 移动到上一个单词或标点符号的开头。 |
B | 移动到上一个单词的开头,忽略标点符号。 |
Ctrl-f or Page Down | 向下翻一页 |
Ctrl-b or Page Up | 向上翻一页 |
nG | 移动到第 n行。例如,1G 移动到文件的第一行。 |
G | 移动到文件末尾。 |
按键 | 效果 |
---|---|
a | 当前光标后插入 |
A | 当前行末尾插入 |
o | 当前行的下方打开一行,进入编辑模式 |
O | 当前行的上方打开一行,进入编辑模式 |
- | - |
x | 删除当前字符 |
3x | 删除当前字符及其后的两个字符。 |
dd | 删除当前行。 |
5dd | 删除当前行及随后的四行文本。 |
dW | 删除从光标位置开始到下一个单词的开头。 |
d$ | 删除从光标位置开始到当前行的行尾。 |
d0 | 删除从光标位置开始到当前行的行首。 |
dˆ | 删除从光标位置开始到文本行的第一个非空字符。 |
dG | 删除从当前行到文件的末尾。 |
d20G | 删除从当前行到文件的第 20 行。 |
- | - |
yy | 复制当前行。 |
5yy | 复制当前行及随后的四行文本。 |
yW | 复制从当前光标位置到下一个单词的开头。 |
y$ | 复制从当前光标位置到当前行的末尾。 |
y0 | 复制从当前光标位置到行首。 |
yˆ | 复制从当前光标位置到文本行的第一个非空字符。 |
yG | 复制从当前行到文件末尾。 |
y20G | 复制从当前行到文件的第 20 行。 |
p | 在下方新开一行,粘贴复制内容 |
P | 在上方新开一行,粘贴复制内容 |
J | 将下一行拼接到当前行末尾 |
u | 撤销之前的修改 |
fx | 移动光标到当前行下一个x的字符上 |
- | - |
/word | 查找word,n查找下一个 |
- | - |
:%s/Line/line/gc | |
: | 冒号字符运行一个 ex 命令。 |
% | 指定要操作的行数。% 是一个快捷方式,表示从一行到最后一行。另外,操作范围也可以用 1,5 来代替(因为我们的文件只有 5 行文本),或者用 1,$ 来代替,意是“从第一行到文件的最后一行。”如果省略了文本行的范围,那么操作只对当前行生效。 |
s | 指定操作。在这种情况下是,替换(查找与替代)。 |
/Line/line | 查找类型与替代文本。 |
g | 这是“全局”的意思,意味着对文本行中所有匹配的字符串执行查找和替换操作。如果省略 g,则只替换每个文本行中第一个匹配的字符串。 |
c | 需要用户确认每一个替换 |
:r file1.txt | 复制整个file1.txt到当前文件 |
vi file1.txt file2.txt
可以同时编辑两个文件,通过:n/:N切换显示文件
- 命令提示符
PS1 环境变量定义了命令提示符的格式,默认为[\u@\h \W]$
符号 | 显示值 |
---|---|
\a | 以 ASCII 格式编码的铃声. 当遇到这个转义序列时,计算机会发出嗡嗡的响声。 |
\d | 以日,月,天格式来表示当前日期。例如,“Mon May 26.” |
\h | 本地机的主机名,但不带末尾的域名。 |
\H | 完整的主机名。 |
\j | 运行在当前 shell 会话中的工作数。 |
\l | 当前终端设备名。 |
\n | 一个换行符。 |
\r | 一个回车符。 |
\s | shell 程序名。 |
\t | 以 24 小时制,hours:minutes:seconds 的格式表示当前时间. |
\T | 以 12 小时制表示当前时间。 |
@ | 以 12 小时制,AM/PM 格式来表示当前时间。 |
\A | 以 24 小时制,hours:minutes 格式表示当前时间。 |
\u | 当前用户名。 |
\v | shell 程序的版本号。 |
\V | Version and release numbers of the shell. |
\w | 当前工作目录名。 |
\W | 当前工作目录名的最后部分。 |
! | 当前命令的历史号。 |
# | 当前 shell 会话中的命令数。 |
$ | 这会显示一个”$” 字符,除非你拥有超级用户权限。在那种情况下,它会显示一个”#” 字符。 |
[ | 标志着一系列一个或多个非打印字符的开始。这被用来嵌入非打印的控制字符,这些字符以某种方式来操作终端仿真器,比方说移动光标或者是更改文本颜色。 |
] | 标志着非打印字符序列结束。 |
- 包管理工具
发行版 | 底层工具 | 上层工具 |
---|---|---|
Debian-Style | dpkg | apt-get, aptitude |
Fedora, Red Hat Enterprise Linux, CentOS | rpm | yum |
风格 | 命令 | 含义 |
---|---|---|
Debian | apt-get update; apt-get install package_name | 安装 |
Debian | dpkg --install package_file | 安装.deb |
Debian | apt-get remove package_name | 卸载 |
Debian | apt-get update; apt-get upgrade | 更新全部软件 |
Debian | dpkg --install package_file | .deb更新 |
Debian | dpkg --list | 列出所安装的软件包 |
Debian | dpkg --status package_name | 是否安装 |
Debian | apt-cache show package_name | 显示安装包的信息 |
Debian | dpkg --search file_name | 查看某个文件是谁安装 |
Red Hat | yum install package_name | 安装 |
Red Hat | rpm -i package_file | 安装.rpm |
Red Hat | yum erase package_name | 卸载 |
Red Hat | yum update | 更新全部软件 |
Red Hat | rpm -U package_file | .rpm更新 |
Red Hat | rpm -qa | 列出所安装的软件包 |
Red Hat | rpm -q package_name | 是否安装 |
Red Hat | yum info package_name | 显示安装包的信息 |
Red Hat | rpm -qf file_name | 查看某个文件是谁安装 |
网络命令
ping linuxcommand.org
traceroute(tracepath) slashdot.org
netstat -ie 查看系统中的网络接口
netstat -r 显示内核的网络路由表ssh软件包
ssh user@ssh_server 登录
ssh remote-sys 'ls *' > dirlist.txt 执行单个命令
scp remote-sys:document.txt . 复制文件查找文件
find ~ -type f -name "*.JPG" -size +1M | wc -l
文件类型 | 描述 |
---|---|
b | 块设备文件 |
c | 字符设备文件 |
d | 目录 |
f | 普通文件 |
l | 符号链接 |
压缩和归档
gzip foo.txt
gunzip foo.txt.gz
tar cf playground.tar playground
tar xf playground.tar
zip -r playground.zip playground 打包
unzip playground.zip 解压
- 同步
rsync options source destination
这里 source 和 destination 是下列选项之一,两者之一必须是本地文件:
• 一个本地文件或目录
• 一个远端文件或目录,以 [user@]host:path 的形式存在
• 一个远端 rsync 服务器,由 rsync://[user@]host[:port]/path 指定
• rsync unual@192.168.2.140:~/Desktop/1.txt /mnt/c/unual/code/1.txt 远程文件复制到本地
• rsync /mnt/c/unual/code/linux.pdf unual@192.168.2.140:~ 本地文件复制到远程
备份别名
alias backup='sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup'
sudo rsync -av --delete --rsh=ssh /etc /home /usr/local remote-sys:/backup 本地备份到远程主机
rsync -av -delete rsync://rsync.gtlib.gatech.edu/fedora-linux-core/development/i386/os fedora-devel 从远程服务获取更新
- grep (global regular expression print)
grep [options] regex [file...]
选项 | 描述 |
---|---|
-i | 忽略大小写。不会区分大小写字符。也可用 --ignore-case 来指定。 |
-v | 不匹配。通常,grep 程序会打印包含匹配项的文本行。这个选项导致 grep 程序只会不包含匹配项的文本行。也可用--invert-match 来指定。 |
-c | 打印匹配的数量(或者是不匹配的数目,若指定了 -v 选项),而不是文本行本身。也可用 --count 选项来指定。 |
-l | 打印包含匹配项的文件名,而不是文本行本身,也可用--files-with-matches 选项来指定。 |
-L | 相似于 -l 选项,但是只是打印不包含匹配项的文件名。也可用 --files-without-match 来指定。 |
-n | 在每个匹配行之前打印出其位于文件中的相应行号。也可用--line-number 选项来指定。 |
-h | 应用于多文件搜索,不输出文件名。也可用 --no-filename选项来指定。 |
grep bzip dirlist*.txt
多文件搜索,从一批文件的内容之中,查找匹配字符串
- 正则表达式
^ $ . [ ] { } - ? * + ( ) | \
符号 | 用法 |
---|---|
^ | 行首匹配 (额外,和[]配合表示否定,[^bg]表示不包含b或者g) |
$ | 行尾匹配 |
. | 用来匹配任意字符 |
[] | 从一个指定的字符集合中匹配一个单个的字符 |
- | 连接符,或表示一个范围,A-Z表示大写字母 |
| | 表示或,grep需要使用-E选项,或者在表达式中使用转义 |
( ) | 隔离作用 |
? | 可有可无,表示匹配0次或者1次 |
* | 匹配零个或多个元素 |
+ | 类似*,但要求至少匹配一次 |
{n} | 匹配n次 |
- grep -h '[^bg]zip' dirlist*.txt
匹配zip三个字符前一个并非b/g字符 - grep -h '^[A-Za-z0-9]' dirlist*.txt
匹配字符或数字开头 - grep -Eh '^(bz|gz|zip)' dirlist*.txt
匹配以“bz”,或“gz”,或“zip”开头的文件名 - grep -E '^([[:alpha:]]+ ?)+$'
匹配一个或多个字母开头,可以跟随一个空格,可重复多次。 - ^(?[0-9]{3})? [0-9]{3}-[0-9]{4}$
匹配电话号码 - find . -regex '.[^-_./0-9a-zA-Z].'
find是精确匹配,要求路径名全匹配
- sort
选项 | 长选项 | 描述 |
---|---|---|
-b | --ignore-leading-blanks | 默认情况下,对整行进行排序,从每行的第一个字符开始。这个选项导致 sort 程序忽略每行开头的空格,从第一个非空白字符开始排序。 |
-f | --ignore-case | 让排序不区分大小写。 |
-n | --numeric-sort | 基于字符串的长度来排序。使用此选项允许根据数字值执行排序,而不是字母值。 |
-r | --reverse | 按相反顺序排序。结果按照降序排列,而不是升序。 |
-k | --key=field1[,field2] | 对从 field1 到 field2 之间的字符排序,而不是整个文本行。看下面的讨论。 |
-m | --merge | 把每个参数看作是一个预先排好序的文件。把多个文件合并成一个排好序的文件,而没有执行额外的排序。 |
-o | --output=file | 把排好序的输出结果发送到文件,而不是标准输出。 |
-t | --field-separator=char | 定义域分隔字符。默认情况下,域由空格或制表符分隔。 |
- ls -al /usr/bin | sort -nr -k 5 | head
- sort --key=1,1 --key=2n distros.txt
指定了 1,1,意味着“始于并且结束于第一个字段。”在第二个实例中,我们指定了 2n,意味着第二个字段是排序的键值,并且按照数值排序。
- cut
选项 | 说明 |
---|---|
-c | char list从文本行中抽取由 char list 定义的文本。这个列表可能由一个或多个逗号分隔开的数值区间组成。 |
-f | field list从文本行中抽取一个或多个由 field list 定义的字段。这个列表可能包括一个或多个字段,或由逗号分隔开的字段区间。 |
-d | delim char当指定 -f 选项之后,使用 delim char 做为字段分隔符。默认情况下,字段之间必须由单个 tab 字符分隔开。 |
--complement | 抽取整个文本行,除了那些由 -c 和/或 -f 选项指定的文本。 |
- cut -d ':' -f 1 /etc/passwd
查看所有账号
shell 脚本
$?
查看shell命令退出状态流程控制:
1.if 分支结构
if commands; then commands
[elif commands; then commands...]
[else commands]
fi
2.while
while commands; do commands; done
3.until
和while区别为,until满足条件,退出循环
until commands; do commands; done
4.case
case word in
[pattern [| pattern]...) commands ;;]...
esac
5.for
for variable [in words]; do
commands
done
省略掉 for 命令的可选项 words 部分,for 命令会默认处理位置参数
- 计算文件状态:
表达式 | 如果为真 |
---|---|
file1 -ef file2 | file1 和 file2 拥有相同的索引号(通过硬链接两个文件名指向相同的文件)。 |
file1 -nt file2 | file1 新于 file2。 |
file1 -ot file2 | file1 早于 file2。 |
-b file | file存在并且是一个块(设备)文件。 |
-c file | file存在并且是一个字符(设备)文件。 |
-d file | file存在并且是一个目录。 |
-e file | file存在。 |
-f file | file存在并且是一个普通文件。 |
-g file | file存在并且设置了组 ID。 |
-G file | file存在并且由有效组 ID 拥有。 |
-k file | file存在并且设置了它的“sticky bit”。 |
-L file | file存在并且是一个符号链接。 |
-O file | file存在并且由有效用户 ID 拥有。 |
-p file | file存在并且是一个命名管道。 |
-r file | file存在并且可读(有效用户有可读权限)。 |
-s file | file存在且其长度大于零。 |
-S file | file存在且是一个网络 socket。 |
-t fd | fd是一个定向到终端/从终端定向的文件描述符。这可以被用来决定是否重定向了标准输入/输出错误。 |
-u file | file存在并且设置了 setuid 位。 |
-w file | file存在并且可写(有效用户拥有可写权限)。 |
-x file | file存在并且可执行(有效用户有执行/搜索权限)。 |
- | - |
string | string 不为 null。 |
-n string | 字符串 string 的长度大于零。 |
-z string | 字符串 string 的长度为零。 |
string1 = string2 string1 == string2 | string1 和 string2 相同. 单或双等号都可以,不过双等号更受欢迎。 |
string1 != string2 | string1 和 string2 不相同。 |
string1 ">" string2 | sting1 排列在 string2 之后。 |
string1 "<" string2 | string1 排列在 string2 之前。 |
- | - |
integer1 -eq integer2 | integer1 等于 integer2. |
integer1 -ne integer2 | integer1 不等于 integer2. |
integer1 -le integer2 | integer1 小于或等于 integer2. |
integer1 -lt integer2 | integer1 小于 integer2. |
integer1 -ge integer2 | integer1 大于或等于 integer2. |
integer1 -gt integer2 | integer1 大于 integer2. |
test_file () {
# test-file: Evaluate the status of a file
FILE=~/.bashrc
if [ -e "$FILE" ]; then
if [ -f "$FILE" ]; then
echo "$FILE is a regular file."
fi
if [ -d "$FILE" ]; then
echo "$FILE is a directory."
fi
if [ -r "$FILE" ]; then
echo "$FILE is readable."
fi
if [ -w "$FILE" ]; then
echo "$FILE is writable."
fi
if [ -x "$FILE" ]; then
echo "$FILE is executable/searchable."
fi
else
echo "$FILE does not exist"
return 1
fi
}
[[ ]]支持以上所有表达式,并且
1.支持正则表达式
if [[ "\$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
2.支持类型匹配
FILE=foo.bar
if [[ $FILE == foo.* ]]; then
echo "$FILE matches pattern 'foo.*'"
fi
- read
read [-options] [variable...]
如果 read 命令接受到变量值数目少于期望的数字,那么额外的变量值为空,而多余的输入数据则会被包含到最后一个变量中。如果 read 命令之后没有列出变量名,则一个 shell 变量,REPLY,将会包含所有的输入。
选项 | 说明 |
---|---|
-a array | 把输入赋值到数组 array 中,从索引号零开始。我们将第36 章中讨论数组问题。 |
-d delimiter | 用字符串 delimiter 中的第一个字符指示输入结束,而不是一个换行符。 |
-e | 使用 Readline 来处理输入。这使得与命令行相同的方式编辑输入。 |
-n num | 读取 num 个输入字符,而不是整行。 |
-p prompt | 为输入显示提示信息,使用字符串 prompt。 |
-r | Raw mode. 不把反斜杠字符解释为转义字符。 |
-s | Silent mode. 不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这会很有帮助。 |
-t seconds | 超时. 几秒钟后终止输入。read 会返回一个非零退出状态,若输入超时。 |
-u fd | 使用文件描述符 fd 中的输入,而不是标准输入。 |
#!/bin/bash
# read-ifs: read fields from a file
FILE=/etc/passwd
read -p "Enter a user name > " user_name
file_info=$(grep "^$user_name:" $FILE)
if [ -n "$file_info" ]; then
IFS=":" read user pw uid gid name home shell <<< "$file_info"
echo "User = '$user'"
echo "UID = '$uid'"
echo "GID = '$gid'"
echo "Full Name = '$name'"
echo "Home Dir. = '$home'"
echo "Shell = '$shell'"
else
echo "No such user '$user_name'" >&2
exit 1
fi
有用的命令
sudo apt update
是从/etc/apt/source.list文件中定义的源中去同步包的索引文件du命令
选项 | 说明 |
---|---|
h | 以人类可读的方式显示 |
a | 显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小 |
s | 显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小 |
c | 显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和 |
apparent-size | 显示目录或文件自身的大小 |
l | 统计硬链接占用磁盘空间的大小 |
L | 统计符号链接所指向的文件占用的磁盘空间大小 |
1.du -sh : 查看当前目录总共占的容量。而不单独列出各子项占用的容量
2.du -sh --max-depth=1 : 查看当前目录下一级子文件和子目录占用的磁盘容量。
3.du -sh * | sort -n 统计当前文件夹(目录)大小,并按文件大小排序
4.du -sk filename 查看指定文件大小