本篇博客内容主要来自我大二时选修的Linux应用编程课的课程PPT,我对其中主要内容整理了一下,内容比较少,需要再参考相关阅读内容。
关于Linux的发展历史以及其发行版本,网上都有很多介绍,这里不再讲述了。
Linux 基础知识与shell命令
这部分内容将Linux常用命令与Linux系统的部分特点一起总结,可能显得稍微有点乱,更多常用命令可以参考linux常用命令(详解)。
Linux的shell命令主要有一下特点:
- 所有命令都有其固定的命令结构。
- 不同命令有不同的功能。
- 同一命令的不同参数具有不同功能。
- 每条命令有固定的选项集合。
- 可以通过3种方式查看命令的帮助信息,了解参数的功能
1)man 命令名
2)命令名 --help
3)info 命令名
echo
1)命令格式:
2)功能:显示变量、字符串
3)选项 -e可以处理转义字符,如 \a \c \n \t
uname
1)命令格式:
2)功能:显示操作系统信息
3)常用选项:
who
1)命令格式:
2)功能:查看当前登录用户信息
3)常用选项:
data
1)命令格式:
2)功能:显示系统日期
3)常用选项:
Linux文件系统
1)在Linux中,一切都是文件
- 内核、shell都是文件
2)文件分类
- 普通文件:仅包含字符流的数据文件(文本文件、二进制文件)
- 目录文件:文件夹和子目录的详细信息(文件名和inode号)
- 设备文件:代表设备,完成对设备的读取和写入操作
3)文件命名规则
- 字母和数字
- 符号:. , - , _
- 可以有扩展名,也可以没有
- 区分大小写
4)Linux文件系统结构层次
- /: 根目录(之后的/都是目录分隔符)
- /home:用户目录
- /bin: Unix常用命令,如bash, date, cat, tar等
- /sbin: 管理员命令,如fdisk, mkfs等
- /etc: 系统配置文件目录,如passwd, shadow(登录名和密码)等
- /dev: 设备文件目录,如硬盘等
- /lib: 库文件目录
- /var: 可变文件目录,如打印和邮件等
- /tmp: 临时文件目录
5)路径
- 绝对路径名:从根目录开始
- 相对路径名:从当前目录开始
- 根目录: /
- 当前用户主目录: ~或者环境变量$HOME
- 当前目录:.
- 父目录:..
6)文件系统相关命令:
ls(list)
1)命令功能:列出目录下的文件
2)命令格式:
3)常用选项:
- -a 显示以.开头的文件
- -F 用*标记可执行文件,用/标记目录,用@标记符号链接
- -l 以列表形式显示文件属性
- -t 按最后修改时间排序(降序)
- -u 按最后访问时间排序
- -r 逆序排序
- -R 递推显示子目录和文件
cd(change directiory)
1)命令功能:改变当前工作目录
2)命令格式:cd [dir]
mkdir(make directory)
1)命令功能:创建目录(文件夹)
2)命令格式:
rmdir (remove directory)
1)命令功能:删除空目录
2)命令格式:
3)常用选项: -p 删除空目录树
cp(copy)
1)命令功能:复制文件
2)命令格式:
3)常用选项:
- -b 为已存在目标文件创建备份
- -n 不覆盖已有目标文件
- -i 覆盖时询问
- -R 递推复制子目录和文件
mv(move)
1)命令功能:移动文件,重命名文件
2)命令格式:
3)常用选项:
- -b 为已存在目标文件创建备份
- -n 不覆盖已有目标文件
- -i 覆盖时询问
rm(remove)
1)命令功能:删除文件
2)命令格式:
3)常用选项:
- -f 强制删除
- -i 删除时询问
- -R 递推删除子目录和文件
cat (concatenation)
1)命令功能:在shell中显示文件内容
2)命令格式:
tar(tape archiver)
1)命令功能:存档管理
2)命令格式:
3)常用选项:
- -c 创建存档
- -x 提取存档
- -t 显示存档中的文件
- -f 指定存档名称
- -v 显示执行过程
- -z 同时使用gzip压缩文档
常用 tar -cvf filename file1 file2... 来压缩; tar -xvf filename 来解压缩
gzip
1)命令功能:压缩文件,解压缩文件
2)命令格式:
3)常用选项:
- -d 解压缩
- -k 保留原文件
- -l 显示压缩文件内容
- -r 递推压缩子目录和文件
7)文件属性
在命令行输入 ls -l 可以看到当前目录下文件的各种属性
文件权限属性:
- 权限——r 可读,w 可写,x 可执行,- 无权限
- 权限字符串:9位字符串,前三位表示所有者权限,中三位表示用户组权限,后三位表示其他用户权限
文件所有权:
- 所有权和用户组所有权
- 文件所有者可以修改文件权限
- 文件所有者对文件的操作权限显示在权限字符串的前三位
- 用户组所有者对文件的操作权限显示在权限字符串的中三位
文件大小:
- 文件的字符数,与实际占用空间不同
- 目录的大小取决于所包含的文件名,显示的是预期值
文件最后修改时间:
- 文件最后修改的时间戳
chmod
1)命令功能:改变文件权限
2)命令格式:
3)常用选项:-R 递推改变所有子目录和文件权限
4)mode:
类别
操作
权限
u 用户
+ 增加权限
r 读权限
g 用户组
- 删除权限
w 写权限
o 其他用户
= 指定绝对权限
x 执行权限
a 全部
5)八进制权限表示
权限
二进制
八进制
---
000
0
--x
001
1
-w-
010
2
-wx
011
3
r--
100
4
r-x
101
5
rw-
110
6
rwx
111
7
6)绝对权限指定:
- 读权限:4 (100)
- 写权限:2 (010)
- 执行权限:1 (001)
7)默认普通文件权限: 666 rw-rw-rw-
目录权限:
- r 读权限:是否可以访问文件名列表
- w 写权限:是否可以创建或删除文件
- x 执行权限:是否可以在路径中使用
- 默认目录权限:777 rwxrwxrwx
umask
1)命令功能:设定默认权限
2)命令格式:umask [八进制权限掩码]
3)作用:最终权限 = 默认权限码-权限掩码
4)示例:
chown (change owner)
1)命令功能:改变文件所有者
2)命令格式:
3)需要superuser权限才能执行
chgrp (change group)
1)命令功能:改变文件用户组所有权
2)命令格式:
3)需要superuser权限才能执行
8)文件与inode
- Linux支持多个文件系统
- 每个文件都使用inode编号与一个inode表格相关联
- inode表格包含了文件的属性:
类型,权限,链接数,所有者,用户组,文件大小,修改时间
一个指向文件存储磁盘区块的指针数组
- 文件在一个文件系统中有唯一的inode编号
- 使用 ls –i 命令查看文件inode编号
9)文件链接
一个文件可以有多个文件名,称为一个文件有多个链接,可以通过任意一个链接访问该文件
ln
1)命令功能:创建一个链接
- 硬链接(hard link):创建一个具有相同inode编号的文件名
- 符号链接(symbolic link):创建一个拥有独立inode的文件指向链接的文件
2)命令格式:
3)常用选项:
- -s 创建符号链接
- -f 强制创建链接(当链接名已被使用时)
文件链接分为硬链接和符号链接。
其中硬链接有如下作用:
- 可以使文件实际位置发生变化时使用链接访问文件
- 假设程序中引用了如下位置的文件:file/data.txt
- 之后该文件被移动到了新目录:newfile/data.txt
- 为了避免修改程序,可以在file目录中创建一个newfile/data.txt的硬链接
- 可以防止意外删除:使用rm命令只是删除了一个链接
符号链接的作用:
- 符号链接类似于windows系统中的快捷方式
- 创建一个指向该文件的指针文件
- 支持跨文件系统建立链接
关于这部分内容可以查看Linux ln命令
stat
1)命令功能:查看文件属性
2)命令格式:
3)常用选项:-f 查看文件系统属性
touch
1)命令功能:修改文件时间戳,创建空文件
2)命令格式:
3)常用选项:
- -a 只改变访问时间
- -c 不创建文件
- -m 只改变修改时间
- -t 使用YYMMDDhhmm更新时间
wc (word count)
1)命令功能:计算行数、字数和字符数
2)命令格式:
3)常用选项:
- -c 计算字符数
- -l 计算行数
- -w 计算字数
find
1)命令功能:查找文件
2)命令格式:find [path] [–option] [expression]
3)常用选项:
- -name 按文件名查找
- -perm XXX 按权限查找
- -type f, d, l 按类型查找
- -user 按所有者查找
- -group 按用户组所有者查找
- -ctime -x +x 按创建时间查找
Shell编程入门
Shell的工作原理
1)当用户登录到系统时,有一个shell进程随之启动,并在用户注销时终止
2)用户输入的命令是shell的输入
3)shell处理命令的步骤:
- 查找命令中的元字符
- 把这些元字符替换成对应的实际操作参数
- 将重新生成的指令传给内核执行
- 等待命令完成,提示符重新出现,等待下一条命令
Shell种类:
1)Bourne系列:
- Bourne Shell (/bin/sh)
- Korn Shell (/bin/ksh)
- Bash (/bin/bash)
2)C Shell系列:
- C Shell (/bin/csh)
- Tcsh (/bin/tcsh)
3)可以用命令 echo $SHELL 查看当前使用的shell种类
Shell命令元字符
Shell命令元字符包括:通配符、转义符、命令替换、重定向
通配符
用来表示文件名的某种模式,在解释时被替换成其他字符
通配符 | 匹配内容 |
* | 任意数量的任意字符 |
? | 单个任意字符 |
[abc] | a, b, c中的任一个字符 |
[a-z] | ASCII码值在a与z中间的任一个字符 |
[!a-z] | 不在a-z范围内的任一个字符 |
!(fname) | 除fname之外的所有文件名 |
!(f1|f2) | 除f1和f2之外的所有文件名 |
转义符
1)在处理文件名中出现通配符的文件时,常常需要用转义符来防止通配符起作用
2)在通配符前使用一个\
- \*
- \?
- \[ \]
- \[Enter] 换行继续输入
3)使用引号
- 双引号:禁止通配符替换
- 单引号:禁止通配符、变量名和命令替换
命令替换
1)反引号 `命令`:使用命令的结果来替换命令
- echo –e “The user list is \n `who`”
- echo The current time is `date`
2)$(命令):整个替换成括号中命令的结果
- echo The current time is $(date)
重定向
详见后面的Shell输入输出流
Shell程序变量
1)环境变量:shell已经定义的变量,如HOME,SHELL,PATH
2)用户自定义变量:
- 变量名:必须以字母开头,其他可以是数字和_,区分大小写
- 变量类型:shell变量都是字符串类型
- 变量不需要提前声明
- 变量赋值:variable=value
- 变量引用:$var_name (可使用转义符 \ 和单引号来避免替换)
3)示例:
环境变量
1)设置环境变量:export 变量名=变量值
2)引用环境变量:$变量名
3)查看环境变量:env命令
4)常用环境变量:
- HOME 用户目录
- PATH 命令执行路径,用冒号分隔,Shell会按PATH中给出的顺序搜索目录
- PWD 当前工作目录的绝对路径名
- UID 当前用户的识别号
- RANDOM 一个随机数
5)设置和修改环境变量的方法
- 在shell中直接修改,在shell中生效
- 在启动配置文件中修改,在每次登录后生效
系统配置文件:/etc/profile
用户配置文件:~/.profile,~/.bashrc
- 例如设置路径变量PATH:
export PATH=“$PATH:newpath”
用户自定义变量的引用和赋值
变量引用 | 变量替换 |
$变量名 | 变量值 |
${变量名} | 变量值 |
${#变量名} | 变量值长度 |
变量赋值 | 赋值语义 |
y=${x-value} | 若x有值,则y=x,否则y=value |
y=${x=value} | 若x没有值,则y=x=value,否则y=x |
y=${x+value} | 若x有值,则y=value,否则不操作 |
y=${x?value} | 若x有值,则y=x,否则在标准错误输出value |
Shell脚本
- 将一组命令保存在文件中,然后逐条执行,类似于Windows的批处理文件
- 可以使用各种文件编辑软件来编写shell脚本
- 创建文件后使用chmod命令使其具有执行权限
- 执行该文件
运算符
1)数值运算
- let 命令(shell内部命令)
- $(( 表达式 )) (shell扩展命令)
- expr 命令
- bc 浮点数计算器
2)示例:
bc
1)一个支持浮点数运算的计算器
2)通常采用管道的方式接受输入并返回计算结果
3)常用参数
- scale=n 保留小数点后n位
- ibase=k 指定输入为k进制
- obase=k 指定输出为k进制
4)常用运算符:+, -, *, /, ^, %
5)示例:
数组
1)数组的声明
- declare –a 数组变量名
2)数组赋值
- array[0]=value0
- array=(0 1 2 3)
- array=(0 [3]=1 2)
- 使用循环语句赋值
3)数组引用
- ${array[i]} 访问数组array的第i个元素
- ${array[*]}或${array[@]} 访问数组array的所有元素
- ${#array[*]}或${#array[@]} 数组array的元素个数
4)数组销毁
- unset array 销毁数组array
- unset array[i] 销毁数组array中的第i个元素
Shell程序语句
解释器行
- #!/bin/bash
- 在shell脚本的第一行
- 用来指定运行该脚本的shell种类
命令行位置参数
1)运行脚本时给定的用户输入参数
2)可以通过特定的形式在脚本中引用这些参数
位置参数 | 说明 |
$0 | 所执行命令的名字 |
$1--$9 | 命令行参数1到9的名字 |
$* | 所有命令行参数组合成的字符串 |
$# | 命令行参数的个数 |
$$ | 当前shell的进程ID号 |
$? | 最近一次命令的退出状态(正常0) |
$! | 最近一次后台进程的ID号 |
3)超过9个参数时,可使用shift命令将参数移位
读取用户输入
1)read 变量表
2)从标准输入读取用户的输入,存入变量表中的变量
- -p 提示字符串
- -n 指定数量读取
- -t 指定时间读取
- -s 隐藏显示输入字符
3)示例:
- read –n 2 –t 10 –p “Input your name and age: ” name age
命令退出状态
1)所有命令和程序都会返回一个退出状态值
2)可以通过exit命令显示指定脚本的退出状态值
- 正常退出 exit 0
- 出错退出 exit 1
3)使用exit命令是一种好的编程习惯
4)可以使用参数$?查看上一条命令的退出状态
5)示例:
Shell控制结构语句
1)顺序执行:在同一行内使用;分隔命令
2)条件执行:使用逻辑运算符&&和||分隔命令
- cmd1 && cmd2 若cmd1成功,则执行cmd2
- cmd1 || cmd2 若cmd1失败,则执行cmd2
3)命令的成功与否取决于命令的退出状态值
4)示例:
条件选择语句 if
1)格式1:
if 条件测试命令
then
条件为真时的命令串
else
条件为假时的命令串
fi
2)格式2:
if 条件测试命令
then
条件为真时的命令串
elif 条件测试命令
then
条件为真时的命令串
else
条件为假时的命令串
fi
3)条件测试命令
test命令 (缩写[ ])
- 比较两个数值
- 比较两个字符串,或与null进行比较
- 查看文件特性
test没有任何输入,只记录退出状态值$?
数值比较运算符 | 意义 |
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-ge | 大于等于 |
-lt | 小于 |
-le | 小于等于 |
字符串比较运算符 | 意义 |
= | 等于 |
!= | 不等于 |
-n str | str不为空 |
-z str | str为空 |
str | str被赋值且不为空 |
示例:
4)复合条件
可以在if中使用复合条件运算符
- && 和 ||
- if [ “$0”=“cmd” ] || [ “$0”=“./cmd” ]
- -a 和 –o
- if [ “$0”=“cmd” –o “$0”=“./cmd” ]
case语句
1)格式:
case 表达式 in
模式1) 命令串1 ;
模式2) 命令串2 ;
…
模式 *) 命令串n;
esac
2)按照从上到下的顺序匹配表达式的值,如匹配成功则执行相应的命令串
3)最后一个模式匹配任何未与之前匹配的表达式
4)case语句也支持通配符
循环语句 for
格式:
for 变量 in 列表
do
命令串
done
每次迭代中列表中的值被依次赋给变量,并执行循环体
当列表结束时,循环结束
循环语句while
格式:
while 条件测试命令
do
命令串
done
当条件测试命令返回真时,执行循环体
当条件测试命令返回假时,循环结束
循环语句until
格式:
until 条件测试命令
do
命令串
done
当条件测试命令返回假时,执行循环体
当条件测试命令返回真时,循环结束
break和continue
- break语句:跳出循环体,执行done之后的语句
- continue语句:跳到done的位置,重新执行循环
shell函数
1)函数声明:
function() {
statements
return value
}
2)函数调用:使用函数名进行调用,并可在名称后面给出命令行参数
3)函数支持对命令行位置参数的引用
4)函数的退出状态由return返回
5)函数可通过标准输出向调用者返回输出字符串
文件特性检查
test命令检查文件特性
命令 | 意义 |
[ -e file ] | file存在 |
[ -f file ] | file存在并是一个常规文件 |
[ -d file ] | file存在并是一个目录 |
[ -L file ] | file存在并是一个符号链接 |
[ -rwx file ] | file存在且可读可写可执行 |
[ -s file ] | file存在且大小大于0 |
[ f1 –nt f2 ] | f1比f2更新 |
[ f1 –ot f2 ] | f1比f2更旧 |
[ f1 –ef f2 ] | f1被链接到f2 |
Shell输入输出流
1)输入和输出终端
- 键盘、显示器
2)命令的输入和输出字符流
- 标准输入流:连接到键盘的输入
- 标准输出流:连接到显示器的输出
- 标准错误流:连接到显示器的错误消息输出
3)三种标准输入输出源
- 终端
- 文件
- 管道
输入输出重定向到文件
1)- 标准输入
- cat - foo
2)> 输出重定向
- echo content > file
3)>> 追加输出重定向
- echo content >> file
4)< 输入重定向
- wc < file
5)2> 标准错误输出重定向
- cat foo 2> errorfile
6)相互重定向
- 1>&2
- 2>&1
文件描述符 | 含义 |
0 | 标准输入 |
1 | 标准输出 |
2 | 标准错误 |
3… | 其他文件 |
过滤器
1)同时用到输入和输出流的命令
2)对于过滤器来说,输入输出流的顺序是不重要的
- wc < infile > outfile
- wc > outfile < infile
- >outfile < infile wc
3)示例:
- cat – f2 < f1 > f3 2> f4
命令组合
1)使用圆括号( )和花括号{ }将多个命令组合起来
3)组合命令由一个子shell执行,共享输入和输出源
4)组合命令能够共享同一个重定向符号
5)示例:
- ( ls –l *.txt; wc *.txt ) > all
管道
1)将一条命令的输出作为另一条命令的输入
2)格式:命令1 | 命令2
3)| 左边的命令使用标准输出,| 右边的命令使用标准输入
4)示例:
- who –a | cat > userlist
- (cat f1; echo var2) | wc –l
- ls | cat – file | wc
5)优点:
- 处理速度快
- 不产生中间文件结果