bash-shell

1. 基本操作

a. export

输出所有的环境变量。 如果你想查看某个特定变量的值,用echo $VARIABLE_NAME

export

示例:

$ export
AWS_HOME=/Users/adnanadnan/.aws
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LESS=-R

$ echo $AWS_HOME
/Users/adnanadnan/.aws

b. whatis

whatis 显示某个用户命令、系统调用或库函数的描述文档,或操作手册中存在的其他文档。

whatis something

示例:

$ whatis bash
bash (1)             - GNU Bourne-Again SHell

c. whereis

whereis 查找可执行文件、源文件或者说明文档的位置,使用的是一个系统自动构建的数据库。

whereis name

示例:

$ whereis php
/usr/bin/php

d. which

which 在环境变量 PATH 指定的所有文件夹中查找可执行文件的位置。它会打印出可执行文件的绝对路径。

which program_name 

示例:

$ which php
/c/xampp/php/php

e. clear

清空窗口中的内容。

f. shutdown

关机 (系统的关机、重启以及登出 )
shutdown -h now 关闭系统(1)
init 0 关闭系统(2)
telinit 0 关闭系统(3)
shutdown -h hours:minutes & 按预定时间关闭系统
shutdown -c 取消按预定时间关闭系统
shutdown -r now 重启(1)
reboot 重启(2)
logout 注销

g. 关闭防火墙

 执行命令   service iptables stop
 验证:      service iptables status

h. 关闭防火墙的自动运行

执行命令   chkconfig iptables off
验证:      chkconfig --list | grep iptables

i. 用户和群组

groupadd group_name 创建一个新用户组
groupdel group_name 删除一个用户组
groupmod -n new_group_name old_group_name 重命名一个用户组
useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户
useradd user1 创建一个新用户
userdel -r user1 删除一个用户 ( '-r' 排除主目录)
usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性
passwd 修改口令
passwd user1 修改一个用户的口令 (只允许root执行)
chage -E 2005-12-31 user1 设置用户口令的失效期限
pwck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户
grpck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组
newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组

j. 字符设置和文件格式转换

dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX
unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS
recode ..HTML < page.txt > page.html 将一个文本文件转换成html
recode -l | more 显示所有允许的转换格式

1.1. File Operations

a. cat

在 UNIX 和 Linux 中,它有以下几种用途

  • 把文本文件显示在屏幕上
  • 复制文本文件
  • 合并文本文件
  • 创建新的文本文件
cat filename
cat file1 file2 
cat file1 file2 > newcombinedfile
cat < file1 > file2 #copy file1 to file2

b. chmod

chmodchange mod 的意思,它用来改变文件或文件夹的读、写和执行权限。详细信息参见这个链接

chmod -options filename
chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限
chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限
chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限
chmod u-s /bin/file1 禁用一个二进制文件的 SUID位
chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的
chmod g-s /home/public 禁用一个目录的 SGID 位
chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件
chmod o-t /home/public 禁用一个目录的 STIKY 位

c. chown

chownchange owner 的意思,它用来改变一个文件或者文件夹的所有者,所有者可以是一个用户或一个用户组。

文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消
ls -lh 显示权限
ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示
chown user1 file1 改变一个文件的所有人属性
chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性
chgrp group1 file1 改变文件的群组
chown user1:group1 file1 改变一个文件的所有人和群组属性
find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件

文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取
chattr +a file1 只允许以追加方式读写文件
chattr +c file1 允许这个文件能被内核自动压缩/解压
chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件
chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接
chattr +s file1 允许一个文件被安全地删除
chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘
chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件
lsattr 显示特殊的属性

d. cp

把一个文件从一个位置复制到另外一个位置

