一、基本的bash shell命令
1、默认bash shell 提示符是美元符号($);
2、bash手册
使用man命令来访问存储在Linux系统上的手册页面,如:
KILL(1) BSD General Commands Manual KILL(1)
NAME
kill -- terminate or signal a process
SYNOPSIS
kill [-s signal_name] pid ...
kill -l [exit_status]
kill -signal_name pid ...
kill -signal_number pid ...
DESCRIPTION
The kill utility sends a signal to the processes specified by the pid op-
erands.
Only the super-user may send signals to other users\' processes.
The options are as follows:
-s signal_name
A symbolic signal name specifying the signal to be sent instead
of the default TERM.
使用关键字搜索手册页
语法:man -k 关键字
如:查找与终端命令相关的命令,可以输入man -k terminal
3、常见Linux目录名称
4、目录知识
- 单点符(.),表示当前目录;
- 双点符(..),表示当前目录的父目录。
- ls命令,显示当前目录下的文件和目录
-
- -F参数在目录名后加了正斜线(/),以方便用户在输出中分辨它们,如:
bogon:Users Mac$ ls -F
Guest/ Mac/ Shared/
- -R参数是ls命令可用的另一个参数,叫作递归选项。它列出了当前目录下包含的子目录中的文件。
- 要把隐藏文件和普通文件及目录一起显示出来,就得用到-a参数。
- 常用的参数是-l。-l参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息。
bogon:Users Mac$ ls -la
total 0
drwxr-xr-x 6 root admin 204 Jul 11 10:08 .
drwxr-xr-x 32 root wheel 1156 Oct 17 13:36 ..
-rw-r--r-- 1 root wheel 0 Jul 31 2016 .localized
drwxr-xr-x+ 12 Guest _guest 408 Feb 27 2017 Guest
drwxr-xr-x+ 39 Mac staff 1326 Oct 15 10:28 Mac
drwxrwxrwt 20 root wheel 680 Oct 13 16:52 Shared
- 说明:
- 文件类型 ,比如目录 (d)、文件(-)、字符型文件(c)或块设备 (b);
- 文件的权限;
- 文件的硬链接总数;
- 文件属主的用户名;
- 文件属组的组名;
- 文件的大小(以字节为单位);
- 文件的上次修改时间 ;
- 文件名或目录名。
- 问号(?)代表一个字符;
- 星号(*)代表零个或多个字符。
$ ls -l my_scr?pt
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
$ ls -l my*
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_file
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
$ ls -l my_s*t
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
$ ls -l my_scr[ai]pt
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
$ ls -l f[a-i]ll
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fall
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fell
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fill
$
$ ls -l f[!a]ll
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fell
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fill
-rw-rw-r-- 1 christine christine 0 May 21 13:44 full
$
5、创建文件:
- 创建空文件夹:$touch test_one
- 复制文件:$cp -i source destination
- 当source和destination参数都是文件名时,cp命令将源文件复制成一个新文件,并且以 destination命名,-i 用于提示目标文件存在时是否覆盖。
- 制表键自动补全:输入了命令cp really,然后按制表键,shell就将剩下的文件名自动补充完整了!
- 要查看文件或目录的inode 编号,可以给ls命令加入-i参数。
- 移动(又名重命名文件):
$ mv /home/christine/Pictures/fzll /home/christine/fall
- 移除:在使用rm命令时,要养成总是加入-i参数的好习惯。
6、创建、删除目录:
- 用mkdir命令即可:$ mkdir New_Dir
- 删除目录的基本命令是rmdir。默认情况下,rmdir命令只删除空目录。
- 一口气删除目录及其所有内容的终极大法就是使用带有-r参数和-f参数的rm命令,不会有提示,所有慎重。
$ rm -rf Small_Dir
7、查看文件内容
$ file my_file my_file: ASCII text
$
- 查看整个文件:cat命令是显示文本文件中所有数据的得力工具。
$ cat -n test1
1 hello
2
3 This is a test file.
4
5
6 That we\'ll use to test the cat command.
$
- 如果只想给有文本的行加上行号,可以用-b参数。
- 如果不想让制表符出现,可以用-T参数。-T参数会用^I字符组合去替换文中的所有制表符。
- cat命令的主要缺陷是:一旦运行,你就无法控制后面的操作。为了解决这个问题,开发人员编写了more命令。more命令会显示文本文件的内容,但会在显示每页数据之后停下来。
- less命令的命名实际上是个文字游戏(从俗语“less is more”得来),它实为more命令的升级版。一次显示一屏的文件文本。它提供了一些极为实用的特性,能够实现在文本文件中前后翻动,而且还有一些高级搜索功能。
- tail命令会显示文件最后几行的内容(文件的“尾部”)。默认情况下,它会显示文件的末 尾10行。
-
- 可以向tail命令中加入-n参数来修改所显示的行数。通过加入-n 2使tail命令只显示文件的最后两行:
$ tail -n 2 log_file
line19
Last line - line20
$
- head命令,会显示文件开头那些行的内容。它也支持-n参数,这样就可以指定想要显示的内容了。
二、更多的bash shell命令
1、探查进程:
ps命令能输出运行在系统上的所有程序的许多信息。它只能显示某个特定时间点的信息。
-e参数指定显示所有运行在系统上的进程;-f参数则扩展了输出,这些扩展的列包含了有用的信息。
- UID:启动这些进程的用户。
- PID:进程的进程ID。
- PPID:父进程的进程号(如果该进程是由另一个进程启动的)。
- C:进程生命周期中的CPU利用率。
- STIME:进程启动时的系统时间。
- TTY:进程启动时的终端设备.
- TIME:运行进程需要的累计CPU时间。
- CMD:启动的程序名称。
2、实时监测进程: top命令跟ps命令相似,能够显示进程信息,但它是实时显示的。
- PID:进程的ID。
- USER:进程属主的名字。
- PR:进程的优先级。
- NI:进程的谦让度值。
- VIRT:进程占用的虚拟内存总量。
- RES:进程占用的物理内存总量。
- SHR:进程和其他进程共享的内存总量。
- S:进程的状态(D代表可中断的休眠状态,R代表在运行状态,S代表休眠状态,T代表跟踪状态或停止状态,Z代表僵化状态)。
- %CPU:进程使用的CPU时间比例。
- %MEM:进程使用的内存占可用内存的比例。
- TIME+:自进程启动到目前为止的CPU时间总量。
- COMMAND:进程所对应的命令行名称,也就是启动的程序名。
3、结束进程:kill命令可通过进程ID(PID)给进程发信号,只能用进程的PID而不能用命令
要发送进程信号,你是进程的属主或登录为root用户。
$ kill 3940
-bash: kill: (3940) - Operation not permitted
$
killall命令非常强大,它支持通过进程名而不是PID来结束进程。killall命令也支持通配符,这在系统因负载过大而变得很慢时很有用。
$ killall http*
$
上例中的命令结束了所有以http开头的进程,比如Apache Web服务器的httpd服务。
警告:以root用户身份登录系统时,使用killall命令要特别小心,因为很容易就会误用通配符而结束了重要的系统进程。这可能会破坏文件系统。
4、处理数据文件
-
- sort命令按照会话指定的默认语言的排序规则对文本文件中的数据行排序。
- 可用-n参数,它会告诉sort命令把数字识别成数字而不是字符,并且按值排序
- 另一个常用的参数是-M,按月排序。
- -k和-t参数在对按字段分隔的数据进行排序时非常有用,例如/etc/passwd文件。可以用-t 参数来指定字段分隔符,然后用-k参数来指定排序的字段。
$ sort -t \':\' -k 3 -n /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
$
- 搜索数据:用grep命令来帮助查找就行了。grep命令的命令行格式如下。
$ grep [options] pattern [file]
-
- 如果要进行反向搜索(输出不匹配该模式的行),可加-v参数。
- 如果要显示匹配模式的行所在的行号,可加-n参数。
- 如果只要知道有多少行含有匹配的模式,可用-c参数。
- 如果要 定多个 式,可用-e参数来定每个模式。
$ grep -e t -e f file1
two
three
four
five
$
5、压缩数据
gzip是Linux上最流行的压缩工具。
- gzip:用来压缩文件。
- gzcat:用来查看压缩过的文本文件的内容。
- gunzip:用来解压文件。
$ gzip myprog
$ ls -l my*
-rwxrwxr-x 1 rich rich 2197 2007-09-13 11:29 myprog.gz
$
6、归档数据
tar命令最开始是用来将文件写到磁带设备上归档的,然而它也能把输出写到文件 ,这种用法在Linux上已经普遍用来归档数据了。
tar命令的格式: tar function [options] object1 object2 ...
function参数定义了tar命令应 做什么,如表4-8所示。
每个功能可用选项来针对tar归档文件定义一个特定行为。表4-9列出了这些选项中能和tar命令一起使用的常见选项 。
下载开源软件之后,你会经常看到文件名以.tgz结尾。这些是gzip压缩过的tar文件可以用命令tar -zxvf filename.tgz 来解压。
三、理解shell
四、使用Linux环境变量
系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。
要查看全局变量,可以使用env或printenv命令。
在echo命令中,在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令 行参数。
变量名、等号和值之间没有空格,这一点非常重要。如果是你自己创建的局 部变量或是shell脚本,请使用小写字母。
root用户账户是Linux系统的管理员,固定分配给它的UID是0。
使用文件权限符
- -代表文件
- d代表目录
- l代表链接
- c代表字符型设备 b代表块设备
- n代表网络设备 之后有3组三字符的编码。每一组定义了3种访问权限:
- r代表对象是可读的
- w代表对象是可写的
- x代表对象是可执行的 若没有某种权限,在该权限位会出现单破折线。这3组权限分别对应对象的3个安全级别:
对象的属主
对象的属组
系统其他用户
改变权限
chmod命令用来改变文件和目录的安全性设置。该命令的格式如下: chmod options mode file
后面跟着的符号表示你是想在现有权限基础上增加权限(+),还是在现有权限基础上移除权限(-),或是将权限设置成后面的值(=)。
x:如果对象是目录或者它已有执行权限,赋予执行权限。
s:运行时重新设置UID或GID。
t:保留文件或目录。
u:将权限设置为跟属主一样。
g:将权限设置为跟属组一样。
o:将权限设置为跟其他用户一样。
vim编辑器有两种操作模式:
普通模式
插入模式
当你刚打开要编辑的文件时(或新建一个文件时),vim编辑器会进入普通模式。在普通模式 中,vim编辑器会将按键解释成命令(本章后面会讨论更多)。
在插入模式下,vim会将你在当前光标位置输入的每个键都插入到缓冲区。按下i键就可以进 入插入模式。要退出插入模式回到普通模式,按下键盘上的退出键(ESC键,也就是Escape键) 就可以了。
在普通模式中,可以用方向键在文本区域移动光标(只要vim能正确识别你的终端类型)。如 果你恰巧在一个古怪的没有定义方向键的终端连接上,也不是完全没有希望。vim中有用来移动 光标的命令。
h:左移一个字符。
j:下移一行(文本中的下一行)。 k:上移一行(文本中的上一行)。 l:右移一个字符。
在大的文本文件中一行一行地来回移动会特别麻烦,幸而vim提供了一些能够提高移动速度 的命令。
Ctrl+F:下翻一屏。
Ctrl+B:上翻一屏。
G:移到缓冲区的最后一行。
num G:移动到缓冲区中的第num行。
gg:移到缓冲区的第一行。
vim编辑器在普通模式下有个特别的功能叫命令行模式。命令行模式提供了一个交互式命令 行,可以输入额外的命令来控制vim的行为。要进入命令行模式,在普通模式下按下冒号键。光 标会移动到消息行,然后出现冒号,等待输入命令。
在命令行模式下有几个命令可以将缓冲区的数据保存到文件中并退出vim。
q:如果未修改缓冲区数据,退出。
q!:取消所有对缓冲区数据的修改并退出。
w filename:将文件保存到另一个文件中。
wq:将缓冲区数据保存到文件中并退出。
变量每次被引用时,都会输出当前赋给它的值。重要的是要记住,引用一个变量值时需要使 用美元符,而引用变量来对其进行赋值时则不要使用美元符。
最基本的重定向将命令的输出发送到一个文件中。bash shell用大于号(>)来完成这项功能: command > outputfile
可以用双大于号(>>)来追加数据。
输入重定向符号是小于号(<)
wc命令可以对对数据中的文本进行计数。默认情况下,它会输出3个值:
文本的行数
文本的词数 8
command1 | command2
Linux系统实际上会同时运行这两个命令,在 系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据 传输不会用到任何中间文件或缓冲区。文本的字节数
在将一个数学运算结果赋给某个变量时,可以用美元符和 方括号($[ operation ])将数学表达式围起来。
$ var2=$[$var1 * 2] $ echo $var2
在脚本中使用bc:
最好的办法是使用内联输入重定向,它允许你直接在命令行中重定向数据。在shell脚本中, 你可以将输出赋给一个变量。
variable=$(bc << EOF options statements expressions
EOF )
示例:
#!/bin/bash
var1=10.46 var2=43.67 var3=33.2 var4=71
var5=$(bc << EOF scale = 4 a1 = ( $var1 * $var2) b1 = ($var3 * $var4) a1 + b1 EOF )
echo The final answer for this mess is $var5
退出脚本:shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态 码是一个0~255的整数值,在命令结束运行时由命令传给shell。可以捕获这个值并在脚本中使用。
Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码。按照惯例,一个成功结束的命令的退出状态码是0。
exit命令:exit命令允许你在脚本结束时指定一个退出状态码。
最基本的结构化命令就是if-then语句。if-then语句有如下格式。
if command then
commands
fi
if command1
then
command set 1
elif command2
then
command set 2
elif command3
then
command set 3
elif command4
then
command set 4
fi
记住,在elif语句中,紧跟其后的else语句属于elif代码块。它们并不属于之前的 if-then代码块。
bash shell提供了另一种条件测试方法,无需在if-then语句中声明test命令。
if [ condition ]
then
commands
fi
方括号定义了测试条件。注意,第一个方括号之后和第二个方括号之前必须加上一个空格, 否则就会报错。
test命令可以判断三类条件:
数值比较
字符串比较
(( expression ))
双方括号命令的格式如下:
[[ expression ]]
case命令会采用列表格式来检查单个变量的多个值。
case variable in
pattern1 | pattern 2) commands1;;
pattern3) commands2;;
*) default commands;;
esac
bash shell中for命令的基本格式。
for var in list do
commands
done
环境变量IFS,叫作内部字段分隔符(internal field separator)。
如设置换行符为分隔符:IFS=$\'\\n\'
C 的for命令 格式
for (( variable assignment ; condition ; iteration process )),如:
for (( a = 1; a < 10; a++ ))
注意 ,有些部分并 有 bash shell 的for命令:
变量 可以有 空格;
条件中的变量不以美元符开头 ;
迭代过程的算式未用expr命令格式。
$ cat test8 #!/bin/bash # testing the C-style for loop
for (( i=1; i <= 10; i++ )) do
echo "The next number is $i" done
$ ./test8 The next number is 1 The next number is 2 The next number is 3 The next number is 4 The next number is 5 The next number is 6 The next number is 7 The next number is 8 The next number is 9 The next number is 10 $
多变量
$ cat test9
#!/bin/bash
# multiple variables
for (( a=1, b=10; a <= 10; a++, b-- )) do
echo "$a - $b" done
$ ./test9
1 - 10
2-9
3-8
4-7
5-6
6-5
7-4
8-3
9-2
10 - 1
$
while命令的基本格式是:
while test command do
other commands
done
停止正在运行的命令:Ctrl+C
特殊变量$#含有脚本运行时携带的命令行参数的个数。
当命令行上没有任何参数时,$#的值为0, params变量的值也一样,但${!#}变量会返回命令行用到的脚本 。
$*变量会将命令行上提供的所有参数当作一个单词保存。这个单词包含了命令行中出现的每 一个参数 。基本上$*变量会将这些参数视为一个整体,而不是多个个体。
$@变量会将命令行上提供的所有参数当作同一字符串中的多个独立的单词 。这样你就能遍历所有的参数值 ,得到每个参数。这通常通过for命令完成。
移动变量:在使用shift命令时,默认情况下它会将每个参数变量向左移动一个位置 。所以,变量$3 的值会移到$2中,变量$2的值会移到$1中,而变量$1的值则会被删除(注意变量$0的值,也就是程序名,不会改变)。
可以一 性移动多个位置,只需要 shift命令提供一个参数,指明要移动的位置数就行了。
使用shift命令的时候要小心 。如果摸个参数被移出,它的值就被丢弃了,无法再恢复。
shell会用双破折线来表明列表结束 。在双破折线之后,脚本就可以放心地将剩下的命令行参数当作参数,而不是选项来处理了。
使用getopts命令 :
getopts命令的 式如下: getopts optstring variable
有效的选项字母都会列在optstring中,如果选项要求有个参数值,就加一个冒号 。要 去掉错误的信息的话,可以在optstring之前加一个冒号 。getopts命令将当前参数保存在命令行中定义的variable中。
$ cat test19.sh
#!/bin/bash
# simple demonstration of the getopts command
#
echo
while getopts :ab:c opt
do
case "$opt" in
a) echo "Found the -a option" ;;
b) echo "Found the -b option, with value $OPTARG";;
c) echo "Found the -c option" ;;
*) echo "Unknown option: $opt";;
esac done
$
$ ./test19.sh -ab test1 -c
Found the -a option Found the -b option, with value test1 Found the -c option
$
获得用户输入
基本的读取:read命令从标准输入(键盘 )或另一个文件描述符中接受输入。
生成提示的echo命令使用了-n选项 。 该选项不会在字符串末尾输出换行 ,允许脚本用户紧跟其后输入数据,而不是下一行。
实际上,read命令包了-p ,允许你直接在read命令行指定提示符 。
超时:-t 选项指定了read命令等待输入的秒数。当计时器过期后,read命令会返回一个非零退出态码。
#!/bin/bash
# timing the data entry
if read -t 5 -p "Please enter your name: " name
then
echo "Hello $name, welcome to my script"
else
echo
echo "Sorry,too slow!"
fi
$ ./test25.sh
Please enter your name:
Sorry, too slow!
$
可以不对输入过程计时,而是让read命令来统计输入的字符数。当输入的字符达到预设的字符数时,就自动退出,将输入的数据赋给变量。
$
#!/bin/bash
# getting just one character of input
#
read -n1 -p "Do you want to continue [Y/N]? " answer
case $answer in
Y | y) echo
echo "fine, continue on..." ;;
N | n) echo
echo OK, goodbye
exit ;;
esac
echo "This is the end of the script "
$ ./test26.sh
Do you want to continue [Y/N]? y
fine, continue on...
This is the end of the script
$
隐藏方式读取
有时你需要从脚本用户处得到输入,但又在屏幕显示输入信息。其中典型的例子就是输入的密码,但除之外还有很多其他需要隐藏的数据类型 。
-s选项可以避免在read命令中输入的数据出现在显示器上(实际上,数据会被显示,只是 read命令会将文本颜色设成跟背景色一样)。
#!/bin/bash
# hiding input data from the monitor
#
read -s -p "Ener your password: " pass
echo
echo "Is your password really $pass?"
$ ./test27.sh
Ener your password:
Is your password really df?
$
从文件中读取:
$ cat test28.sh
#!/bin/bash
# reading data from a file #
count=1
cat test | while read line do
echo "Line $count: $line"
count=$[ $count + 1] done
echo "Finished processing the file"
$
$ cat test
The quick brown dog jumps over the lazy fox. This is a test, this is only a test.
O Romeo, Romeo! Wherefore art thou Romeo?
$
$ ./test28.sh
Line 1: The quick brown dog jumps over the lazy fox. Line 2: This is a test, this is only a test.
Line 3: O Romeo, Romeo! Wherefore art thou Romeo? Finished processing the file $
标准文件描述符:
对终端界面来说,标准输入是键盘。标准输出就是终端显示器。
$ ls -al test test2 test3 badtest 2> test6 1> test7 $ cat test6 ls: cannot access test: No such file or directory ls: cannot access badtest: No such file or directory $ cat test7
-rw-rw-r-- 1 rich rich 158 2014-10-16 11:32 test2 -rw-rw-r-- 1 rich rich 0 2014-10-16 11:33 test3 $
shell利用1>符号将ls命令的正常输出重定向到了test7文件,错误信息通过2>符合重定向到了test6文件。
重定向到同一个输出文件则使用重定向符号 &> 。
临时重定向:如果有意在脚本中生成错误信息,可以将单独的一行输出重定向到STDERR。你所需要做的是使用输出重定向符来将输出信息重定向到STDERR文件描述符。在重定向到文件描述符时,你必须在文件描述符数字之前加一个&:
echo "This is an error message" >&2
永久重定向:
用exec命令告诉shell在脚本执行期重定向某个特定文件描述符 。
$ cat test10 #!/bin/bash # redirecting all output to a file exec 1>testout
echo "This is a test of redirecting all output" echo "from a script to another file." echo "without having to redirect every individual line" $ ./test10 $ cat testout This is a test of redirecting all output from a script to another file. without having to redirect every individual line $