cp filename1 filename2
cp file1 file2 复制一个文件
cp dir/* . 复制一个目录下的所有文件到当前工作目录
cp -a /tmp/dir1 . 复制一个目录到当前工作目录
cp -a dir1 dir2 复制一个目录

上面 filename1 是源文件位置, filename2 是目标位置(精确到文件名)。

e. diff

比对两个文件,输出他们的差异。

diff filename1 filename2

f. file

检测文件类型

file filename

示例:

$ file index.html
 index.html: HTML document, ASCII text

g. find

在某个文件夹中用一定规则查找文件

find directory options pattern

示例:

$ find . -name README.md
$ find /home/user1 -name '*.png'
find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录
find / -user user1 搜索属于用户 'user1' 的文件和目录
find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件
find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件
find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限
find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备
locate \*.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令
whereis halt 显示一个二进制文件、源码或man的位置
which halt 显示一个二进制文件或可执行文件的完整路径

h. gunzip

解压用 gzip 方法压缩的文件

gunzip filename

i. gzcat

在不解压的情况下,查看 gzip 压缩过的文件

gzcat filename

j. gzip

压缩文件

gzip filename
bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件
bzip2 file1 压缩一个叫做 'file1' 的文件
gunzip file1.gz 解压一个叫做 'file1.gz'的文件
gzip file1 压缩一个叫做 'file1'的文件
gzip -9 file1 最大程度压缩
rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包
rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1'
rar x file1.rar 解压rar包
unrar x file1.rar 解压rar包
tar -cvf archive.tar file1 创建一个非压缩的 tarball
tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件
tar -tf archive.tar 显示一个包中的内容
tar -xvf archive.tar 释放一个包
tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下
tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包
tar -xvfj archive.tar.bz2 解压一个bzip2格式的压缩包
tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包
tar -xvfz archive.tar.gz 解压一个gzip格式的压缩包
zip file1.zip file1 创建一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包
unzip file1.zip 解压一个zip格式压缩包

k. head

输出文件的前 10 行

head filename

l. lpq

输出打印机列表

lpq

示例:

$ lpq
Rank    Owner   Job     File(s)                         Total Size
active  adnanad 59      demo                            399360 bytes
1st     adnanad 60      (stdin)                         0 bytes

m. lpr

打印一个文件

lpr filename

n. lprm

从打印机任务队列中移除某个任务

lprm jobnumber

o. ls

列出当前文件夹下所有文件。ls 有很多选项:-l 以详细信息格式列出文件,详细信息包括文件实际大小,文件所有者,可查看者,以及最后修改时间。-a 列出所有文件,包括隐藏文件。更多信息参见这个链接

ls 查看目录中的文件
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
ls *[0-9]* 显示包含数字的文件名和目录名
ls -a 显示隐藏文件,文件名以“.”开始
ls -f 显示文件类型:‘/’表示目录文件;‘*’表示可执行文件;(无) 表示文本文件;
ls -r 显示一个递归的列表(含子目录下的所有文件)
ls -t 显示文件按时间排序,由近到远;
tree 显示文件和目录由根目录开始的树形结构(1)
lstree 显示文件和目录由根目录开始的树形结构(2)

示例:
<pre>
$ ls -la
rwxr-xr-x 33 adnan staff 1122 Mar 27 18:44 .
drwxrwxrwx 60 adnan staff 2040 Mar 21 15:06 ..
-rw-r–r–@ 1 adnan staff 14340 Mar 23 15:05 .DS_Store
-rw-r–r– 1 adnan staff 157 Mar 25 18:08 .bumpversion.cfg
-rw-r–r– 1 adnan staff 6515 Mar 25 18:08 .config.ini
-rw-r–r– 1 adnan staff 5805 Mar 27 18:44 .config.override.ini
drwxr-xr-x 17 adnan staff 578 Mar 27 23:36 .git
-rwxr-xr-x 1 adnan staff 2702 Mar 25 18:08 .gitignore
</pre>

p. more

输出一个文件的第一部分(用空格移动,按 q 退出)

more filename

q. mv

把一个文件从一个位置移动到另一个位置

mv dir1 new_dir 重命名/移动 一个目录

上面filename1 是源文件的路径, filename2是目标路径。(都精确到文件名)

它也可以用来重命名文件

mv old_name new_name

r. rm

删除一个文件
rm: directory: is a directory
如果想删除文件夹,需要添加 r 参数,这样会递归的删除文件夹内所有内容。可以使用 f 参数强制删除,略过确认环节。

rm -f file1 删除一个叫做 'file1' 的文件'
rmdir dir1 删除一个叫做 'dir1' 的目录'
rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容
rm -rf dir1 dir2 同时删除两个目录及它们的内容

s. tail

输出文件的最后 10 行。添加-f可以动态输出文件新添加的文本。

tail filename

t. touch

更新某个文件的访问和修改时间戳,如果文件不存在,将会被创建。

touch filename

示例:

$ touch trick.md

u. ln

ln -s file1 lnk1 创建一个指向文件或目录的软链接
ln file1 lnk1 创建一个指向文件或目录的物理链接

1.2. 文本操作

a. awk

awk 是文本操作最有用的命令。它按行处理整个文件,它默认用空格把每一行分隔成很多字段。最常用的语法是:

awk '/search_pattern/ { action_to_take_if_pattern_matches; }' file_to_parse

/etc/passwd 文件为例,该文件包含以下数据:

root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

我们想从这个文件中过滤出每一行的 username 部分。-F 参数用来指明用来把行内内容分隔的分隔符。这个例子中,我们用:来分隔。{ print $1 } 意思是输出行内第一个匹配的字段。

awk -F':' '{ print $1 }' /etc/passwd

执行上面的命令之后,你会得到下面的输出。

root
daemon
bin
sys
sync

更多详细信息,参见这个链接

b. cut

按行从文件中摘取文本并输出

example.txt

red riding hood went to the park to play

用空格分隔每一行,并输出第2,7,9列

cut -d " " -f2,7,9 example.txt
riding park play

c. echo

输出命令之后的文本到标准输出或文件

输出 “Hello World”

echo Hello World
Hello World

输出 “Hello World”,单词间用换行符分隔

echo -ne "Hello\nWorld\n"
Hello
World

d. egrep

输出文件中匹配指定模式的行,是 grep 命令的扩展模式,支持更多正则表达式(等同于 grep -E)。

example.txt

Lorem ipsum
dolor sit amet, 
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.

输出包含 Lorem 或 dolor 的行

egrep '(Lorem|dolor)' example.txt
or
grep -E '(Lorem|dolor)' example.txt
Lorem ipsum
dolor sit amet,
et dolore magna
duo dolores et ea
sanctus est Lorem
ipsum dolor sit

e. fgrep

输出文件中包含给定字符串的行,指定的模式将不被认做正则,而是字符串。(等同于:grep -F

example.txt

Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
foo (Lorem|dolor) 
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.
  • 输出在 example.txt 中包含字符串 (Lorem|dolor) 的所有行*
fgrep '(Lorem|dolor)' example.txt
or
grep -F '(Lorem|dolor)' example.txt
foo (Lorem|dolor) 

f. fmt

简单的文本格式化工具

example: example.txt (1 行)

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

把 example.txt 格式化为 20 个字符的宽度

cat example.txt | fmt -w 20
Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.

g. grep

在文件中查找文本。你可以用 grep 去查找匹配一个或多个正则表达式的文本行,然后输出这些行。

grep pattern  filename

示例:

$ grep admin /etc/passwd
_kadmin_admin:*:218:-2:Kerberos Admin Service:/var/empty:/usr/bin/false
_kadmin_changepw:*:219:-2:Kerberos Change Password Service:/var/empty:/usr/bin/false
_krb_kadmin:*:231:-2:Open Directory Kerberos Admin Service:/var/empty:/usr/bin/false

你也可以通过 -i 参数强制忽略大小写。参数-r则被用来递归地查找指定文件夹下的所有文件,例如:

$ grep -r admin /etc/

参数 -w 表示只查找单词。关于 grep的更多信息,参见这个链接

h. nl

给文件添加行号并输出

example.txt

Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.

给 example.txt 中的内容添加行号并输出

nl -s". " example.txt 
     1. Lorem ipsum
     2. dolor sit amet,
     3. consetetur
     4. sadipscing elitr,
     5. sed diam nonumy
     6. eirmod tempor
     7. invidunt ut labore
     8. et dolore magna
     9. aliquyam erat, sed
    10. diam voluptua. At
    11. vero eos et
    12. accusam et justo
    13. duo dolores et ea
    14. rebum. Stet clita
    15. kasd gubergren,
    16. no sea takimata
    17. sanctus est Lorem
    18. ipsum dolor sit
    19. amet.

i. sed

用于过滤和替换文本的流式编辑命令

example.txt

Hello This is a Test 1 2 3 4

把 example.txt 所有空格替换为连字符并输出

sed 's/ /-/g' example.txt
Hello-This-is-a-Test-1-2-3-4

把所有数字替换为 “d”

sed 's/[0-9]/d/g' example.txt
Hello This is a Test d d d d

j. sort

对文件中的行进行排序

sort:将制定的文件按要求排序
-r 按字母倒排序
-n 按数字的值从小到大排序
-r 按当前排序规则逆序排序
-f 不区分大小写排序
-d 按典型顺序排序

example.txt

f
b
c
g
a
e
d

对 example.txt 中的行进行排序

sort example.txt
a
b
c
d
e
f
g

随机打乱已经排好序的 example.txt(测试出现问题)// todo

sort example.txt | sort -R
b
f
a
c
d
g
e

k. tr

转换或删除字符

example.txt

Hello World Foo Bar Baz!

把所有小写字母转换成大写字母

cat example.txt | tr 'a-z' 'A-Z' 
HELLO WORLD FOO BAR BAZ!

把所有的空格都转换为换行符

cat example.txt | tr ' ' '\n'
Hello
World
Foo
Bar
Baz!

l. uniq

统计或精简重复的行

example.txt

a
a
b
a
b
c
d
c

输出 example.txt 中所有不重复的行(需要先进行排序, 否则相同行中间的行会被忽略)

sort example.txt | uniq
a
b
c
d

输出去重后的所有行,并显示不重复行中每一行在原文件中的重复次数

sort example.txt | uniq -c
    3 a
    2 b
    2 c
    1 d

m. wc

输出文件中的行、单词、字符个数。

wc filename
-l 算行数
-w 算单词数
-C 算字符数

示例:

$ wc demo.txt
7459   15915  398400 demo.txt

demo.txt中有 7459 行, 15915 个单词以及 398400 个字符.

1.3. Directory Operations

a. cd

进入某个文件目录,执行:

$ cd

会进入 home 目录。这个命令接受一个可选的目录名称的参数,指示要进入的目录。

cd dirname
cd /home 进入 '/ home' 目录'
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd 进入个人的主目录
cd ~user1 进入个人的主目录
cd - 返回上次所在的目录

b. mkdir

创建一个新文件夹

mkdir dir1 创建一个叫做 'dir1' 的目录'
mkdir dir1 dir2 同时创建两个目录
mkdir -p /tmp/dir1/dir2 创建一个目录树

c. pwd

显示当前所在的文件目录(绝对路径)

pwd 显示工作路径

d.挂载一个文件系统

mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在
umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 '/ mnt/hda2' 退出
fuser -km /mnt/hda2 当设备繁忙时强制卸载
umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用
mount /dev/fd0 /mnt/floppy 挂载一个软盘
mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom
mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom
mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom
mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件
mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统
mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备
mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享

1.4. SSH, System Info & Network Operations

a. bg

列出所有被停止或后台运行的任务,或将一个已停止的任务后台运行。

b. cal

输出当前月份的日历

c. date

输出当前日期和时间

d. df

输出磁盘使用统计数据

df -h 显示已经挂载的分区列表
ls -lSr |more 以尺寸大小排列文件和目录

e. dig

输出某个域名的 DNS 信息

dig domain

f. du

输出某些文件或目录的硬盘使用情况。更多详细信息参见这个链接

du [option] [filename|directory]

Options:

  • -h (人类可读) 把结果以 KB、 MB 、GB 为单位输出。
  • -s (压缩总结) 输出一个目录总的磁盘空间占用情况,总结输出子目录的报告。

示例:

du -sh pictures
1.4M pictures
du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间'
du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小
rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统)
dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统)

g. fg

输出前台中最近运行的任务

h. finger

输出某个用户的信息

finger username

i. jobs

列出在后台运行的任务,同时给出任务号

j. last

列出特定用户的登录记录

last yourUsername

k. man

输出特定命令的使用手册

man command

l. passwd

让当前登录的用户更改他的密码

m. ping

ping 某个主机然后输出结果

ping host

n. ps

列出某个用户的所有进程

ps -u yourusername

o. quota

显示磁盘使用量和配额

quota -v

p. scp

在本地主机和远程主机之间或两个远程主机之间传输文件

从本地主机复制文件到远程主机

scp source_file user@host:directory/target_file

从远程主机复制文件到本地主机

scp user@host:directory/source_file target_file
scp -r user@host:directory/source_folder target_folder

这个命令也接受一个参数 -P,用来连接指定端口

scp -P port user@host:directory/source_file target_file

q. ssh

ssh(SSH 客户端)是一个用来登录到远程主机并执行命令的程序

ssh user@host

这个命令也接受一个可选参数 -p,用来指定连接到特定的端口。

ssh -p port user@host

r. top

动态展示所有活跃的进程

s. uname

输出内核信息

uname -a
uname -m 显示机器的处理器架构(2)
uname -r 显示正在使用的内核版本
dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)
hdparm -i /dev/hda 罗列一个磁盘的架构特性
hdparm -tT /dev/sda 在磁盘上执行测试性读取操作
cat /proc/cpuinfo 显示CPU info的信息
cat /proc/interrupts 显示中断
cat /proc/meminfo 校验内存使用
cat /proc/swaps 显示哪些swap被使用
cat /proc/version 显示内核的版本
cat /proc/net/dev 显示网络适配器及统计
cat /proc/mounts 显示已加载的文件系统
lspci -tv 罗列 PCI 设备
lsusb -tv 显示 USB 设备
date 显示系统日期
cal 2007 显示2007年的日历表
date 041217002007.00 设置日期和时间 - 月日时分年.秒
clock -w 将时间修改保存到 BIOS

t. uptime

输出服务器运行了多长时间以及有多少个用户登录

u. w

输出系统在线用户

v. wget

下载文件

wget file

w. whoami

输出现在登录的用户的用户名

x. whois

获取某个域名的 whois 信息

whois domain

1.5. Process Monitoring Operations

a. kill

结束指定 PID 代表的进程

kill PID

b. killall

结束某个名字代表的所有进程

killall processname

c. &

使得 & 之前的命令作为后台进程运行在 subshell 中

command &

d. nohup

nohup 代表 No Hang Up,也即不要挂起。这条命令允许其它命令、进程或shell脚本在你退出shell之后继续在后台运行

nohup command

把它和 & 结合使用可以创建后台进程

nohup command &

e. rpm

RPM 包 - (Fedora, Redhat及类似系统)
rpm -ivh package.rpm 安装一个rpm包
rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告
rpm -U package.rpm 更新一个rpm包但不改变其配置文件
rpm -F package.rpm 更新一个确定已经安装的rpm包
rpm -e package_name.rpm 删除一个rpm包
rpm -qa 显示系统中所有已经安装的rpm包
rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包
rpm -qi package_name 获取一个已安装包的特殊信息
rpm -qg "System Environment/Daemons" 显示一个组件的rpm包
rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表
rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表
rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表
rpm -q package_name --whatprovides 显示一个rpm包所占的体积
rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l
rpm -q package_name --changelog 显示一个rpm包的修改历史
rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供
rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表
rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书
rpm --checksig package.rpm 确认一个rpm包的完整性
rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性
rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间
rpm -Va 检查系统中所有已安装的rpm包- 小心使用
rpm -Vp package.rpm 确认一个rpm包还未安装
rpm2cpio package.rpm | cpio --extract --make-directories *bin* 从一个rpm包运行可执行文件
rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 从一个rpm源码安装一个构建好的包
rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包

YUM 软件包升级器 - (Fedora, RedHat及类似系统)
yum install package_name 下载并安装一个rpm包
yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系
yum update package_name.rpm 更新当前系统中所有安装的rpm包
yum update package_name 更新一个rpm包
yum remove package_name 删除一个rpm包
yum list 列出当前系统中安装的所有包
yum search package_name 在rpm仓库中搜寻软件包
yum clean packages 清理rpm缓存删除下载的包
yum clean headers 删除所有头文件
yum clean all 删除所有缓存的包和头文件
APT 软件工具 (Debian, Ubuntu 以及类似系统)
apt-get install package_name 安装/更新一个 deb 包
apt-cdrom install package_name 从光盘安装/更新一个 deb 包
apt-get update 升级列表中的软件包
apt-get upgrade 升级所有已安装的软件
apt-get remove package_name 从系统删除一个deb包
apt-get check 确认依赖的软件仓库正确
apt-get clean 从下载的软件包中清理缓存
apt-cache search searched-package 返回包含所要搜索字符串的软件包名称

2. Basic Shell Programming

在 bash 脚本文件中的第一行被叫做 shebang。这一行决定了脚本可以像一个独立的可执行文件一样执行,而不用在终端之前输入sh,bash,python,php等。

#!/bin/bash

2.1. Variables

在 bash 中创建变量跟其它语言相似。没有变量类型,bash 中的变量可以保存一个数字、一个字符、一个字符串等等。同时无需提前声明变量,给变量赋值会直接创建变量。

示例:

str="hello world"

上面一行创建了一个变量 str 然后把 “hello world” 赋值给它。通过在变量名之前添加$符号,可以取到变量里面保存的值。

示例:

echo $str   # hello world

2.2. Array

像其它语言一样,bash 也有数组类型。bash 中的数组是一个保存着很多值的变量,数组的长度没有限制,下标也是从 0 开始。在 bash 中有好几种方法创建一个数组,如下所示。

Examples:

array[0] = val
array[1] = val
array[2] = val
array=([2]=val [0]=val [1]=val)
array=(val val val)

使用如下语法获得数组特定位置的值:

${array[i]}     # i是数组下标

如果没有指定数组下标,默认返回第一个元素。想知道数组中有多少个元素,使用下面的语法:

${#array[@]}

Bash 也支持三元运算符,如下面的例子所示:

${varname:-word}    # 如果 varname 存在而且不为 null,返回它的值,否则返回 word
${varname:=word}    # 如果 varname 存在而且不为 null,返回它的值,否则把word赋值给它并且返回 word
${varname:+word}    # 如果 varname 存在而且不为 null,返回 word,否则返回 null
${varname:offset:length}    # 它返回 $varname 的子字符串,从 offset 处开始,长度为 length

2.3 String Substitution

通过下面的语法来学习字符串相关操作

${variable#pattern}         # 如果 pattern 匹配变量值的起始部分,删除匹配 pattern 的最短的部分,然后返回剩余的
${variable##pattern}        # 如果 pattern 匹配变量值的起始部分,删除匹配 pattern 的最长的部分,然后返回剩余的
${variable%pattern}         # 如果 pattern 匹配变量值的结束部分,删除匹配 pattern 的最短的部分,然后返回剩余的
${variable%%pattern}        # 如果 pattern 匹配变量值的结束部分,删除匹配 pattern 的最长的部分,然后返回剩余的
${variable/pattern/string}  # 把变量值中匹配 pattern 的最长的部分替换为 string,只替换第一个匹配的部分
${variable//pattern/string} # 把变量值中匹配 pattern 的最长的部分替换为 string,全局进行替换
${#varname}     # 返回变量值作为一个字符串的长度

2.4. Functions

As in almost any programming language, you can use functions to group pieces of code in a more logical way or practice the divine art of recursion. Declaring a function is just a matter of writing . Calling a function is just like calling another program, you just write its name.
就像在其它编程语言中那样,您可以使用 function 来以更合乎逻辑的方式聚合代码,或实现递归的神圣艺术。声明一个 function 只需要写下function my_func { my_code } ,调用 function 就像调用另外的程序一样,使用方法名称即可。

function name() {
    shell commands
}

示例:

#!/bin/bash
function hello {
   echo world!
}
hello

function say {
    echo $1
}
say "hello world!"

当你运行上面例子中的 hello 方法时,它会输出 “world!”。上面的两个方法 hellosay 一模一样的, say 有一些不同,这个方法会打印出它接受到的第一个参数。方法中的参数,跟脚本语言中的处理方式一样。

2.5. Conditionals

bash 中的条件语句跟其他编程语言类似。条件语句有很多种形式,就像最常见的基本形式是 if 表达式 then 语句,代表如果表达式为真,则执行响应的语句。

if [expression]; then
    will execute only if expression is true
else
    will execute if expression is false
fi

有些时候如果条件语句变得太复杂,你可以用 case statements 来完成相同的条件判断功能。

case expression in
    pattern1 )
        statements ;;
    pattern2 )
        statements ;;
    ...
esac

Expression Examples:

statement1 && statement2  # 两个语句都为真
statement1 || statement2  # 至少一个语句为真

str1=str2       # str1 匹配 str2
str1!=str2      # str1 不匹配 str2
str1<str2       # str1 小于 str2
str1>str2       # str1 大于 str2
-n str1         # str1 不是 null (长度大于 0)
-z str1         # str1 是 null (长度为 0)

-a file         # 文件存在
-d file         # 文件存在而且是目录
-e file         # 文件存在,跟 -a 一样
-f file         # 文件存在,而且是常规文件(不是目录或者其他特殊类型的文件)
-r file         # 你有读权限
-s file         # 文件存在而且不为空
-w file         # 你有写权限
-x file         # 你对文件有执行权限,如果 file 是目录的话,你对它有搜索权限
-N file         # 从上次读之后文件被修改过
-O file         # 你是文件所有者
-G file         # 文件的 group ID 跟你的 group ID (或之一,如果你在很多分组里)相同

file1 -nt file2     # file1 比 file2 更新
file1 -ot file2     # file1 比 file2 更老

-lt     # 小于
-le     # 小于等于
-eq     # 等于
-ge     # 大于等于
-gt     # 大于
-ne     # 不等于

2.6. Loops

bash 中有三种类型的循环。for, whileuntil

不同的 for 语法:

for x := 1 to 10 do
begin
  statements
end

for name [in list]
do
  statements that can use $name
done

for (( initialisation ; ending condition ; update ))
do
  statements...
done

while 语法:

while condition; do
  statements
done

until 语法:

until condition; do
  statements
done

3. Tricks

设置别名

执行 nano ~/.bash_profile 来打开 bash_profile

alias dockerlogin=’ssh www-data@adnan.local -p2222′ # 在 .bash_profile 中设置别名

快速进入某个目录

nano ~/.bashrc

export hotellogs=”/workspace/hotel-api/storage/logs”

source ~/.bashrc
cd $hotellogs

跳出陷阱

通过执行清理语句使得你的脚本更有鲁棒性

function finish {
  # 在这里执行清理语句,例如,杀掉所有 fork 的进程。
  jobs -p | xargs kill
}
trap finish EXIT

保存环境变量

当你在 shell 中执行 export FOO = BAR, 环境变量只在当前 shell 和它的子 shell 中存在,如果想在将来能够永久使用这个环境变量,只需要在 ~/.bash_profile 文件后面添加要执行的命令即可。

echo export FOO=BAR >> ~/.bash_profile

访问你的脚本

通过在 home 目录下创建 bin 文件夹, 你可以很容易的访问你的脚本,mkdir ~/bin 之后,在 bin 目录里面的所有脚本都能在任何别的目录下访问到。

如果还是不能访问,把下面的代码添加到 ~/.bash_profile 文件中,然后执行source ~/.bash_profile

    # 如果用户的私有 bin 目录存在的话,把它添加到 PATH 变量中
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi

4. 调试

你可以很容易地通过传递不同的参数给 bash 命令来调试脚本。例如, -n 将会只检查脚本的语法错误而不执行脚本。 -v 将会在命令执行前输出它们。 -x 将会在命令行处理之后输出命令。

bash -n scriptname
bash -v scriptname
bash -x scriptname
    原文作者:简简算算
    原文地址: https://www.jianshu.com/p/57f9945eed93
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