linux命令与shell编程

文章目录

一、概念

linux内存

在这里插入图片描述

嵌入式

嵌入式以计算机应用为中心,软硬件可裁剪的,对功耗,功能体积,可靠性等有要求的专用的计算机系统。

嵌入式层次图

user:(用户空间)
命令 shell脚本 APP(glibc)
-----------------------------
命令行解析器
| [0-3G]
---------------系统调用-----------------------------
kernel:(内核层)
5大功能 | [3-4G]
1.进程管理 //有进程的创建、销毁与调用
2.内存管理 //内存申请、释放
3.文件管理
4.网络管理
5.设备管理 //设备驱动管理

hardware: (硬件层)
led camera sensor lcd sound

linux系统:分时多任务/多用户操作系统 linux系统一切皆文件

用户空间进入内核需要使用系统调用完成,系统 调用接口是内核已经给用户提供了。linux分为用户 空间和内核空间的原因是处于安全角度考虑。

判断小端和大端

在我们发送数据的时候,我们首先要确定是大端还是小端模式来进行的,在接收方接收的数据必须知道数据是大端还是小端模式,才能正确地读取和存储数据起来,否则就会出错

小端:ubuntu用的一般是小端
大端:数据通过网络字节区

在这里插入图片描述
代码区分:

#include <stdio.h>
union aa{        /* 使用共用体判断 */
    unsigned char a;
    unsigned int b;
};
int main(void)
{
    union aa tt;
    tt.b = 0x12345678;
    if(tt.a == 0x78){
        printf("小端\n");
    }else if(tt.a == 0x12){
        printf("大端\n");
    }
    return 0;
}

二、linux系统操作命令

ls查看

  • ls -a // 显示隐藏文件
  • ls -l // 列出文件属性
  • ls -lh // 列举文件的时候将文件的属性信息一并显示,并把文件的大小按照单位显示
  • ls -i // 显示文件的inode号,文件系统,唯一识别文件的一个序号
  • ls -R // 递归显示所有文件,包括子目录文件

cd 命令

  • cd ~ 或cd 回到家目录下
  • cd - 回到上一次操作的目录下
  • cd / 切换到根目录下
  • cd . 切换到当前目录下
  • cd …/ 切换到上一级目录下

pwd命令

显示当前的路径

touch 创建文件

touch 文件名
如果文件存在,更新文件的时间戳
如果文件不存在,创建文件

touch 文件1 文件2 文件3 …
同时创建多个文件

mkdir 创建目录

mkdir 目录名 //用来创建目录
mkdir -p 1/2/3 创建具备层级关系的目录
mkdir -m 0777 list 创建一个具备0777权限的目录

chmod 修改权限

chmod 权限 文件/目录
例:
chmod 0777 hello/
将hello目录的权限修改为0777

chmod 0441 2.c
将2.c的文件的权限修改为0441

man命令

man 1 ==>查看命令帮助手册
例 :
man 1 ls

man 2 ==>查看系统调用的帮助手册
例:
man 2 open ==>查看系统调用函数open

man 3 ==> 查看库函数的帮助手册
例:
man 3 fflush

man 7 ==> 查看网络相关的帮助手册
例:
man 7 ip
man 7 socket

cp 拷贝

cp 文件/目录 目录
将文件或者目录拷贝到某一个目录下

cp 绝对路径/文件名 目录名
cp 相对路径/文件名 目录名
将一个文件拷贝到目标目录下

拷贝目录需要加-r 或 -a

cp 绝对路径/目录名  目录名  -r  或 -a
cp 相对路径/目录名  目录名  -r  或 -a
将一个目录拷贝到目标目录下

cp ./COPYING ~/test.c 
将COPYING文件拷贝到家目录下并重命名为test.c

cp ./net ~/1/2/3/aaa -r
拷贝目录的同时进行重命名

例:
1.在用户的家目录下,创建一个my-dir目录
cd
mkdir my-dir

2.将/etc下的passwd文件拷贝到my-dir目录下,并重命名为farsight.c
$ cp /etc/passwd ~/my-dir/farsight.c

3.将etc下的groff目录拷贝到my-dir下,并重命名为hello
cp /etc/groff/ ~/my-dir/hello -r

mv 移动

如果目标目录存在表示移动,如果不存在重命名
mv 文件/目录 目标目录下
mv 1.c ~
//将当前的1.c文件移动到/home/linux下
mv hello/ ~/1/2/3 (注意不需要加-r)
//将当前目录下的hello目录,移动到1/2/3目录下

重命名:
mv test.c farsight.c
将test.c重命名为farsight.c文件

mv net/ netnet/
将net目录重命名为netnet目录

例:
1.在用户的家目录下,创建一个my-dir1目录
cd
mkdir my-dir1

2.将/etc下的passwd文件拷贝到my-dir1目录下,并重命名为farsight.c (不使用cp重命名)
cp /etc/passwd ~/my-dir1/
mv passwd farsight.c

3.将etc下的groff目录拷贝到my-dir1下,并重命名为hello (不使用cp重命名)
cp /etc/groff/ ~/my-dir1/ -r
mv groff/ hello/

4.将my-dir1移动到共享目录下
mv ~/my-dir1 /mnt/hgfs/share

rm命令

rm 文件名 //删除文件
rm 目录名 -rf //删除目录 -r 递归删除
//-f 强制删除

rm *.c -f //强制删除所有的.c文件

例:
rm !(22.txt) //删除22.txt之外的所有的文件

cat命令

cat 命令用于查看文件内容,后跟文件名作为参数。
cat -n //显示每一行的行号

more命令一页一页显示文件内容,用法与cat一致
more在命令会在最后显示一个百分比,表示已显示内容占整个文件的比例。按空格键向下翻动一页,按Enter键向下滚动一行,按Q键退出

echo 命令

  • echo “123123” 将字符串显示到终端上
  • echo 123123 > 1.c //重定向,本来要在终端上显示的字符串,重定/向到1.c
  • echo 123123 >> 1.c //>>追加,在文件的尾部新起一行,将字符串写入这一行

例:
在这里插入图片描述
在终端输入echo $? ==>可以查看int main函数的返回值

tty命令->查看当前终端号

在这里插入图片描述

clear 命令

清屏 或者 ctrl + l

ldd命令 ->查看文件依赖哪些库

ldd + 文件名
在这里插入图片描述

printenv命令->打印环境变量

eog命令 + 图片名-> 显示图片

权限掩码 umask命令

在这里插入图片描述

修改权限掩码

umask 0(把权限掩码去掉)
在这里插入图片描述

安装软件命令

linux软件包的管理
(1)rpm(redhat)
(2)deb(ubuntu)
在.deb这个软件包中包含可执行程序,
说明文档,man手册,配置文件等。

软件包的命名规则:
sl _ 3.03 - 16 _ i386 . deb
软件名 版本号 修订版本 架构 包的后缀

i386 :32位操作系统
amd64:64位操作系统

离线安装命令dpkg

在安装软件的时候,不会检查软件的依赖关系
安装软件:
sudo dpkg -i 软件包名
例:
sudo dpkg -i sl_3.03-16_i386.deb
查看安装软件的版本号
sudo dpkg -l 软件名
查看软件对应的各种信息安装的位置
sudo dpkg -L 软件名
软件的卸载(配置信息会保留)
sudo dpkg -r 软件名
完全卸载
sudo dpkg -P 软件名

在线安装apt-get

先检查软件的依赖,如果发现软件有依赖的其他软件,一并安装到自己的系统中

1.更新本地的源
sudo apt-get update
2.安装软件(/var/cache/apt/archives)
sudo apt-get install sl //安装小火车应用程序
sudo apt-get install oneko //安装一个小猫
sudo apt-get install bastet //俄罗斯方块
sudo apt-get install frozen-bubble //泡泡龙
sudo apt-get install kolourpaint4 //画图板
sudo apt-get install xawtv //打开摄像头的软件
sudo apt-get install -f sl //强制安装
3.卸载软件
sudo apt-get remove 软件名
4.获取软件的源码
sudo apt-get source 软件名
(获取软件对应源码)
例:
sudo apt-get source sl //下载sl的源码
tar -xvf sl_3.03.orig.tar.gz //解压
cd sl-3.03.orig //进入解压后的目录
vi sl.c //这个就是sl的源码
5.只下载不安装(下载到当前路径下)
sudo apt-get download 软件名
6.清除下载的软件包
sudo apt-get clean

仓库1 仓库2 … 仓库n
|------------------------|
|
服务器1 服务器2 … 服务器n
由于用户所在的位置不同,访问服务器的时候,速率也不同。
选择这个访问最快的服务器自己使用。
比如选择的服务器是163服务器。
选择163服务器的方法如下:
1.点击->search->Update Manager->settings->
输入密码1->ubuntu software->download from->
->http://mirrors.163.com/ubuntu

可以将上述的服务器1中的仓库的地址同步到ubuntu的本机上,
在本机上/etc/apt/source.list //源路径-如163服务器

每一个仓库中又有很多的软件包,在本机的这个目录
/var/lib/apt/lists/下记录的就是软件的链接位置。 //各个软件的地址

错误1:
如果提示错误在错误信息中看到/var/lib/apt/lists/内容
解决办法:
cd /var/lib/apt/lists/
sudo rm * -rf

错误2:
ubuntu没有联网?
联网的方法如下:
1.在vmware中找到“编辑”选项->虚拟网络编辑器->
更改设置->如果点进来没有看到vnet0 vnet1 vnet8
->点击还原默认配置(需要在关机情况下进行)

2.在上述还原默认配置之后,选择vnet0,桥接模式
在桥接模式先选择
1.自动
2.pcie :有线网卡
3.wireless:无线网卡选择完之后点击确认
3.虚拟机->设置->硬件->网络适配器->选择“桥接模式”
4.做完上述操作之后“开机”
5.在开机之后,在ubuntu窗口的右上角能看到上下箭头或者wifi图标的选项,点击->edit connections–>将看到的默认选项删除—>点击add添加一个联网的选项—>然后关闭即可。

6.测试是否能联通
ping www.baidu.com

PING www.a.shifen.com (182.61.200.7) 56(84) bytes of data.
64 bytes from 182.61.200.7: icmp_req=1 ttl=53 time=5.27 ms

在ubuntu中阅读代码的工具ctags

1.安装ctags工具
sudo apt-get install exuberant-ctags
2.创建索引
ctags -R ==>会生成一个tags的索引文件

执行make tags ==> 在内核中创建索引文件
3.查找
3.1在终端上查找
vi -t 想查找的对象
若vi -t 无法使用,可以在查看的内核源码处,执行make tags
3.2在文件内查找
ctrl+] 跳转到实现的位置
ctrl+t 返回

压缩和打包

1. 压缩:对象是文件

将文件可以压缩成如下格式的文件
.gz ---->gzip
.bz2 ---->bzip2
.xz ---->xz
上述三者的压缩率从上到下逐渐递增
上述三者的压缩速率从上到下逐渐递减

例:

gzip COPYING       //将COPYING压缩成COPYING.gz
                   //压缩完之后源文件就不存在了
gunzip COPYING.gz  //将.gz格式的压缩文件解压

bzip2 COPYING      //将COPYING压缩成COPYING.bz2
				   //压缩完之后源文件就不存在了
bunzip2 COPYING.bz2 //将.bz2格式的压缩文件解压

xz COPYING         //将COPYING压缩成COPYING.xz
				   //压缩完之后源文件就不存在了
unxz COPYING.xz    //将.xz格式的压缩文件解压

2.打包(归档):对象是目录

tar 参数 对象
参数:

  • -c :打包
  • -x :解包
  • -v :显示打包或者拆包的过程信息的
  • -f :f可以理解为file,f后必须跟文件名
  • -z :压缩成gzip格式
  • -j :要压缩成bzip2格式
  • -J :要压缩成xz格式

打包的命令如下
tar -cvf 目录名.tar 目录名/
注意:c和v位置可以互换,但是f一定是在最后的位置的

拆包的命令如下:
tar -xvf 目录名.tar
就会生成以"目录名"命名的目录

例:有一个名为"work"的目录名

tar -czvf work.tar.gz work/ 打包并压缩
tar -xzvf work.tar.gz

tar -cjvf work.tar.bz2 work/
tar -xjvf work.tar.bz2

tar -cJvf work.tar.xz work/
tar -xJvf work.tar.xz

通用的解压命令
tar -xvf 名字.tar.bz2

目录在打包的时候,可以更换打包名字,但是解压出来名字还是原来的名字

文件操作的命令

文件的查看

vim 文件名(可以查看文件,也可以来编辑文件)

cat命令

cat -n 文件名
将文件的内容和行号显示到终端上

cat /etc/issue
用来查看ubuntu的版本号

head命令

head 文件名
默认显示文件中的前10行

head -20 文件名
显示文件的前20行的内容

head -3 文件名
显示文件的前3行的内容

tail命令 ->tail -f +文件名 实时显示文件更新

tail 文件名
显示文件的后10行

tail -20 文件名
显示文件的后20行

显示文件的13-16行
head -16 文件名 | tail -3
|(管道符):这个符号的功能是将前面的结果,作为下一个命令的输入。

例:
请将用户信息显示到终端上
用户信息存放在 /etc/passwd里面在第40行的位置
c: x:1000:1000:c,:/home/c:/bin/bash
c: \表示用户名
x: \表示有密码 -> 密码存放在 /etc/shadow 里面
1000:\ 表示用户的序列号
1000: \ 表示组的序列号
c \ 表示用户信息的描述字段
/home/c: \ 用户的主目录
/bin/bash \命令行解析器

使用:head -40 /etc/passwd | tail -1

more命令

more 文件名 //按照文件的本分比显示
按下回车往下显示

less命令

less 文件名
上键 向上显示
下键 向下显示
退出的时候使用q键

查看二进制文件

od -c 二进制文件名(例:a.out)

文件中内容搜索的命令 grep

grep “main”(要搜索的内容) * 参数
参数:
-n: 显示搜索到的行号
-R: 递归搜索
-i: 忽略大小写
-w: 精确搜索,只能知道main 对应的内容,main有前缀或后缀都检测不到

搜索以main开头的行:“^main”
搜索以main结尾的行:“main ” " m a i n ” "^main "main":只有有main这一个单词

grep “main” * -nR //经常用的一种写法
例:
在这里插入图片描述

文件搜索命令 find

find 路径 -name 文件的名字
例:
find ./ -name test.c
搜索当前目录及子目录的所有的以test.c命名的文件
find …/…/ -name test.c
搜索上上级目录及子目录下的所有的以test.c命名的文件

find -name 文件名 (常用的写法)
搜索当前目录及子目录的所有的以test.c命名的文件

注意:
如果find命令在当期目录下所有搜索文件的时候,
不能模糊搜索(不能使用通配符号),必须精确搜索。
否则出现如下错误:find -name *.c
find: paths must precede expression: test.c

find -name * .c -exec grep -l “main” {} ;
// find -name *.c 搜索当前目录及子目录中的
所有的.c结尾的文件
//-exec grep:执行完find之后去执行grep命令
//-l :显示文件列表
//“main” :被搜索的字符串
//{} :它代表的是就是find -name *.c搜索
到的结果文件。
// ; :-exec执行的时候遇到;才会停止,
:但是由于;是一个特殊字符,必须使用
:转译才可以。

文件中内容截取cut(以行为单位处理)

cut(处理的时候是以行为单位)
-d :分割符号
-f :域

例:
test.txt
北京市:海淀区:育新花园:17号楼:304室
cut -d : -f 1 test.txt==>北京市
cut -d : -f 2,4 test.txt==>海淀区:17号楼
cut -d : -f 1,3-5 test.txt==>北京市:育新花园:17号楼:304室

北京市"海淀区"育新花园"17号楼"304室
cut -d " -f 2 test.txt ==>海淀区

例:
1.请将用户信息中的/etc/passwd
在终端上显示 用户名:uid:pid

结果:linux:1000:1000
命令:head -40 /etc/passwd | tail -1 | cut -d : -f 1,3-4

2.请将用户信息文件中,当前用户的行号显示出来
结果:40
命令:cat /etc/passwd | cut -d : -f 1 | grep “c” -nw | cut -d: -f 1

通配符

“*” 可以匹配任意长度的字符

例:
1.c 2.c 3.c 123123123.c sdfsfsdfsd.txt
ls * .c
显示当前目录下的所有的.c结尾的文件

? 只去匹配一个字符

例:
aa1.c aa2.c aaa.c aa12.c
ls aa?.c
结果是:aa1.c aa2.c aaa.c

[字符1字符2…字符n]

通配[]内部的任意的一个字符
例:
aa1.c aa2.c aaa.c aab.c
ls aa[1ab].c
结果:aa1.c aaa.c aab.c

[起始字符-结束字符]

通配起始字符到结束字符中的任意一个字符
例1:
aa1.c aa2.c aaa.c aab.c
执行:ls aa[1-9].c
结果:aa1.c aa2.c
执行:ls aa[a-z].c
结果:aaa.c aab.c
例2:
aaa.c aab.c aaA.c aaB.c
执行:ls aa[A-C].c
结果:aaA.c aab.c aaB.c
想得到的结果:aaA.c aaB.c

出现上述的原因是系统的语系问题,本地
的语系中字母的排序是
aAbBcC…zZ
解决办法:export LC_ALL=C
LC_ALL是系统中保存本地语系的一个变量
=C作用清除本地语系。
上述命令只在当前终端生效,换一个终端,
或者重启ubuntu就不生效了。

清除后的语系的排序:
abcd…z ABCD…Z

执行上述操作之后就可以得到正确的结果了
ls aa[A-C].c
结果:aaA.c aaB.c

[^ 字符1字符2…字符n]

通配除字符1 字符2 … 字符n之外的所有字符

例:
aa1.c aa2.c aaA.c aaB.c aaY.c aaa.c aab.c aay.c
执行:ls aa[^1y].c
结果:aa2.c aaA.c aaB.c aaY.c aaa.c aab.c

通配符含义
[:alnum:]代表英文大小写字母及数字
[:alpha:]代表英文大小写字母
[:blank:]代表空格和tab键
[:cntrl:]键盘上的控制按键,如CR,LF,TAB,DEL
[:digit:]代表数字
[:graph:]代表空格符以外的其他
[:lower:]小写字母
[:print:]可以被打印出来的任何字符
[:upper:]代表大写字母
[:space:]任何会产生空白的字符如空格,tab,CR等
[:xdigit:]代表16进位的数字类型

文件权限的修改

d r-x r-x r-x 2 c c 4096 6月 18 17:09 dem01
r-x r-x r-x:权限
2:硬链接数
c : 用户
c : 组

修改用户的权限chmod

r-x r-x r-x
第一个表示:用户的权限 用 u 表示
第二个表示:组的权限 用g表示
第三个表示:其他用户的权限 用o表示

用+ :给权限
用- :去除权限

chmod u+w dem01 //给用户添加写的权限
chmod g-r dem01 //清除组读的权限
chmod uo+x aaA.c //将用户和其他人的可执行的权限添加上
chmod ugo+w aaA.c //将所有的写的权限添加上去
chmod a+w aaA.c //将所有的写的权限添加上去
a相当于ugo

修改文件所属的用户chown

chown 新用户名 文件
例:
将day2.txt文件所属的用户修改为root
sudo chown root day2.txt

将day2.txt文件所属的用户和组修改为root
sudo chown root:root day2.txt

将day2.txt文件所属的组修改为linux
sudo chown :linux day2.txt

修改文件所属组的命令chgrp

chgrp 新的组名 文件
例:
将day2.txt文件所属的组修改为root
sudo chgrp root day2.txt

链接

软链接 ln -s

软链接类似于windows的快捷方式
ln -s 被链接的文件 创建的链接文件
例:ln -s ~/exercise/dem01/num.c /home/c/1
软链接 可以链接文件或目录,两个都需要是绝对路径

建立软链接后,把软链接删除对原文件没影响
ln -f 强制创建链接文件,如果目标存在,那么先删除掉目标文件,然后再建立链接文件。
软链接特点:
①可以连接到目录
②可以跨文件系统
③删除源文件后,软链接文件也就打不开了
④符号连接文件通过->来指示具体的链接文件
⑤软链接需要创建给出绝对路径
拷贝 应使用 cp -d 命令,保持原文件类型不变

硬链接 ln

相当于是文件的别名
ln 被链接的文件 创建的链接文件
例:ln days my_days
建立硬链接后,两个文件是独立的文件,但是更改其中一个里面的内容后,另一个里面的内容也会更改
①具有相同inode的多个文件互为硬链接文件,创建硬链接相当于文件实体多了入口
②对于硬链接文件,只有删除了源文件以及对应的所有硬链接文件,文件实体才会被删除
③根据硬链接文件的特点,我们可以通过给文件创建硬链接的方式来防止文件误删除
④不论修改源文件还是链接文件,另一个文件的数据都会被改变
⑤硬链接不能跨文件系统 因为硬链接是根据inode号识别的
⑥硬链接不能连接目录
由于以上这些限制,硬链接不常用

用户管理命令

vi /etc/hostname ==> 修改主机名
vi /etc/hosts ==> 修改主机名
在172. … 里面把名字修改为主机名
在终端输入 hostname 可以查看

/etc/passwd =>用户信息的文件
/etc/group =>组信息的文件
/etc/shadow =>密码的文件
/etc/skel =>系统配置文件的模板目录

添加用户 adduser (添加组addgroup)

例:添加farsight 用户
sudo adduser farsight //添加fasight用户

添加时候显示如下信息:
Adding user farsight' ... Adding new group farsight’ (1001) … =>组名及id号
Adding new user farsight' (1001) with group farsight’ …=>用户名及id号
Creating home directory /home/farsight' ... Copying files from /etc/skel’ … =>/etc/skel模板目录,里面是系统配置文件
Enter new UNIX password: =>密码2
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for farsight
Enter the new value, or press ENTER for the default
Full Name []: =>名字
Room Number []: =>地址
Work Phone []: =>电话
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
在这里插入图片描述

新添加用户没有sudo权限解决方法

执行sudo 出现如下错误:
farsight:is not in the sudoers file.This incident will be reported

解决办法:
首先切换到root 用户
su root
cd /etc/
chmod u+w sudoers //给sudoers这个文件的用户的写的权限添加上去
vi sudoers
找到 root ALL=(ALL:ALL) ALL
添加 farsight ALL=(ALL:ALL) ALL //表示给farsight用户sudo的权限
然后执行 chmod u-w sudoers //把添加的权限去掉
重启系统就生效了(16.04不用重启)

关机或重启命令

sudo shutdown -h +50 //50分钟后关机
sudo shutdown -h 10:30 //10:30关机
sudo shutdown -h now //立即关机
sudo poweroff //立即关机

sudo shutdown -r +50 //50分钟后重启
sudo shutdown -r 10:30 //10:30重启
sudo shutdown -r now //立即重启
sudo reboot //立即重启

用户切换命令 su 用户名 (输入当前用户的密码即可)

退出用户 exit

修改密码的命令 sudo passwd 用户名

用户信息修改命令usermod

切换用户,当前用户没有登录 //使用该命令,用户应处于没有登录状态

sudo usermod -aG linux farsight // 将farsight用户追加到linux组中

sudo usermod -c “hellohellohello” farsight //用来修改farsight用户/etc/passwd中描述字段信息,
//这里的,描述字段就是登陆时候显示的名字

sudo usermod -d /home/hello farsight // 用来修改用户的主目录,将farsight的主目录修改为/home/hello

sudo usermod -l hello farsight // 将farsight的用户名修改为hello

sudo usermod -g linux hello //将hello用户所属的组修改为linux(组名)

问题:修改完用户信息后,新用户通过图形界面登录不进去?

可以通过终端登录进入?
错误的原因是执行了如下命令:
sudo usermod -d /home/hello farsight

解决办法:
(fn)ctrl + alt +F1 ===>进入虚拟终端
1.将farsight目录下的内容拷贝到hello目录下
(注意这里需要将文件和hello目录的用户和组从root
用户修改当前用户和组即可)

2.sudo usermod -d /home/farsight hello
(fn)ctrl + alt +F7 ===>退出虚拟终端

查看用户信息的命令 id 用户名

删除用户deluser (删除组delgroup)

删除用户需要把用户关闭,在另一个用户进行
sudo deluser hello(要删除的用户) //删除用户,并将用户的主目录删除掉

磁盘操作相关命令

查看ubuntu系统的磁盘 sudo fdisk -l

查看磁盘使用量信息的命令 sudo df -h

/media/c/FAT32是U盘的目录
在这里插入图片描述

查看磁盘挂载相关的命令 sudo mount

一般为设备名(/dev/sdb1)目录名

对硬盘操作相关的命令

sudo fdisk /dev/sdb
Command (m for help): m
Command action
d 删除分区
l 列举分区
m 打印帮助菜单
n 添加新的分区
p 打印磁盘菜单
q 不保存退出
w 保存退出

指定磁盘类型的命令

在这里插入图片描述
sudo mkfs.ext4 /dev/sdb2 ===>ext4 日志文件系统 ubuntu
sudo mkfs.ntfs /dev/sdb2 ===>ntfs 单个文件可以超过4G

环境变量问题

保存系统启动相关,或者系统配置相关的变量。
在系统中可以通过env命令打印系统当前的环境变量

HOME=/home/linux #linux用户家目录
PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

添加只对当前终端生效的环境变量

export PATH=${PATH}:/home/c //使用绝对路径 并且只对当前层有效,进入下一层或上一层失效
在这里插入图片描述

添加只对当前用户生效的环境变量

.bashrc (在用户家目录下)
vi .bashrc
在最后添加
export PATH=${PATH}:/home/c
重启ubuntu生效

添加对所有用户生效的环境变量

sudo vi /etc/environment
在最后添加:
PATH=“/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/c/

网络相关命令

ip

主机在网络中的一个编号,这个编号就是ip地址

ip组成

网络号+主机号 组成

ip表示方式

点分十进制

ip的种类

ipv4 (4字节,32bit) ipv6(16字节,128bit)

.ipv4的网段划分

等级网络号主机号最高位范围使用单位
A1字节3字节0[0-127]政府、大公司、学校
B2字节2字节10[128-191]中等规模公司
C3字节1字节110[192-233]个人
D1110[224-239]组播
E11110[240-255]未使用或(实验室)

A : 0.0.0.0 - 127.255.255.255 //A网段地址范围

B: 128.0.0.0-191.255.255.255 //B网段地址范围

C:192.0.0.0-223.255.255.255 //C网段地址范围

D:224.0.0.0-239.255.255.255 //D网段地址范围

E:240.0.0.0-255.255.255.255 //E网段地址范围

子网掩码

例: 子网掩码:获取网络编号 192.168.1.160 & 255.255.255.0
得 : 192.168.1.0

网关

和外网通讯的ip地址,叫网关,一般咱们认为交换机的ip地址

DNS 域名解析器

www.baidu.com -->182.61.200.7

查看网络的命令 ifconfig

图像界面设置静态IP

address : 192.168.1.250
netmask : 255.255.255.0
gateway : 192.168.1.1
DNS : 8.8.8.8

重启网络管理服务
sudo service network-manager restart

测试:
ping www.baidu.com
PING www.a.shifen.com (182.61.200.7) 56(84) bytes of data.
64 bytes from 182.61.200.7: icmp_req=1 ttl=53 time=4.56 ms

使用命令配置网络
sudo vi /etc/network/interfaces
auto ens33
iface ens33 inet static
address 192.168.0.106 //ip 根据实际情况设定
netmask 255.255.255.0
gateway 192.168.0.1 //根据实际情况设定
broadcast 192.168.0.255 //根据实际情况设定
dns-nameservers 8.8.8.8

重启:
sudo /etc/init.d/networking restart 或 sudo systemctl restart NetworkManager.service

注意,上述重启之后需要修改配置文件,联网图标才能正常显示
在 /etc/NetworkManager/NetworkManager.conf. 中修改
ifupdown:managed=false ==>true //把false 修改为true

在这里插入图片描述
在这里插入图片描述

vim使用

先安装vim编辑器:
sudo apt-get install vim-gtk

修改自动补全的文件

linux@ubuntu:~/.vim/snippets$ vi c.snippets 路径
70 snippet main
71 #include <stdio.h>
72
73 int main(int argc, const char *argv[])
74 {
75 ±-- 2 lines: ${1}---------------------------------------------------------------------
77 }
~

vim分为三种工作模式

1.命令行工作模式

打开一个新的文件默认在命令行模式,或者按下键盘上的Esc键,也能回到命令行模式

复制 y

yy 复制光标所在的一行
3yy 复制光标所在的向下三行
nyy 复制光标所在的向下n行

使用鼠标选中想要拷贝的行,按下键盘的y

按下键盘的shift键,鼠标选中想要拷贝的行,
松开shift键,右键拷贝即可,然后在windows中粘贴。

如果是16.04之后的版本中,shift不松开即可。

剪切 d

dd 剪切光标所在的一行
3dd 剪切光标所在的向下三行
ndd 剪切光标所在的向下n行
使用鼠标选中想要剪切的行,按下键盘的d

dG 剪切光标所在到尾行的所有内容
dgg 剪切光标所在到首行的所有内容

gg直接跳到首行
G直接跳到尾行
粘贴 p

p 将缓冲区的内容粘贴,在光标的下一行粘贴

撤销 u
反向撤销 ctrl + r
代码对齐

gg=G
或者
鼠标选中想要 对齐的行,然后按下键盘的“=”

搜索及高亮显示

/^abc :高亮显示abc开头的行
/abc$ :高亮显示abc结尾的行
/^abc$ :高亮显示abc开头并结尾的行

插入模式

从命令行模式进入到插入模式
i :在光标前进入插入模式
I :在光标的行首进入插入模式
a :在光标后进入插入模式
A :在光标的行尾进入插入模式
o :在光标的行的下面新起一行进入插入模式
O :在光标的行的上面新起一行进入插入模式

底行模式

从命令行模式进入到底行模式shift + :

保存/退出文件

:w 保存
:q 退出
:q! 不保存退出
:wq 或x 保存退出
:wq! 强制保存退出
:wa 保存所有的文件
:qa! 不保存退出所有文件
:wqa 保存退出所有文件

水平打开多个文件 vsp 文件名
垂直打开多个文件 sp 文件名
拷贝、剪切
:7,8y 拷贝7-8行,通过命令行的p进行粘贴
:4,$y 拷贝4-尾行的内容
:1,7y 拷贝文件开头到第七行的内容
:7,8d 剪切7-8行,通过命令行的p进行粘贴
:4,$d 剪切4-尾行的内容
:1,7d 剪切文件开头到第七行的内容
:n 跳转到第n行
vi test.c +100 打开文件的时候直接跳转到100行
:set nonu 取消行号
:set nu 显示行号
.:nohl 取消高亮显示
替换
**:%s/旧字符串/新字符串/g**  
例:
               **:%s/abc/www/g**
		//表示将文档中的所有的abc替换为www
		**:%s/abc/www/** 
		//表示将文档中每行首次出现的abc替换为www
             **:3,7s/abc/www/g**
		//表示将3-7行所有的abc替换为www
		**:3,7s/abc/www/**
		//表示将3-7行首次出现的abc替换为www
	       **:4,$s/abc/www/g**
		//表示将4到尾行所有的abc替换为www
		**:4,$s/abc/www/**
		//表示将4到尾行首次出现的abc替换为www

三 、shell编程

shell定义

(1)sh :(全称 Bourne Shell)是UNIX最初使用的 shell,
而且在每种 UNIX 上都可以使用。Bourne Shell 在 shell
编程方面相当优秀,但在处理与用户的交互方面做得不如
其他几种 shell。
(2)csh :是一种比 Bourne Shell更适合的变种 Shell,它的语法与 C 语言很相似

(3)ksh :集合了 C Shell 和 Bourne Shell 的优点并且和 Bourne Shell 完全兼容。

(4)bash :LinuxOS 默认的,它是 Bourne Shell 的扩展。
与 Bourne Shell 完全兼容,并且在 Bourne Shell 的基
础上增加了很多特性。可以提供命令补全,命令编辑和命
令历史等功能。它还包含了很多 C Shell 和 Korn Shell
中的优点,有灵活和强大的编辑接口,同时又很友好的用户界面

什么是shell脚本

它本身是一个以sh结尾的文件。在这个文件中就是命令的集合以及一些复杂的逻辑语句。

#!/bin/bash
作用:指定解析这个脚本文件的解析器是bash

执行shell脚本

./脚本名 (chmod 0777 脚本名.sh)

bash 脚本名

source 脚本名

三者的区别

  1. ./执行脚本的时候需要权限
    bash/source执行脚本的时候不需要权限

  2. ./和bash在执行脚本的时候,系统会自动新开一个子终端,子终端我们看不到,在子终端执行完之后,将执行的结果返回给当前终端
    source 解析脚本的时候是在当前终端解析

shell中变量

在shell中变量不需要定义,也没有数据类型,直接使用即可

shell中的变量的变量名和c语言类似
1.不能和shell中的关键字重复 test if while echo cat

2.变量名一般写成大写的

3.变量名命名格式数字,字母,下划线,不能以数字作为开头

变量引用

$ 变量名 或者 ${变量名}

$() 错误的用法

变量赋值

变量再被赋值的时候,都是字符串,就没有整形,字符型,字符串类型,浮点类型之分

例:
VAR1= helloworld (一句话结束不需要向c一样加;)
VAR2='hello world V A R 1 ′ V A R 3 = " h e l l o w o r l d VAR1' VAR3="hello world VAR1VAR3="helloworldVAR1"

注意:
1.在赋值的时候=前后不允许有空格
2.如果在赋值的时候没有’'或"",赋值的字符串是不允许有空格的
3.’ '(单引号)在赋值的时候,可以有空格,但是不能够引用变量
4.“”(双引号)在赋值的时候,可以有空格,也能够引用变量,可以识别转译字符

shell中的注释

“#”单行注释
:<<EOF
被注释掉的多行
EOF

:<<!
被注释掉的多行
!
例:

#!/bin/bash
:<<EOF
	这是注释部分
EOF

:<<!
	这也是注释部分
!
# 这是单行注释部分

TMP=www.hqyj.com
VAR1=helloworld
VAR2='hello world\n$TMP'
VAR3="hello world\n$TMP"

echo -n ${VAR1}
echo $VAR2
echo -e $VAR3
echo  ${VAR1}

清除变量 unset

unset 变量名 #(注意不能再变量前加$)

位置变量

参数意义
$0显示脚本文件名
$1,$2,…$9分别包含第一个到第九个命令行参数,后面还可以加$10,$11,但是写的时候,要用大括号{}扩起来
$#包含命令行参数的个数,这个值不包含文件名这个成员
$@包含所有命令行参数:“$1,$2,…$9”,不包含文件名
$?1.程序上一步执行的结果,如果是0,表示执行成功了 如果是1,表示执行失败了。2.可以用来获取shell中函数的返回值
$*包含所有命令行参数:“$1,$2,…$9” ,不包含文件名
$$包含正在执行进程的ID号
例:
如果在执行脚本的时候使用的是**./**
**$0 => ./05var.sh**

如果在执行脚本的时候使用的是bash
$0 => 05var.sh
如果在执行脚本的时候使用的是source
$0 => bash

变量的作用域local

local 变量名
如果变量前不加local,默认的就是全局变量,如果添加了local只在{}内部有效

只读变量 readonly

readonly 变量名=“初值”

只读变量一定要赋初值,否则无意义

给变量赋值命令(命令->linux操作命令)

VAR1=` ls ` (注意这不是单引号,是~对应的符号)
VAR2=$(ls)

注意上面: 或者$()这叫做命令置换

例:

#!/bin/bash

readonly HELLO="fsdddsds" #只读变量
echo $HELLO
HELLO="123"  #HELLO是只读变量,在赋值会出错
echo $HELLO


Z=hello
echo $Z   #Z的值为hello
unset Z   #清除变量Z的值
echo $Z


VAR1=`ls`  #使用ls命令
VAR2=$(ls) #使用ls命令

echo $VAR1
echo $VAR2


echo $0    #输出脚本名
echo $1    #输出终端输入的第一个值
echo $2    #输出终端输入的第二个值
echo $3    #输出终端输入的第三个值

echo "----------------------------------------"
echo $*    #输出命令行参数,不包括脚本名
echo "----------------------------------------"
echo $@    #输出命令行参数,不包括脚本名
echo "----------------------------------------"
echo $#    #输出命令行参数个数,不包括脚本名

字符串相关操作

1.字符串长度

echo $ {# STRING}

2.字符串拷贝

VAR1=“hello”
VAR2=“world”
VAR1=${VAR2}

3.字符串的追加

VAR1=“hello”
VAR2=“world”
VAR3=“$VAR1 $VAR2”
VAR3=“hello $VAR2”
VAR3=‘hello’’ world’
VAR3=‘hello’" world"

4.字符串中子字符串的提取

STRING=“w w w . h q y j . c o m”

echo ${STRING:4} 输出 #hqyj.com
#从第四个字符开始提取,提取到字符串的结尾

echo ${STRING:4:4} 输出 #hqyj
#从第四个字符开始提取,提取4个字符

STRING=“w w w . h q y j . c o m”

echo ${STRING:0-6} 输出 #yj.com
#从倒数第六个字符开始向后截取,截取到字符串的尾部

echo ${STRING:0-6:2} 输出 #yj
#从倒数第六个字符开始向后截取,截取向后的两个字符

STRING=“www.hqyj.com.hqyj.com”

echo ${STRING# yj}* 输出 #.com.hqyj.com
#获取yj首次出现的字符后的内容(从左向右)

echo ${STRING## yj}* 输出 #.com
#获取yj最后一次出现的字符后的内容(从左向右)

echo ${STRING%yj }* 输出 #www.hqyj.com.hq
#获取yj首次出现的字符前的内容(从右向左)

echo ${STRING%%yj }* 输出 #www.hq
#获取yj最后一次出现的字符前的内容(从右向左)

例:

#!/bin/bash
STRING="www.hqyj.com"

echo ${#STRING} 
#获取字符串的长度

VAR1="hello"
VAR2="world"
VAR3="$VAR1 $VAR2"
VAR4='hello'' world'
echo $VAR3
echo $VAR4
#字符串的追加

#下面的都是字符串的提取方法
STRING="www.hqyj.com"
echo ${STRING:4}     #hqyj.com
echo ${STRING:4:4}   #hqyj
echo ${STRING:0-6}   #yj.com
echo ${STRING:0-6:2} #yj


STRING="www.hqyj.com.hqyj.com"
echo ${STRING#*yj}  #.com.hqyj.com
echo ${STRING##*yj} #.com
echo ${STRING%yj*} #www.hqyj.com.hq
echo ${STRING%%yj*} #www.hq

shell中的数组

shell中的数组只有一维数组,shell中的数组通过括号()代表。
shell中的数组也是不需要定义的,数组没有类型,全部认为是
字符串。

例:
arr=(11 22 33 “hello” “tt”)
arr=([0]=11 [2]=123123 [5]=“helloworld”)

数组成员重新赋值

数组名[下标]=新的值

数组成员的访问

${数组名[数组的下标]}

数组中所有成员

${数组名[@]} 或者 ${数组名[*]}

数组的成员的个数

${#数组名[@]} 或者 ${#数组名[*]}

数组成员的追加

arr=(${arr[@]} “rrr” “ttt”)
arr=(“rrr” “ttt” ${arr[@]})
例:

#!/bin/bash
arr=(
	11 
	22 
	33 
	"hello" 
	"world"
)

#echo ${arr[0]}
#echo ${arr[1]}
#echo ${arr[2]}
#echo ${arr[3]}
#echo ${arr[4]}
echo ${arr[@]}    #数组中成员的遍历
echo ${#arr[@]}   #数组中成员的个数
#arr=(${arr[@]} "rrr" "ttt") #数组的追加
arr=("rrr" "ttt" ${arr[@]})  #数组的追加
echo ${arr[@]}

unset arr  #清除整个数组中的成员
unset arr[0] #清除第0个成员

arr=(
	[0]=123 
	[2]="hello"
	[5]="ttt"
)
arr[1]="456"   #对数组中的成员赋值
#echo "arr[0] = "${arr[0]}
#echo "arr[1] = "${arr[1]}
#echo "arr[2] = "${arr[2]}
echo ${arr[*]} #数组成员的遍历
echo ${#arr[*]} #数组中(被赋值)成员的个数
echo ${#arr[1]} #a[1]成员中字符的个数

shell中的输入与输出

read输入

read 变量名

#从终端读取一个字符串赋值给变量

read 变量名1 变量2

#从终端读取两个字符串赋值给两个变量,
#字符串和字符串间使用空格或Tab作为间隔

read -a 数组名

#输入一个数组,数组的成员以空格分开

read -n number 变量名

#从终端读取n个字符给变量,如果输入的字符的格式=number,会自动结束输入

read -p “描述字段” 变量名

#在让你输入字符串给变量前先将描述字段给显示一下

read -s 变量名

#在输入的时候取消回显

read -t 5 变量名

#在5s内如果没有输入,read就结束输入。
例:

echo -n "请输入一个变量"
read VAR1 VAR2

echo $VAR1
echo $VAR2

echo -n "请输入一个数组"
read -a ARR
echo ${ARR[@]}
echo ${#ARR[@]}

echo -n "请输入一个字符串"
read -n 5 VAR   #字符串输入到5个后结束
echo 
echo $VAR


read -n 5 -p  "请输入一个整数> " VAR2
echo $VAR2


read -s -t 3 -p  "密码 > " VAR2
echo $VAR2

read  -t 10 -p "请输入一个有5个成员的数组" -a arr  #10s内没有输入,自动结束输入
echo ${arr[@]}

echo输出

echo $变量名

#打印变量的内容并会加上换行

echo -n $变量名

#打印变量的内容,不会加上换行

echo -e $变量名

#打印变量的内容并会解析转译字符 \n

运算符

算数运算符

* / % **(幂) = == != + -
++ – && || ! > <
由于shell中没有指定数据的类型,所有的变量都当成字符串来处理。
所以要完成两个变量的运算,需要使用shell中算数运算符、算数指令
shell中对两个变量直接进行运算,会被当成字符串来处理

(())整数运算
$[] 整数运算
let 整数运算
expr整数运算,字符串相关操作
上述运算方式,指向效率(())—>expr依次递减的expr可以做字符串相关的操作,其他的是不行的。

(())整数运算

((表达式))
((表达式1,表达式2,…表达式n))
如果(())有多个表达式,最后一个表达式的结果
就是这个(())运算的结果

1.(())内部使用变量的时候,变量前可以加 也可以不加 也可以不加 也可以不加符号
2.如果想获取(())执行的结果,必须在前面加上$(())
3.(())可以做复杂的运算,比如for循环 ,判断大小
例:

#!/bin/bash
read -p "请输入两个整数 >" VAR1 VAR2 #比如输入55,12
echo $(($VAR1 + $VAR2))   #输出67
echo $((VAR1 + VAR2))    #输出67
echo $(($VAR1 + $VAR2,$VAR1 - $VAR2)) #输出最后一个表达式的结果为43
#!/bin/bash
read -p "请输入两个整数 >" VAR1 VAR2 #比如输入55,12
VAR3=$((VAR1++))

echo $VAR1  #56
echo $VAR3  #55

VAR4=$((++VAR1))
echo $VAR1  #57
echo $VAR4  #57
#!/bin/bash

read -p "请输入两个整数 >" VAR1 VAR2 #比如输入 2 3
VAR3=$((VAR1 * VAR2))  
echo $VAR3    #6

VAR4=$((VAR1 ** VAR2))
echo $VAR4    #8

for((i=1;i<=100;i++)){
    ((sum+=i))
}
echo $sum    #5050

RET=$((3,4,5,6))
echo $RET    #6 输出最后一个数

a=6
b=5
VAL=$((a<b))
echo $VAL     #a<b为假,返回0
$[]整数运算

ret= [ 表达式 ] r e t = [表达式] ret= [表达式]ret=[表达式1,表达式2,…表达式n]
如果 [ ] 有多个表达式,最后一个表达式的结果就是这个 []有多个表达式,最后一个表达式的结果 就是这个 []有多个表达式,最后一个表达式的结果就是这个[]运算的结果

1.$[]在执行运算的时候,必须有变量去承接它的结果
$[a+b] #运行错误

必须按如下写法:
echo [ a + b ] r e t = [a+b] ret= [a+b]ret=[a+b]
2.在 [ ] 内部调用变量的时候,变量前可以加 []内部调用变量的时候,变量前可以加 []内部调用变量的时候,变量前可以加也可以不加 ∗ ∗ ∗ ∗ 3. ** **3. 3.[]不支持复杂的运算,比如for $[] 错误
例:

#!/bin/bash

a=5
b=6

ret=$[a + b]
echo $ret       #11

echo $[$a + $b] #11

c=$[a++]
echo $c         #5
echo $a         #6
a=5
b=6
var1=$[$a<$b]
echo $var1   #1
expr整数运算

1.expr中运算的时候,变量必须使用 ∗ ∗ ∗ ∗ 2. e x p r 在运算的时候,运算符前后必须加空格 ∗ ∗ ∗ ∗ 3. e x p r 运算的结果会自动打印到终端上 ∗ ∗ ∗ ∗ 4. 将 e x p r 运算的结果赋值给某个变量的时候要使用命令置换 ‘ ‘ 或者 ** **2.expr在运算的时候,运算符前后必须加空格** **3.expr运算的结果会自动打印到终端上** **4.将expr运算的结果赋值给某个变量的时候要使用命令置换 ` ` 或者 2.expr在运算的时候,运算符前后必须加空格3.expr运算的结果会自动打印到终端上4.expr运算的结果赋值给某个变量的时候要使用命令置换‘‘或者()

5.expr做自加运算不行,可以替换成a=expr $a + 1

6.expr在运算*时候需要加上转译字符 ,不能运算等等**
例:

#!/bin/bash

a=5
b=6
echo `expr $a + $b` #输出11
expr $a + $b        #输出11

a=`expr $a + 1`
echo $a             #输出6

mul=`expr $a * $b`
echo $mul           #输出36
expr字符串的操作

1.expr match 源字符串 子字符串
在源字符串中查找字符串差,如果源字符串中的
第一个字符和子字符串不相等结果为0,如果子字符串
有字符和源字符串中的字符不相等,返回的也是0.
否则返回的就是子字符串的长度。
例:

#!/bin/bash
string="www.hqyj.com"
expr match $string "www."  #输出4

**2.expr substr $string 4 3 **
在string中截取从第四个字符开始,向后的3个字符
例:

#!/bin/bash
string="www.hqyj.com"
expr substr $string 4 3  #输出.hg

3.expr index $string “hj” #5
那h字符在string查找第一次出现的位置,如果
找到了就返回它前面的字符的个数,字符个数包括它本身,然后结束。
若找不到接着拿j字符在string查找第一次位置
如果找到返回j前面的字符个数,否则返回0
例:

#!/bin/bash
string="www.hqyj.com"
expr index $string "hj"  #输出5

4.expr length $string
功能获取string变量字符串的长度

#!/bin/bash
string="www.hqyj.com"
expr length $string   #输出12
let整数运算

let 表达式1 表达式2 … 表达式n
1.let会运算所有的表达式
2.let中变量可以加 , 也可以不加 ,也可以不加 ,也可以不加
3.运算符的前后不能加空格
例:

#!/bin/bash

a=5
b=6

let sum=$a+$b
echo $sum    #11

let sum1=$a+$b sum2=$a+$b
echo $sum1   #11
echo $sum2   #11

let a=$a+1
echo $a      #6

let mul=a*b
echo $mul    #36

if语句

if 语句后面需要加空格 [ ] 里面的语句需要加空格与[ ]分开
if …then …fi

语法结构:
if [ 表达式 ] ===>[ ] 用作判断的和test效果是一样
then ===>[ ] 替换为if test 表达式
分支语句
fi

● 如果表达式为真,则执行命令表中的命令;否则退出if 语句,即执行fi后面的语句

● if 和 fi 是条件语句的语句括号,必须成对使用

● 命令表中的命令可以是一条,也可以是若干条
如:
if [ 表达式 ]
then
分支语句
elif [ 表达式 ]
then
分支语句
else
分支语句
fi

在if语句中判断数字的大小
符号判断
-gt大于
-lt小于
-ge大于等于
-le小于等于
-eq等于
-ne不等于
逻辑运算符
符号判断
-a&&
-o||
!!
例:
练习:
	90-100  A
	80-89   B
	70-79   C
	60-69   D
	<60     E
#!/bin/bash

read -p "请输入学生的成绩->" str1
if [ $str1 -ge 100 -o $str1 -le 0 ]    # 大于100 或者小于0
then
    echo "input error!"
    exit 1        #直接返回
fi
if [ $str1 -ge 90 -a $str1 -le 100 ]  #大于等于90 并且 小于等于100
then
    echo "A"
elif [ $str1 -ge 80 -a $str1 -lt 90 ]
then
    echo "B"
elif [ $str1 -ge 70 -a $str1 -lt 80 ]
then
    echo "C"
elif [ $str1 -ge 60 -a $str1 -lt 70 ]
then
    echo "D"
else
    echo "E"
fi

练习:
90-100 A
80-89 B
70-79 C
60-69 D
<60 E

if [ $score -gt 100  -o  $score -lt 0 ]
then
	echo "input error"
	exit 1
fi

if test $score -ge 90 -a $score -le 100
then
	echo "A"
elif test $score -ge 80
then
	echo "B"
elif test $score -ge 70
then
	echo "C"
elif [ $score -ge 60 ]
then
	echo "D"
else
	echo "E"
fi

1.对字符串的判断(在if语句中字符串需要加上"")

符号意义
-z判断字符串是否为空
-n判断字符串是否为非空
=或者==判断两个字符串是否相等
!=不等于
\>判断字符串大小,大于
\<判断字符串大小,小于
练习:

输入两个字符串,判断字符串的大小,并输出

#!/bin/bash

read -p "please input str1 > " str1
read -p "please input str2 > " str2

if [ -z "$str1" -o -z "$str2" ]
then
    echo "input string error,please try agian"
    exit 1
fi

if [ "$str1" == "$str2" ]
then
    echo "str1 = str2"
elif [ "$str1" \> "$str2" ]
then
    echo "str1 > str2"
else
    echo "str1 < str2"
fi

2.对文件的类型的判断bsp-lcd

-b 判断文件是否存在,并且判断文件是否是块设备

-c 判断文件是否存在,并且判断文件是否是字符设备

-d 判断文件是否存在,并且判断文件是否是目录

-f 判断文件是否存在,并且判断文件是否是普通文件

-L 判断文件是否存在,并且判断文件是否是链接文件

-S 判断文件是否存在,并且判断文件是否是套接字文件

-p 判断文件是否存在,并且判断文件是否是管道文件

-e 判断文件是否存在
如果文件存在,结果为真
如果文件存在,结果为假
(如果是链接文件,链接断开了,认为文件不存在)

-s 判断文件是否存在,并且判断文件是否为空

练习

请输入一个文件的名字,将它的类型输出

#!/bin/bash
read -p "请输入1个文件的名字" filename

if test -b $filename
then
    echo "这是一个块设备文件"
elif test -c $filename
then
    echo "这是一个字符设备文件"
elif test -d $filename
then
    echo "这是一个目录"
elif test -f $filename
then
    echo "这是一个普通文件"
elif test -L $filename
then
    echo "这是一个链接文件"
elif test -S $filename
then
    echo "这是一个套接字文件"
fi

3.文件权限的判断

-w 判断文件是否存在,并判断是否具备写的权限
-r 判断文件是否存在,并判断是否具备读的权限
-x 判断文件是否存在,并判断是否具备可执行的权限

练习

请输入一个文件,判断这个文件是否是普通文件,
如果文件是普通文件,判断文件是否具备写的权限,
如果文件具备写的权限,将"hello world"追加到文件尾部

#!/bin/bash

read -p "请输入1个文件的名字" filename
if test -f $filename        #判断普通文件
then
    if test -w $filename    #判断是否具有写的权限
    then
        echo  "hello world" >> $filename       
        echo "追加成功"
    else
        "文件不具备写的权限"
    fi
else
    if [ ! -e $filename ]
    then
        echo "文件不存在"
    else
        echo "输入的不是一个普通文件"
    fi
fi
./dem1.sh   #调用自己重新执行,文件名为dem1.sh

4.判断文件的时间戳

-nt 前面文件时间戳是否比后面文件的时间戳新
-ot 前面文件时间戳是否比后面文件的时间戳旧

5.判断文件的inode号是否相同

-ef 判断文件的inode是否相同

case … in 语句

case 变量 in
选项1)
分支1
;;
选项2)
分支2
;;
*)
分支n
;;
esac

练习1

1.在终端上输入一个字符,a-z A-Z打印这是一个字母
0-9这是一个数字, ,;“ ?这是一个标点符号

#!/bin/bash
read -p "输入一个字符" str1
case $str1 in
    [0-9])
        echo "这是一个数字"
        ;;
    [a-zA-Z])
        echo "这是一个字母"
        ;;
    , |. | \" | \?)        #? 是一个通配符,需要转义
        echo "这是一个标点符号"
        ;;
    *)
        echo "非法输入"
        ;;
esac

练习2

输入软件的名字[Y/N/Q]?来决定是否下载,用户的选择可以是Y y YES Yes yes等都要满足

#!/bin/bash
read -p "请输入软件的名字" name
read -p "是否进行下载->(y|n|q)" down
case $down in
    Y|y|YES|Yes|yes)
        echo "下载软件"
        ;;
    n|N|no|No)
        echo "不下载软件"
        ;;
    q|Q|Quit|QUIT)
        exit 1  #程序退出
        ;;
esac

while循环

while 表达式
do
循环体
done
♦ while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环

♦ while语句的退出状态为命令表中被执行的最后一条命令的退出状态
写 成while true 是死循环

练习1

时钟程序

#!/bin/bash
sec=58
min=02
hour=20
day=24
month=4
year=2020
function years()       #函数
{
    if ((year%100==0))
    then
        if ((year%400==0))
        then
            echo 1
        else
            echo 2
        fi
    elif ((year%4==0))
    then
        echo 1
    else
        echo 2
    fi
}
while true
do
    sleep 1
    ((sec++))
    if [ $sec -ge 60 ]
    then
        sec=0;
        ((min++))
    elif [ $min -ge 60 ]
    then
        min=0
        ((hour++))
    elif [ $hour -ge 24 ]
    then
        hour=0
        ((day++))
        case $month in
            1|3|5|7|8|10|12)
                if [ $day -ge 32 ]
                then
                    day=1
                    ((month++))
                fi
                ;;
            4|6|9|11)
                if [ $day -ge 31 ]
                then
                    day=1
                    ((month++))
                fi
                ;;
            2)
                ret=`years year`
                if [ $ret -eq 1 ]
                then
                    if [ $day -ge 30 ]
                    then 
                        day=1
                        ((month++))
                    fi
                elif [ $ret -eq 2 ]
                then 
                    if [ $day -ge 29 ]
                    then
                        day=1
                        ((month++))
                    fi
                fi
                ;;
        esac
        if [ $month -ge 12 ]
        then
            month=1
            ((year++))
        fi
    fi
    printf "%4d-%2d-%2d %02d:%02d:%02d\r" $year $month $day $hour $min $sec
done

练习2

求1-100的和

#!/bin/bash
i=1
while [ $i -le 100 ]
do
	((sum+=i++))
done
echo $sum

until循环

until 表达式
do
循环体
done
until循环和while循环的功能类似,只不过until循环中的表达式要和while循环的表达式结果相反,此时until和while的功能就是一样的了

练习1

1.实现一个累加器(在终端上可以任意多的输入数据它会将输入数的和给求出来)
ctrl + c 相当于给程序发送了一个杀死进程的信号
ctrl + d 相当于发送了一个EOF,可以让read结束

#!/bin/bash
i=1
until [ $i -gt 100 ]
do
	((sum+=i++))
done
echo $sum

for循环

c语言风格的for循环(算术运算)

for ((i=0;i<10;i++))
do
循环体
done
例:

#!/bin/bash

for ((i=1;i<=100;i++))
do
	((sum+=i))
done
echo $sum

shell特有风格的for循环(文件)

for 变量 in 单词列表
do
循环体
done
1.单词列表的成员间是通过空格隔开
2.单词类别中可以使用命令的结果,命令需要加上命令置换符号 `` $()
3.如果单词列表是连续的成员{start…end}
seq 1 100从1开始到100结束作为单词列表
seq 1 2 100 从1开始,中间跳过一个成员,到100结束
例:

#!/bin/bash

for i in `ls`
do
	echo $i
done

省略in部分的for循环

for 变量 ==>省略in部分,会把命令行参数作为单词列表
do
循环体
done

#!/bin/bash
#1-100的和
for num in {1..100}
do 
	((sum+=$num))
done
echo $sum
#循环列表是a-z字符
for num in {a..z}
do 
	echo -n $num
done

printf "\n"

#1-100求和,跳过偶数部分
for num in $(seq 1 2 100)
do 
	echo $num
	((sum+=$num))
done
echo $sum

#缺省in
for cmd_var
do
	echo $cmd_var
done

练习

(1)判断用户主目录下是否存在file-dir和dir-dir的
子目录,如果存在则提示用户是否删除,如果用户输
入的是 yes,则删除,然后新建,否则结束 , 如果不
存在,则新建

(2)输入一个指定路径的目录,将这个目录下的文件和
目录分开存放,将文件拷贝到用户主目录下的
file-dir子目录下,将目录拷贝到用户主目录下
的dir-dir子目录下,并且统计文件和子目录的个数

(3)输出拷贝的文件和目录的个数

#!/bin/bash

user=("/home/c/file-dir/" "/home/c/dir-dir/")

for dir in ${user[@]}
do
	if [ -d $dir ]
	then
		read -p "是否删除->$dir(y/n)" flase
		case $flase in
			y|Y|Yes|YES|yes)
				echo "删除$dir目录"
				rm $dir -rf

				echo "新建$dir"
				mkdir $dir
				;;
			n|N|NO|No|no)
				echo "退出..."
				exit 1
				;;
			*)
				echo "选择无效..."
				exit 1
		esac
	else
		echo "新建目录"
		mkdir $dir
	fi
done


read -p "请输入一个路径> " mypath

if test -d $mypath
then
	for file in `ls $mypath`
	do
		if test -f $mypath/$file
		then
			cp $mypath/$file ${user[0]}
			((f++))
		elif test -d $mypath/$file
		then
			cp $mypath/$file ${user[1]} -r
			((d++))
		fi
	done
else
	echo "输入的不是一个路径,请重试"
	exit 1
fi

echo "拷贝的文件的个数$f"
echo "拷贝的文件的个数$d"

select in 语句

select 变量 in 单词列表
do
语句
done

#!/bin/bash

select ch in  a b c d
do
	echo $ch
	break
done
#!/bin/bash
select sys in windows linux macOS ios Android
do
	case $sys in
		windows)
			echo "welcome using windows"
			;;
		linux)
			echo "welcome using linux"
			;;
		macOS)
			echo "welcome using macOS"
			;;
		ios)
			echo "welcome using ios"
			;;
		Android)
			echo "welcome using Android"
			;;
	esac
	break
done
#!/bin/bash
#PS3 它是系统的一个环境变量,默认值为#?
PS3="input >"
select ch in register login quit 
do
	case $ch in
		register)
			echo "注册"
			;;
		login)
			echo "登录"
			;;
		quit)
			echo "退出"
			exit 1
			;;
	esac
done

select会生成一个选择的列表,如下
1) a
2) b
3) c
4) d
#? ==>可以输入用户的选择,这里只能
==>只能输入数字,不能输入单词列
==>表中的选项
select如果没有输入ctrl+d或者break它会一直
执行。

在工作或开发过程中select和case语句结合使用。

#PS3 它是系统的一个环境变量,默认值为#?
PS3=“input >”

break和continue

用法:
break ==>退出一层循环
break n ==>退出n层循环
用法:
continue ==>跳过一层循环
continue n ==>跳过n层循环
例:
输出:1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16

#!/bin/bash

i=0
j=0

while ((++i))
do
	j=0
	while ((++j))
	do
		if [ $j -gt 4 ]
		then
			break
		fi

		if [ $i -gt 4 ]
		then
			break 2
		fi
		printf "%-4d" $((i*j))
	done
	printf "\n"
done

使用for循环实现

#!/bin/bash
j=1
for((i=1;i<=4;i++))
do
    for((j=1;j*i<=4*i;j++))
    do
        printf "%d\t" $((j*i))
    done
    echo   
done

shell中的函数

function 函数名()
{

}
1.shell中的函数没有参数列表
2.shell中的函数没有返回值类型
3.shell中的函数是使用function声明的
4.shell的函数名的命名和c语言一样
5.shell的函数如果不调用的话是不会执行的

函数的调用

函数名 参数列表1 参数列表2

函数的参数通过位置变量获取

$0 :脚本的名字
$1 $2 $3 …

$@ ∗ " * " "@" 将命令行的参数原封不动的传递给子函数
“$*” 将命令行的参数看成一个整体传递给子函数

shell中函数返回值的问题?

1.shell函数的的变量默认都是全局变量,
可以直接使用,但是如果变量被local声明了
它就变成了局部变量。
2.shell中的函数执行的结果可以通过return返回,
return返回的时候可以通过$?获取返回的结果。
返回值的范围是[0-255]

3.shell的函数可以通过echo来返回字符串
通过ret=`` 或ret=$() 获取结果,注意在
函数中使用一次echo即可,如果在函数内
使用了多次echo,获取的结果就是多次echo的值
中间通过空格分开

#!/bin/bash

function ShowVar()
{
	echo $0
	echo $1
	echo $2
	echo "----------------"
	echo $@
	echo "#########################"
}

#ShowVar $@
#ShowVar "$@"
#ShowVar $*
#ShowVar "$*"

function Add()
{
	((sum=$1+$2))
}

Add 12 23    #函数中的sum是全局变量
echo $sum    #可以直接获取值

function Add1()
{
	local sum
	((sum=$1+$2))
	return $sum
}

Add1 255 0   #函数中的local sum是局部变量,可以通过return返回【0-255】
echo $?     #$?获取上一步调用函数的结果

function ShowEcho()
{
	((sum=$1+$2))
	echo $sum
}

ret=`ShowEcho 255 255` #若函数需要返回【0-255】区间外的数据或者返回字符串 
echo $ret              #在函数中调用echo就行了,在调用函数执行的时候需要加上命
					   #令置换,不能通过$?获取结果

#ret=`ls /home/linux/` #通过对本次赋值理解为什么函数中的
#echo $ret             #echo没有输出

练习1

1.输入用户的名字,判断该系统上是否存在该用户
2.若存在该用户将这个用户名和uid和gid显示出来

#!/bin/bash

#打印行号
function check_user()
{
    local line=`cat /etc/passwd | cut -d : -f 1 |grep "$1" -nw |cut -d : -f 1`
    echo $line
}
#打印uid,pid
function show_user_info()
{
    local info=`head -"$1" /etc/passwd | tail -1 | cut -d : -f 1,3-4`
    echo $info
}
while true
do
    read -p "请输入用户的名 > " name

    if [ $name = quit ]
    then
        echo "退出用户查询系统"
        exit 1
    fi

    line=`check_user $name`
    if [ -z "$line" ]
    then
        echo "用户不存在"
        continue
    else
        echo "用户存在,行号是$line"
    fi
    info=`show_user_info $line`
    echo $info
done

练习2

封装一个对数组成员求和的函数,并将求得结果返回

#!/bin/bash

function array_sum()
{
	local sum
	for i
	do
		((sum+=$i))
	done
	echo $sum
}
arr=(11 22 33 44 55)
sum=`array_sum ${arr[@]}`
echo $sum

练习3

1.请输入一个路径,若此目录下文件是以.c结尾
的文件,并且是普通文件,请将这个文件编译,
若文件不是.c结尾的文件,请在文件结尾加上.bak

#!/bin/bash

read -p "输入一个路径" mypath

if test -d $mypath
then
    for file in `ls $mypath`
    do
        if test -f $mypath/$file
        then
            case $mypath/$file in
                *.c)
                    gcc $mypath/$file
                    mv a.out $mypath
                    ;;
                *)
                    base=${file%.*}     #把原来的后缀清除
                    mv $mypath/$file  $mypath/${base}.bak   #添加新的后缀
                    ;;
            esac
        fi

    done
fi

练习4

1.编写一个shell脚本完成如下功能 :
1.在家目录下创建文件夹filer
2.遍历当前文件夹下的文件,如果是普通文件则放入创建的filer中
3.打印出放入filer文件夹中的文件数目

#!/bin/bash
cd
mkdir filer


for file in `ls `
do
    if test -f $file
    then
        cp $file ./filer 
        ((f++))
    fi
done
echo "拷贝文件的个数$f"
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
设计shell脚本程序,运行结果如下: 当用户输入相应的数字执行相应的功能。 2、设计shell脚本程序,在屏幕上输出操作系统的信息,包括计算机名、Linux分发版本名称、Linux内核版本和当前的IP地址。 3、设计shell脚本程序,要求用户对/home目录下的文件进行备份,压缩为Linux系统常用的tar.gz格式。 4、设计shell脚本程序,假设用户建立了目录A和目录B,目录不包含子目录,要求用户编写一个脚本程序,比较两个目录内文件的差异。 5、设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其xx从01到30。 6、设计一个shell程序计算n的阶乘。要求: (1)从命令行接收参数n; (2)在程序开始后立即判断n的合法性,即是否有参数,若有是否为正整数,若非法请给错误提示; (3)最后输出计算的结果。 7、设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。 8、判断当前工作目录下所有的文件类型,如果是目录显示目录名,如果是文件查看文件内容,如果都不是,显示提示信息。 9、打印1-99之间的奇数到文件。 10、根据从键盘输入的学生成绩,显示相应的成绩等级,其60分以下为“Failed!”,60~70分为“Passed!”,70~80分为“Medium!”,80~90分为“Good!”,90~100分为“Excellent!”。如果输入超过100分或低于0分,则显示错误分数提示。 文件和目录部分 1、编写程序,打开一个文本文件 (1)读取其内容,将其复制到一个新建文件; (2)将文件的小写字母转换成为大写字母 ,其他字符不变。 2、编写程序,读取当前目录下的内容,并将其打印输出到终端。 3、编写程序,在/tmp目录下面建立一个test目录,然后在test目录下建立一个空文件hello.txt,注意函数出错处理。 4、编写程序实现一个简单的员工档案管理系统,具备简单的员工资料增加、删除和查询等功能,并采用二进制文件保存员工的资料信息。 5、为了便于文件的管理和传输,某些时候需要将特别大的文件切割为多个指定长度小的文件。现有一个文件管理程序需要实现大文件切割功能,要求用户编写一个函数实现该功能。 6、编写程序,根据输入的参数创建一个目录文件。 7、编写程序,首先输出当前的工作目录,然后更改工作目录,输出更改后的工作目录。 8、将存放学生各种信息的文件的学生信息读出,重新组成一个存放所有学生的前3门成绩的文件。 9、创建一个新目录,然后删除此目录。 10、编写程序,编写shell命令的ls命令。 11、编写程序,编写shell命令的pwd命令。 getcwd()会将当前工作目录的绝对路径复制到参数buffer所指的内存空间,参数size为buf的空间大小。 12、编写程序,编写shell命令的cp命令。 13、编写Shell命令的cat命令。 14、编写Shell命令的tail命令。(用缓冲技术来提高效率) 15、编写Shell命令的ls -i命令。 进程和信号部分 1、编写程序,获取并输出子进程和父进程的相关信息。 2、编写程序,要求用户设计多进程应用程序,改程序作为父进程执行,在执行过程能够通过调用自身创建一个子进程。父进程和子进程均在终端输出一条信息,标识自己的身份。 3、守护进程是运行于系统后台的进程,常用于提供各种系统服务和系统日志管理功能。现要求用户编写一个守护进程应用程序,定时向日志文件写入字符串。 4、编写程序,在不同的进程间实现信号发送和接收,同时在传达过程附加其他信息。 5、编写程序,使用alarm函数在系统设置一个定时器,期间对整数进行递减操作,并输出到屏幕。 6、现有一个应用程序在死循环执行要求用户让程序能够带捕捉用户按下的组合键Ctrl+C,终止应用程序的执行。 7、Linux系统提供了alarm( )和setitimer( )系统调用作为定时器的功能,要求用户使用这两个函数设计程序,让程序每隔一秒发出一个SIGALRM信号,每隔0.5秒发出一个SIGVTALRM信号。 8、编写程序,在主进程创建一个子进程,子进程进行空循环,不停地输出“hello world!”字符串,主进程休眠一段时间后,在主进程结束子进程,随后主进程也退出。 9、编写程序,在程序使用命令行形式显示程序所在当前文件夹下的内容。 10、编写程序,得到当前进程的标识号,并将它打印输出,随后写入一个文件。 11、在Linux系统下使用execl( )函数代替一个hello.c文件,在hello.c文件实现从1到100的累加计算。 网络编程部分 1、在Linux系统下,通过TCP协议的套接字编程,在服务器端的计算机上实现累加求和的计算,数据全部从客户端传送,然后在服务器端计算的和输出到终端,并传送回客户端。 2、在Linux系统下,实现IP地址转换,将名字地址转换为数字地址。 3、利用read函数编写读取客户端数据(提示在程序,首先监听一个端口,如果有客户端连接这个端口则接受这个连接,然后用read函数读取远程主机发送的数据,输出这些数据以后结束这个程序)。 4、编程实现一个面向连接的套接字服务程序和客户端程序。客户端打开一个文件,把文件内容传送给服务器端,服务器端接受到文件内容后,保存在/tmp目录下。 ...... ......
文件为doc版,可自行转成txt,在手机上看挺好的。 本资源来自网络,如有纰漏还请告知,如觉得还不错,请留言告知后来人,谢谢!!!!! 入门学习Linux常用必会60个命令实例详解 Linux必学的60个命令 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不开使用系统提供的命令。要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。 不同Linux发行版的命令数量不一样,但Linux发行版本最少的命令也有200多个。这里笔者把比较重要和使用频率最多的命令,按照它们在系统的作用分成下面六个部分一一介绍。 ◆ 安装和登录命令:login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last; ◆ 文件处理命令:file、mkdir、grep、dd、find、mv、ls、diff、cat、ln; ◆ 系统管理相关命令:df、top、free、quota、at、lp、adduser、groupadd、kill、crontab; ◆ 网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、 nslookup; ◆ 系统安全相关命令:passwd、su、umask、chgrp、chmod、chown、chattr、sudo ps、who; ◆ 其它命令:tar、unzip、gunzip、unarj、mtools、man、unendcode、uudecode。 本文以Mandrake Linux 9.1(Kenrel 2.4.21)为例,介绍Linux下的安装和登录命令。 immortality按:请用ctrl+f在本页查找某一部分的内容或某一命令的用法。 -------------------------------------------------------------------------------- Linux必学的60个命令(1)-安装与登陆命令 login 1.作用 login的作用是登录系统,它的使用权限是所有用户。 2.格式 login [name][-p ][-h 主机名称] 3.主要参数 -p:通知login保持现在的环境参数。 -h:用来向远程登录的之间传输用户名。 如果选择用命令行模式登录Linux的话,那么看到的第一个Linux命令就是login:。 一般界面是这样的: Manddrake Linux release 9.1(Bamboo) for i586 renrel 2.4.21-0.13mdk on i686 / tty1 localhost login:root password: 上面代码,第一行是Linux发行版本号,第二行是内核版本号和登录的虚拟控制台,我们在第三行输入登录名,按“Enter”键在Password后输入账户密码,即可登录系统。出于安全考虑,输入账户密码时字符不会在屏幕上回显,光标也不移动。 登录后会看到下面这个界面(以超级用户为例): [root@localhost root]# last login:Tue ,Nov 18 10:00:55 on vc/1 上面显示的是登录星期、月、日、时间和使用的虚拟控制台。 4.应用技巧 Linux 是一个真正的多用户操作系统,可以同时接受多个用户登录,还允许一个用户进行多次登录。这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。每个虚拟控制台可以看作是一个独立的工作站,工作台之间可以切换。虚拟控制台的切换可以通过按下Alt键和一个功能键来实现,通常使用F1-F6 。 例如,用户登录后,按一下“Alt+ F2”键,用户就可以看到上面出现的“login:”提示符,说明用户看到了第二个虚拟控制台。然后只需按“Alt+ F1”键,就可以回到第一个虚拟控制台。一个新安装的Linux系统允许用户使用“Alt+F1”到“Alt+F6”键来访问前六个虚拟控制台。虚拟控制台最有用的是,当一个程序出错造成系统死锁时,可以切换到其它虚拟控制台工作,关闭这个程序。 shutdown 1.作用 shutdown命令的作用是关闭计算机,它的使用权限是超级用户。 2.格式 shutdown [-h][-i][-k][-m][-t] 3.重要参数 -t:在改变到其它运行级别之前,告诉init程序多久以后关机。 -k:并不真正关机,只是送警告信号给每位登录者。 -h:关机后关闭电源。 -c:cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数,但是可以输入一个用来解释的讯息,而这信息将会送到每位使用者。 -F:在重启计算机时强迫fsck。 -time:设定关机前的时间。 -m: 将系统改为单用户模式。 -i:关机时显示系统信息。 4.命令说明 shutdown 命令可以安全地将系统关机。有些用户会使用直接断掉电源的方式来关闭Linux系统,这是十分危险的。因为Linux与Windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失,使系统处于不稳定的状态,甚至在有的系统会损坏硬件设备(硬盘)。在系统关机前使用 shutdown命令,系统管理员会通知所有登录的用户系统将要关闭,并且login指令会被冻结,即新的用户不能再登录。 halt 1.作用 halt命令的作用是关闭系统,它的使用权限是超级用户。 2.格式 halt [-n] [-w] [-d] [-f] [-i] [-p] 3.主要参数说明 -n:防止sync系统调用,它用在用fsck修补根分区之后,以阻止内核用老版本的超级块覆盖修补过的超级块。 -w:并不是真正的重启或关机,只是写wtmp(/var/log/wtmp)纪录。 -f:没有调用shutdown,而强制关机或重启。 -i:关机(或重启)前,关掉所有的网络接口。 -f:强迫关机,不呼叫shutdown这个指令。 -p: 当关机的时候顺便做关闭电源的动作。 -d:关闭系统,但不留下纪录。  4.命令说明 halt 就是调用shutdown -h。halt执行时,杀死应用进程,执行sync(将存于buffer的资料强制写入硬盘)系统调用,文件系统写操作完成后就会停止内核。若系统的运行级别为0或6,则关闭系统;否则以shutdown指令(加上-h参数)来取代。  reboot 1.作用 reboot命令的作用是重新启动计算机,它的使用权限是系统管理者。 2.格式 reboot [-n] [-w] [-d] [-f] [-i] 3.主要参数 -n: 在重开机前不做将记忆体资料写回硬盘的动作。 -w: 并不会真的重开机,只是把记录写到/var/log/wtmp文件里。 -d: 不把记录写到/var/log/wtmp文件里(-n这个参数包含了-d)。 -i: 在重开机之前先把所有与网络相关的装置停止。 install 1.作用 install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户。 2.格式 (1)install [选项]... 来源 目的地 (2)install [选项]... 来源... 目录 (3)install -d [选项]... 目录... 在前两种格式,会将复制至或将多个文件复制至已存在的,同时设定权限模式及所有者/所属组。在第三种格式,会创建所有指定的目录及它们的主目录。长选项必须用的参数在使用短选项时也是必须的。 3.主要参数 --backup[=CONTROL]:为每个已存在的目的地文件进行备份。 -b:类似 --backup,但不接受任何参数。 -c:(此选项不作处理)。 -d,--directory:所有参数都作为目录处理,而且会创建指定目录的所有主目录。 -D:创建前的所有主目录,然后将复制至 ;在第一种使用格式有用。 -g,--group=组:自行设定所属组,而不是进程目前的所属组。 -m,--mode=模式:自行设定权限模式 (像chmod),而不是rwxr-xr-x。 -o,--owner=所有者:自行设定所有者 (只适用于超级用户)。 -p,--preserve-timestamps:以文件的访问/修改时间作为相应的目的地文件的时间属性。 -s,--strip:用strip命令删除symbol table,只适用于第一及第二种使用格式。 -S,--suffix=后缀:自行指定备份文件的。 -v,--verbose:处理每个文件/目录时印出名称。 --help:显示此帮助信息并离开。 --version:显示版本信息并离开。 mount 1.作用 mount命令的作用是加载文件系统,它的用权限是超级用户或/etc/fstab允许的使用者。 2.格式 mount -a [-fv] [-t vfstype] [-n] [-rw] [-F] device dir 3.主要参数 -h:显示辅助信息。 -v:显示信息,通常和-f用来除错。 -a:将/etc/fstab定义的所有文件系统挂上。 -F:这个命令通常和-a一起使用,它会为每一个mount的动作产生一个行程负责执行。在系统需要挂上大量NFS文件系统时可以加快加载的速度。 -f:通常用于除错。它会使mount不执行实际挂上的动作,而是模拟整个挂上的过程,通常会和-v一起使用。 -t vfstype:显示被加载文件系统的类型。 -n:一般而言,mount挂上后会在/etc/mtab写入一笔资料,在系统没有可写入文件系统的情况下,可以用这个选项取消这个动作。 4.应用技巧 在Linux 和Unix系统上,所有文件都是作为一个大型树(以/为根)的一部分访问的。要访问CD-ROM上的文件,需要将CD-ROM设备挂装在文件树的某个挂装点。如果发行版安装了自动挂装包,那么这个步骤可自动进行。在Linux,如果要使用硬盘、光驱等储存设备,就得先将它加载,当储存设备挂上了之后,就可以把它当成一个目录来访问。挂上一个设备使用mount命令。在使用mount这个指令时,至少要先知道下列三种信息:要加载对象的文件系统类型、要加载对象的设备名称及要将设备加载到哪个目录下。 (1)Linux可以识别的文件系统 ◆ Windows 95/98常用的FAT 32文件系统:vfat ; ◆ Win NT/2000 的文件系统:ntfs ; ◆ OS/2用的文件系统:hpfs; ◆ Linux用的文件系统:ext2、ext3; ◆ CD-ROM光盘用的文件系统:iso9660。 虽然vfat是指FAT 32系统,但事实上它也兼容FAT 16的文件系统类型。 (2)确定设备的名称 在Linux ,设备名称通常都存在/dev里。这些设备名称的命名都是有规则的,可以用“推理”的方式把设备名称找出来。例如,/dev/hda1这个 IDE设备,hd是Hard Disk(硬盘)的,sd是SCSI Device,fd是Floppy Device(或是Floppy Disk?)。a代表第一个设备,通常IDE接口可以接上4个IDE设备(比如4块硬盘)。所以要识别IDE硬盘的方法分别就是hda、hdb、hdc、 hdd。hda1的“1”代表hda的第一个硬盘分区 (partition),hda2代表hda的第二主分区,第一个逻辑分区从hda5开始,依此类推。此外,可以直接检查 /var/log/messages文件,在该文件可以找到计算机开机后系统已辨认出来的设备代号。 (3)查找挂接点 在决定将设备挂接之前,先要查看一下计算机是不是有个/mnt的空目录,该目录就是专门用来当作挂载点(Mount Point)的目录。建议在/mnt里建几个/mnt/cdrom、/mnt/floppy、/mnt/mo等目录,当作目录的专用挂载点。举例而言,如要挂载下列5个设备,其执行指令可能如下 (假设都是Linux的ext2系统,如果是Windows XX请将ext2改成vfat): 软盘 ===>mount -t ext2 /dev/fd0 /mnt/floppy cdrom ===>mount -t iso9660 /dev/hdc /mnt/cdrom SCSI cdrom ===>mount -t iso9660 /dev/sdb /mnt/scdrom SCSI cdr ===>mount -t iso9660 /dev/sdc /mnt/scdr 不过目前大多数较新的Linux发行版本(包括红旗 LinuxLinux、Mandrake Linux等)都可以自动挂装文件系统,但Red Hat Linux除外。 umount 1.作用 umount命令的作用是卸载一个文件系统,它的使用权限是超级用户或/etc/fstab允许的使用者。 2.格式 unmount -a [-fFnrsvw] [-t vfstype] [-n] [-rw] [-F] device dir 3.使用说明 umount 命令是mount命令的逆操作,它的参数和使用方法和mount命令是一样的。Linux挂装CD-ROM后,会锁定CD—ROM,这样就不能用CD- ROM面板上的Eject按钮弹出它。但是,当不再需要光盘时,如果已将/cdrom作为符号链接,请使用umount/cdrom来卸装它。仅当无用户正在使用光盘时,该命令才会成功。该命令包括了将带有当前工作目录当作该光盘的目录的终端窗口。 chsh 1.作用 chsh命令的作用是更改使用者shell设定,它的使用权限是所有使用者。 2.格式 chsh [ -s ] [ -list] [ --help ] [ -v ] [ username ] 3.主要参数 -l:显示系统所有Shell类型。 -v:显示Shell版本号。 4.应用技巧 前面介绍了Linux下有多种Shell,一般缺省的是Bash,如果想更换Shell类型可以使用chsh命令。先输入账户密码,然后输入新Shell类型,如果操作正确系统会显示“Shell change”。其界面一般如下: Changing fihanging shell for cao Password: New shell [/bin/bash]: /bin/tcsh 上面代码,[ ]内是目前使用的Shell。普通用户只能修改自己的Shell,超级用户可以修改全体用户的Shell。要想查询系统提供哪些Shell,可以使用chsh -l 命令,见图1所示。 图1 系统可以使用的Shell类型 从图1可以看到,笔者系统可以使用的Shell有bash(缺省)、csh、sh、tcsh四种。 exit 1.作用 exit命令的作用是退出系统,它的使用权限是所有用户。 2.格式 exit 3.参数 exit命令没有参数,运行后退出系统进入登录界面。 last 1.作用 last命令的作用是显示近期用户或终端的登录情况,它的使用权限是所有用户。通过last命令查看该程序的log,管理员可以获知谁曾经或企图连接系统。 2.格式 1ast[—n][-f file][-t tty] [—h 节点][-I —IP][—1][-y][1D] 3.主要参数 -n:指定输出记录的条数。 -f file:指定用文件file作为查询用的log文件。 -t tty:只显示指定的虚拟控制台上登录情况。 -h 节点:只显示指定的节点上的登录情况。 -i IP:只显示指定的IP上登录的情况。 -1:用IP来显示远端地址。 -y:显示记录的年、月、日。 -ID:知道查询的用户名。 -x:显示系统关闭、用户登录和退出的历史。 动手练习 上面介绍了Linux安装和登录命令,下面介绍几个实例,动手练习一下刚才讲过的命令。 1.一次运行多个命令 在一个命令可以执行多个命令,用分号将各个命令隔开即可,例如: #last -x;halt 上面代码表示在显示系统关闭、用户登录和退出的历史后关闭计算机。 2.利用mount挂装文件系统访问Windows系统 许多Linux发行版本现在都可以自动加载Vfat分区来访问Windows系统,而Red Hat各个版本都没有自动加载Vfat分区,因此还需要进行手工操作。 mount 可以将Windows分区作为Linux的一个“文件”挂接到Linux的一个空文件夹下,从而将Windows的分区和/mnt这个目录联系起来。因此,只要访问这个文件夹就相当于访问该分区了。首先要在/mnt下建立winc文件夹,在命令提示符下输入下面命令: #mount -t vfat /dev/hda1 /mnt/winc 即表示将Windows的C分区挂到Liunx的/mnt/winc目录下。这时,在/mnt/winc目录下就可以看到WindowsC盘的内容了。使用类似的方法可以访问Windows系统的D、E盘。在Linux系统显示Windows的分区一般顺序这样的:hda1为C盘、hda5为D盘、 hda6为E盘……以此类推。上述方法可以查看Windows系统有一个很大的问题,就是Windows的所有文文件名或文件夹名全部显示为问号 “?”,而英文却可以正常显示。我们可以通过加入一些参数让它显示文。还以上面的操作为例,此时输入命令: #mount -t vfat -o iocharset=cp936 /dev/hda1 /mnt/winc 现在它就可以正常显示文了。 3.使用mount加挂闪盘上的文件系统 在Linux下使用闪盘非常简单。Linux对USB设备有很好的支持,当插入闪盘后,闪盘被识别为一个SCSI盘,通常输入以下命令: # mount /dev/sda1 /usb 就能够加挂闪盘上的文件系统。 小知识 Linux命令Shell 所谓Shell,就是命令解释程序,它提供了程序设计接口,可以使用程序来编程。学习Shell对于Linux初学者理解Linux系统是非常重要的。 Linux系统的Shell作为操作系统的外壳,为用户提供了使用操作系统的接口。Shell命令语言命令解释程序及程序设计语言的统称,是用户和 Linux内核之间的接口程序。如果把Linux内核想象成一个球体的心,Shell就是围绕内核的外层。当从Shell或其它程序向Linux传递命令时,内核会做出相应的反应。ShellLinux系统的作用和MS DOS下的COMMAND.COM和Windows 95/98 的 explorer.exe相似。Shell虽然不是系统核心的一部分,只是系统核心的一个外延,但它能够调用系统内核的大部分功能。因此,可以说 Shell是Unux/Linux最重要的实用程序。 LinuxShell有多种类型,其最常用的是Bourne Shell(sh)、C Shell(csh)和Korn Shell(ksh)。大多数Linux发行版本缺省的Shell是Bourne Again Shell,它是Bourne Shell的扩展,简称bash,与Bourne Shell完全向后兼容,并且在Bourne Shell的基础上增加了很多特性。bash放在/bin/bash,可以提供如命令补全、命令编辑和命令历史表等功能。它还包含了很多C Shell和Korn Shell的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。Linux系统200多个命令有40个是bash的内部命令,主要包括 exit、less、lp、kill、 cd、pwd、fc、fg等。 -------------------------------------------------------------------------------- Linux必学的60个命令(2)-文件处理命令 Linux 系统信息存放在文件里,文件与普通的公务文件类似。每个文件都有自己的名字、内容、存放地址及其它一些管理信息,如文件的用户、文件的大小等。文件可以是一封信、一个通讯录,或者是程序的源语句、程序的数据,甚至可以包括可执行的程序和其它非正文内容。 Linux文件系统具有良好的结构,系统提供了很多文件处理程序。这里主要介绍常用的文件处理命令。 file 1.作用 件内容判断文件类型,使用权限是所有用户。 2.格式 file通过探测文 file [options] 文件名 3.[options]主要参数 -v:在标准输出后显示版本信息,并且退出。 -z:探测压缩过的文件类型。 -L:允许符合连接。 -f name:从文件namefile读取要分析的文件名列表。 4.简单说明 使用file命令可以知道某个文件究竟是二进制(ELF格式)的可执行文件, 还是Shell Script文件,或者是其它的什么格式。file能识别的文件类型有目录、Shell脚本、英文文本、二进制可执行文件、C语言源文件、文本文件、DOS的可执行文件。 5.应用实例 如果我们看到一个没有后缀的文件grap,可以使用下面命令: $ file grap grap: English text 此时系统显示这是一个英文文本文件。需要说明的是,file命令不能探测包括图形、音频、视频等多媒体文件类型。 mkdir 1.作用 mkdir命令的作用是建立名称为dirname的子目录,与MS DOS下的md命令类似,它的使用权限是所有用户。 2.格式 mkdir [options] 目录名 3.[options]主要参数 -m, --mode=模式:设定权限,与chmod类似。 -p, --parents:需要时创建上层目录;如果目录早已存在,则不当作错误。 -v, --verbose:每次创建新目录都显示信息。 --version:显示版本信息后离开。 4.应用实例 在进行目录创建时可以设置目录的权限,此时使用的参数是“-m”。假设要创建的目录名是“tsk”,让所有用户都有rwx(即读、写、执行的权限),那么可以使用以下命令: $ mkdir -m 777 tsk grep 1.作用 grep命令可以指定文件搜索特定的内容,并将含有这些内容的行标准输出。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。 2.格式 grep [options] 3.主要参数 [options]主要参数: -c:只输出匹配行的计数。 -I:不区分大小写(只适用于单字符)。 -h:查询多文件时不显示文件名。 -l:查询多文件时只输出包含匹配字符的文件名。 -n:显示匹配行及行号。 -s:不显示不存在或无匹配文本的错误信息。 -v:显示不包含匹配文本的所有行。 pattern正则表达式主要参数: \:忽略正则表达式特殊字符的原有含义。 ^:匹配正则表达式的开始行。 $: 匹配正则表达式的结束行。 \:到匹配正则表达式的行结束。 [ ]:单个字符,如[A]即A符合要求 。 [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。 。:所有的单个字符。 * :有字符,长度可以为0。 正则表达式是Linux/Unix系统非常重要的概念。正则表达式(也称为“regex”或“regexp”)是一个可以描述一类字符串的模式(Pattern)。如果一个字符串可以用某个正则表达式来描述,我们就说这个字符和该正则表达式匹配(Match)。这和DOS用户可以使用通配符 “*”代表任意字符类似。在Linux系统上,正则表达式通常被用来查找文本的模式,以及对文本执行“搜索-替换”操作和其它功能。 4.应用实例 查询DNS服务是日常工作之一,这意味着要维护覆盖不同网络的大量IP地址。有时IP地址会超过2000个。如果要查看nnn.nnn网络地址,但是却忘了第二部分的其余部分,只知到有两个句点,例如nnn nn..。要抽取其所有nnn.nnn IP地址,使用[0-9 ]\{3 \}\.[0-0\{3\}\。含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点。 $grep '[0-9 ]\{3 \}\.[0-0\{3\}\' ipfile 补充说明,grep家族还包括fgrep和egrep。fgrep是fix grep,允许查找字符串而不是一个模式;egrep是扩展grep,支持基本及扩展的正则表达式,但不支持\q模式范围的应用及与之相对应的一些更加规范的模式。 dd 1.作用 dd命令用来复制文件,并根据参数将数据转换和格式化。 2.格式 dd [options] 3.[opitions]主要参数 bs=字节:强迫 ibs=及obs=。 cbs=字节:每次转换指定的。 conv=关键字:根据以逗号分隔的关键字表示的方式来转换文件。 count=块数目:只复制指定的输入数据。 ibs=字节:每次读取指定的。 if=文件:读取内容,而非标准输入的数据。 obs=字节:每次写入指定的。 of=文件:将数据写入,而不在标准输出显示。 seek=块数目:先略过以obs为单位的指定的输出数据。 skip=块数目:先略过以ibs为单位的指定的输入数据。 4.应用实例 dd命令常常用来制作Linux启动盘。先找一个可引导内核,令它的根设备指向正确的根分区,然后使用dd命令将其写入软盘: $ rdev vmlinuz /dev/hda $dd if=vmlinuz of=/dev/fd0 上面代码说明,使用rdev命令将可引导内核vmlinuz的根设备指向/dev/hda,请把“hda”换成自己的根分区,接下来用dd命令将该内核写入软盘。 find 1.作用 find命令的作用是在目录搜索文件,它的使用权限是所有用户。 2.格式 find [path][options][expression] path指定目录路径,系统从这里开始沿着目录树向下查找文件。它是一个路径列表,相互用空格分离,如果不写path,那么默认为当前目录。 3.主要参数 [options]参数: -depth:使用深度级别的查找过程方式,在某层指定目录优先查找文件内容。 -maxdepth levels:表示至多查找到开始目录的第level层子目录。level是一个非负数,如果level是0的话表示仅在当前目录查找。 -mindepth levels:表示至少查找到开始目录的第level层子目录。 -mount:不在其它文件系统(如Msdos、Vfat等)的目录和文件查找。 -version:打印版本。 [expression]是匹配表达式,是find命令接受的表达式,find命令的所有操作都是针对表达式的。它的参数非常多,这里只介绍一些常用的参数。 —name:支持统配符*和?。 -atime n:搜索在过去n天读取过的文件。 -ctime n:搜索在过去n天修改过的文件。 -group grpoupname:搜索所有组为grpoupname的文件。 -user 用户名:搜索所有文件属主为用户名(ID或名称)的文件。 -size n:搜索文件大小是n个block的文件。 -print:输出搜索结果,并且打印。 4.应用技巧 find命令查找文件的几种方法: (1)根据文件名查找 例如,我们想要查找一个文件名是lilo.conf的文件,可以使用如下命令: find / -name lilo.conf find命令后的“/”表示搜索整个硬盘。 (2)快速查找文件 根据文件名查找文件会遇到一个实际问题,就是要花费相当长的一段时间,特别是大型Linux文件系统和大容量硬盘文件放在很深的子目录时。如果我们知道了这个文件存放在某个目录,那么只要在这个目录往下寻找就能节省很多时间。比如smb.conf文件,从它的文件后缀“.conf”可以判断这是一个配置文件,那么它应该在/etc目录内,此时可以使用下面命令: find /etc -name smb.conf 这样,使用“快速查找文件”方式可以缩短时间。 (3)根据部分文件名查找方法 有时我们知道只某个文件包含有abvd这4个字,那么要查找系统所有包含有这4个字符的文件可以输入下面命令: find / -name '*abvd*' 输入这个命令以后,Linux系统会将在/目录查找所有的包含有abvd这4个字符的文件(其*是通配符),比如abvdrmyz等符合条件的文件都能显示出来。 (4) 使用混合查找方式查找文件 find命令可以使用混合查找的方法,例如,我们想在/etc目录查找大于500000字节,并且在24小时内修改的某个文件,则可以使用-and (与)把两个查找参数链接起来组合成一个混合的查找方式。 find /etc -size +500000c -and -mtime +1 mv 1.作用 mv命令用来为文件或目录改名,或者将文件由一个目录移入另一个目录,它的使用权限是所有用户。该命令如同DOS命令的ren和move的组合。 2.格式 mv[options] 源文件或目录 目标文件或目录 3.[options]主要参数 -i:交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答“y”或“n”,这样可以避免误覆盖文件。 -f:禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示,指定此参数后i参数将不再起作用。 4.应用实例 (1)将/usr/cbu的所有文件移到当前目录(用“.”表示): $ mv /usr/cbu/ * . (2)将文件cjh.txt重命名为wjz.txt: $ mv cjh.txt wjz.txt  ls 1.作用 ls命令用于显示目录内容,类似DOS下的dir命令,它的使用权限是所有用户。 2.格式 ls [options][filename] 3.options主要参数 -a, --all:不隐藏任何以“.” 字符开始的项目。 -A, --almost-all:列出除了“ . ”及 “.. ”以外的任何项目。 --author:印出每个文件著作者。 -b, --escape:以八进制溢出序列表示不可打印的字符。 --block-size=大小:块以指定的字节为单位。 -B, --ignore-backups:不列出任何以 ~ 字符结束的项目。 -f:不进行排序,-aU参数生效,-lst参数失效。 -F, --classify:加上文件类型的指示符号 (*/=@| 其一个)。 -g:like -l, but do not list owner。 -G, --no-group:inhibit display of group information。 -i, --inode:列出每个文件的inode号。 -I, --ignore=样式:不印出任何符合Shell万用字符的项目。 -k:即--block-size=1K。 -l:使用较长格式列出信息。 -L, --dereference:当显示符号链接的文件信息时,显示符号链接所指示的对象,而并非符号链接本身的信息。 -m:所有项目以逗号分隔,并填满整行行宽。 -n, --numeric-uid-gid:类似-l,但列出UID及GID号。 -N, --literal:列出未经处理的项目名称,例如不特别处理控制字符。 -p, --file-type:加上文件类型的指示符号 (/=@| 其一个)。 -Q, --quote-name:将项目名称括上双引号。 -r, --reverse:依相反次序排列。 -R, --recursive:同时列出所有子目录层。 -s, --size:以块大小为序。 4.应用举例 ls 命令Linux系统使用频率最多的命令,它的参数也是Linux命令最多的。使用ls命令时会有几种不同的颜色,其蓝色表示是目录,绿色表示是可执行文件,红色表示是压缩文件,浅蓝色表示是链接文件,加粗的黑色表示符号链接,灰色表示是其它格式文件。ls最常使用的是ls- l,见图1所示。 图1 使用ls-l命令 文件类型开头是由10个字符构成的字符串。其第一个字符表示文件类型,它可以是下述类型之一:-(普通文件)、d(目录)、l(符号链接)、b(块设备文件)、c(字符设备文件)。后面的9个字符表示文件的访问权限,分为3组,每组3位。第一组表示文件属主的权限,第二组表示同组用户的权限,第三组表示其他用户的权限。每一组的三个字符分别表示对文件的读(r)、写(w)和执行权限(x)。对于目录,表示进入权限。s表示当文件被执行时,把该文件的UID 或GID赋予执行进程的UID(用户ID)或GID(组 ID)。t表示设置标志位(留在内存,不被换出)。如果该文件是目录,那么在该目录的文件只能被超级用户、目录拥有者或文件属主删除。如果它是可执行文件,那么在该文件执行后,指向其正文段的指针仍留在内存。这样再次执行它时,系统就能更快地装入该文件。接着显示的是文件大小、生成时间、文件或命令名称。 diff 1.作用 diff命令用于两个文件之间的比较,并指出两者的不同,它的使用权限是所有用户。 2.格式 diff [options] 源文件 目标文件 3.[options]主要参数 -a:将所有文件当作文本文件来处理。 -b:忽略空格造成的不同。 -B:忽略空行造成的不同。 -c:使用纲要输出格式。 -H:利用试探法加速对大文件的搜索。 -I:忽略大小写的变化。 -n --rcs:输出RCS格式。 cmp 1.作用 cmp(“compare”的缩写)命令用来简要指出两个文件是否存在差异,它的使用权限是所有用户。 2.格式 cmp[options] 文件名 3.[options]主要参数 -l: 将字节以十进制的方式输出,并方便将两个文件不同的以八进制的方式输出。 cat 1.作用 cat(“concatenate”的缩写)命令用于连接并显示指定的一个和多个文件的有关信息,它的使用权限是所有用户。 2.格式 cat [options] 文件1 文件2…… 3.[options]主要参数 -n:由第一行开始对所有输出的行数编号。 -b:和-n相似,只不过对于空白行不编号。 -s:当遇到有连续两行以上的空白行时,就代换为一行的空白行。 4.应用举例 (1)cat命令一个最简单的用处是显示文本文件的内容。例如,我们想在命令行看一下README文件的内容,可以使用命令: $ cat README  (2)有时需要将几个文件处理成一个文件,并将这种处理的结果保存到一个单独的输出文件。cat命令在其输入上接受一个或多个文件,并将它们作为一个单独的文件打印到它的输出。例如,把README和INSTALL的文件内容加上行号(空白行不加)之后,将内容附加到一个新文本文件File1 : $ cat README INSTALL File1 (3)cat还有一个重要的功能就是可以对行进行编号,见图2所示。这种功能对于程序文档的编制,以及法律和科学文档的编制很方便,打印在左边的行号使得参考文档的某一部分变得容易,这些在编程、科学研究、业务报告甚至是立法工作都是非常重要的。 图2 使用cat命令/etc/named.conf文件进行编号 对行进行编号功能有-b(只能对非空白行进行编号)和-n(可以对所有行进行编号)两个参数: $ cat -b /etc/named.conf ln 1.作用 ln命令用来在文件之间创建链接,它的使用权限是所有用户。 2.格式 ln [options] 源文件 [链接名] 3.参数 -f:链结时先将源文件删除。 -d:允许系统管理者硬链结自己的目录。 -s:进行软链结(Symbolic Link)。 -b:将在链结时会被覆盖或删除的文件进行备份。 链接有两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。 硬连接指通过索引节点来进行的连接。在Linux的文件系统,保存在磁盘分区的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件才会被真正删除。 与硬连接相对应,Lnux系统还存在另一种连接,称为符号连接(Symbilc Link),也叫软连接。软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接,文件实际上是一个文本文件,其包含的有另一文件的位置信息。 动手练习 上面我们介绍了Linux文件处理命令,下面介绍几个实例,大家可以动手练习一下刚才讲过的命令。 1.利用符号链接快速访问关键目录 符号链接是一个非常实用的功能。假设有一些目录或文件需要频繁使用,但由于Linux的文件和目录结构等原因,这个文件或目录在很深的子目录。比如, Apache Web服务器文档位于系统的/usr/local/httpd/htdocs,并且不想每次都要从主目录进入这样一个长的路径之(实际上,这个路径也非常不容易记忆)。 为了解决这个问题,可以在主目录创建一个符号链接,这样在需要进入该目录时,只需进入这个链接即可。 为了能方便地进入Web服务器(/usr/local/httpd/htdocs)文档所在的目录,在主目录下可以使用以下命令: $ ln -s /usr/local/httpd/htdocs gg 这样每次进入gg目录就可访问Web服务器的文档,以后如果不再访问Web服务器的文档时,删除gg即可,而真正的Web服务器的文档并没有删除。 2.使用dd命令将init.rd格式的root.ram内容导入内存 dd if=/dev/fd0 of=floppy.fd dd if=root.ram of=/dev/ram0 # 3.grep命令系统调用 grep是Linux/Unix使用最广泛的命令之一,许多Linux系统内部都可以调用它。 (1)如果要查询目录列表的目录,方法如下: $ ls -l | grep '∧d' (2)如果在一个目录查询不包含目录的所有文件,方法如下: $ ls -l | grep '∧[∧d]' (3)用find命令调用grep,如所有C源代码的“Chinput”,方法如下: $find /ZhXwin -name *.c -exec grep -q -s Chinput {} \;-print -------------------------------------------------------------------------------- Linux必学的60个命令(3)-系统管理命令 Linux必学的系统管理命令 对于Linux系统来说,无论是央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心。熟悉了Linux常用的文件处理命令以后,这一讲介绍对系统和用户进行管理的命令。 df 1.作用 df命令用来检查文件系统的磁盘空间占用情况,使用权限是所有用户。 2.格式 df [options] 3.主要参数 -s:对每个Names参数只给出占用的数据块总数。 -a:递归地显示指定目录各文件及子目录各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names的每一个目录及其的各子目录所占的磁盘块数。 -k:以1024字节为单位列出磁盘空间使用情况。 -x:跳过在不同文件系统上的目录不予统计。 -l:计算所有的文件大小,对硬链接文件则计算多次。 -i:显示inode信息而非块使用量。 -h:以容易理解的格式印出文件系统大小,例如136KB、254MB、21GB。 -P:使用POSIX输出格式。 -T:显示文件系统类型。 4.说明 df命令被广泛地用来生成文件系统的使用统计数据,它能显示系统所有的文件系统的信息,包括总容量、可用的空闲空间、目前的安装点等。 超级权限用户使用df命令时会发现这样的情况:某个分区的容量超过了100%。这是因为Linux系统为超级用户保留了10%的空间,由其单独支配。也就是说,对于超级用户而言,他所见到的硬盘容量将是110%。这样的安排对于系统管理而言是有好处的,当硬盘被使用的容量接近100%时系统管理员还可以正常工作。 5.应用实例 Linux支持的文件系统非常多,包括JFS、ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、vfat、MSDOS等。使用df -T命令查看磁盘空间时还可以得到文件系统的信息: #df -T 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/hda7 reiserfs 5.2G 1.6G 3.7G 30% / /dev/hda1 vfat 2.4G 1.6G 827M 66% /windows/C /dev/hda5 vfat 3.0G 1.7G 1.3G 57% /windows/D /dev/hda9 vfat 3.0G 2.4G 566M 82% /windows/E /dev/hda10 NTFS 3.2G 573M 2.6G 18% /windows/F /dev/hda11 vfat 1.6G 1.5G 23M 99% /windows/G 从上面除了可以看到磁盘空间的容量、使用情况外,分区的文件系统类型、挂载点等信息也一览无遗。 top 1.作用 top命令用来显示执行的程序进程,使用权限是所有用户。 2.格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 3.主要参数 d:指定更新的间隔,以秒计算。 q:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先序执行。 c:显示进程完整的路径与名称。 S:累积模式,会将己完成或消失的子行程的CPU时间累积起来。 s:安全模式。 i:不显示任何闲置(Idle)或无用(Zombie)的行程。 n:显示更新的次数,完成后将会退出top。 4.说明 top命令Linux系统管理的一个主要命令,通过它可以获得许多信息。这里我们结合图1来说明它给出的信息。 图1 top命令的显示 在图1,第一行表示的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。第二行显示的是所有启动的进程、目前运行的、挂起 (Sleeping)的和无用(Zombie)的进程。第三行显示的是目前CPU的使用情况,包括系统占用的比例、用户使用比例、闲置(Idle)比例。第四行显示物理内存的使用情况,包括总的可以使用的内存、已用内存、空闲内存、缓冲区占用的内存。第五行显示交换分区使用情况,包括总的交换分区、使用的、空闲的和用于高速缓存的大小。第六行显示的项目最多,下面列出了详细解释。 PID(Process ID):进程标示号。 USER:进程所有者的用户名。 PR:进程的优先级别。 NI:进程的优先级别数值。 VIRT:进程占用的虚拟内存值。 RES:进程占用的物理内存值。 SHR:进程使用的共享内存值。 S:进程的状态,其S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。 %CPU:该进程占用的CPU使用率。 %MEM:该进程占用的物理内存和总内存的百分比。 TIME+:该进程启动后占用的总的CPU时间。 Command:进程启动的启动命令名称,如果这一行显示不下,进程会有一个完整的命令行。 top命令使用过程,还可以使用一些交互的命令来完成其它参数的功能。这些命令是通过快捷键启动的。 :立刻刷新。 P:根据CPU使用大小进行排序。 T:根据时间、累计时间排序。 q:退出top命令。 m:切换显示内存信息。 t:切换显示进程和CPU状态信息。 c:切换显示命令名称和完整命令行。 M:根据使用内存大小进行排序。 W:将当前设置写入~/.toprc文件。这是写top配置文件的推荐方法。 可以看到,top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要。但是,它的缺点是会消耗很多系统资源。 5.应用实例 使用top命令可以监视指定用户,缺省情况是监视所有用户的进程。如果想查看指定用户的情况,在终端按“U”键,然后输入用户名,系统就会切换为指定用户的进程运行界面,见图2所示。 图2 使用top命令监视指定用户 free 1.作用 free命令用来显示内存的使用情况,使用权限是所有用户。 2.格式 free [-b|-k|-m] [-o] [-s delay] [-t] [-V] 3.主要参数 -b -k -m:分别以字节(KB、MB)为单位显示内存使用情况。 -s delay:显示每隔多少秒数来显示一次内存使用情况。 -t:显示内存总和列。 -o:不显示缓冲区调节列。 4.应用实例 free命令是用来查看内存使用情况的主要命令。和top命令相比,它的优点是使用简单,并且只占用很少的系统资源。通过-S参数可以使用free命令不间断地监视有多少内存在使用,这样可以把它当作一个方便实时监控器。 #free -b -s5 使用这个命令后终端会连续不断地报告内存使用情况(以字节为单位),每5秒更新一次。 quota 1.作用 quota命令用来显示磁盘使用情况和限制情况,使用权限超级用户。 2.格式 quota [-g][-u][-v][-p] 用户名 组名 3.参数 -g:显示用户所在组的磁盘使用限制。 -u:显示用户的磁盘使用限制。 -v:显示没有分配空间的文件系统的分配情况。 -p:显示简化信息。 4.应用实例 在企业应用磁盘配额非常重要,普通用户要学会看懂自己的磁盘使用情况。要查询自己的磁盘配额可以使用下面命令(下例用户账号是caojh): #quota caojh Disk quotas for user caojh(uid 502): Filesystem blocks quota limit grace files quota limit grace /dev/hda3 58 200000 400000 41 500 1000 以上显示ID号为502的caojh账号,文件个数设置为500~1000个,硬盘空间限制设置为200MB~400MB。一旦磁盘配额要用完时,就需要删除一些垃圾文件或向系统管理员请求追加配额。 at 1.作用 at命令用来在指定时刻执行指定的命令序列。 2.格式 at [-V] [-q x] [-f file] [-m] time 3.主要参数 -V:显示标准错误输出。 -q:许多队列输出。 -f:从文件读取作业。 -m:执行完作业后发送电子邮件到用户。 time:设定作业执行的时间。time格式有严格的要求,由小时、分钟、日期和时间的偏移量组成,其日期的格式为MM.DD.YY,MM是分钟,DD是日期,YY是指年份。偏移量的格式为时间+偏移量,单位是minutes、hours和days。 4.应用实例 #at -f data 15:30 +2 days 上面命令表示让系统在两天后的17:30执行文件data指明的作业。 lp 1.作用 lp是打印文件的命令,使用权限是所有用户。 2.格式 lp [-c][-d][-m][-number][-title][-p] 3.主要参数 -c:先拷贝文件再打印。 -d:打印队列文件。 -m:打印结束后发送电子邮件到用户。 -number:打印份数。 -title:打印标题。 -p:设定打印的优先级别,最高为100。 4.应用实例 (1)使用lp命令打印多个文件 #lp 2 3 4 request id is 11 (3 file(s)) 其2、3、4分别是文件名;“request id is 11 (3 file(s)) ”表示这是第11个打印命令,依次打印这三个文件。 (2)设定打印优先级别 #lp lp -d LaserJet -p 90 /etc/aliases 通过添加“-p 90”,规定了打印作业的优先级为90。它将在优先级低于90的打印作业之前打印,包括没有设置优先级的作业,缺省优先级是50 useradd 1.作用 useradd命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户。 2.格式 useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name 3.主要参数 -c:加上备注文字,备注文字保存在passwd的备注栏。  -d:指定用户登入时的启始目录。 -D:变更预设值。 -e:指定账号的有效期限,缺省表示永久有效。 -f:指定在密码过期后多少天即关闭该账号。 -g:指定用户所属的群组。 -G:指定用户所属的附加群组。 -m:自动建立用户的登入目录。 -M:不要自动建立用户的登入目录。 -n:取消建立以用户名称为名的群组。 -r:建立系统账号。 -s:指定用户登入后所使用的shell。 -u:指定用户ID号。 4.说明 useradd可用来建立用户账号,它和adduser命令是相同的。账号建好之后,再用passwd设定账号的密码。使用useradd命令所建立的账号,实际上是保存在/etc/passwd文本文件。 5.应用实例 建立一个新用户账户,并设置ID: #useradd caojh -u 544 需要说明的是,设定ID值时尽量要大于500,以免冲突。因为Linux安装后会建立一些特殊用户,一般0到499之间的值留给bin、mail这样的系统账号。 groupadd 1.作用 groupadd命令用于将新组加入系统。 2.格式 groupadd [-g gid] [-o]] [-r] [-f] groupname 3.主要参数 -g gid:指定组ID号。 -o:允许组ID号,不必惟一。 -r:加入组ID号,低于499系统账号。 -f:加入已经有的组时,发展程序退出。 4.应用实例 建立一个新组,并设置组ID加入系统: #groupadd -g 344 cjh 此时在/etc/passwd文件产生一个组ID(GID)是344的项目。 kill 1.作用 kill命令用来止一个进程。 2.格式 kill [ -s signal | -p ] [ -a ] pid ... kill -l [ signal ] 3.参数 -s:指定发送的信号。 -p:模拟发送信号。 -l:指定信号的名称列表。 pid:要止进程的ID号。 Signal:表示信号。 4.说明 进程是Linux系统一个非常重要的概念。Linux是一个多任务的操作系统,系统上经常同时运行着多个进程。我们不关心这些进程究竟是如何分配的,或者是内核如何管理分配时间片的,所关心的是如何去控制这些进程,让它们能够很好地为用户服务。 Linux 操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程和终端没有联系,是一个进程序列。监控进程(也称系统守护进程)时Linux系统启动时启动的进程,并在后台运行。例如,httpd是著名的 Apache服务器的监控进程。 kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。比如在top命令,我们看到系统运行许多进程,有时就需要使用kill止某些进程来提高系统资源。在讲解安装和登陆命令时,曾提到系统多个虚拟控制台的作用是当一个程序出错造成系统死锁时,可以切换到其它虚拟控制台工作关闭这个程序。此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用的。 5.应用实例 (1)强行止(经常使用杀掉)一个进程标识号为324的进程: #kill -9 324 (2)解除Linux系统的死锁 在Linux 有时会发生这样一种情况:一个程序崩溃,并且处于死锁的状态。此时一般不用重新启动计算机,只需要止(或者说是关闭)这个有问题的程序即可。当 kill处于X-Window界面时,主要的程序(除了崩溃的程序之外)一般都已经正常启动了。此时打开一个终端,在那里止有问题的程序。比如,如果 Mozilla浏览器程序出现了锁死的情况,可以使用kill命令止所有包含有Mozolla浏览器的程序。首先用top命令查处该程序的PID,然后使用kill命令停止这个程序: #kill -SIGKILL XXX 其,XXX是包含有Mozolla浏览器的程序的进程标识号。 (3)使用命令回收内存 我们知道内存对于系统是非常重要的,回收内存可以提高系统资源。kill命令可以及时地止一些“越轨”的程序或很长时间没有相应的程序。例如,使用top命令发现一个无用 (Zombie) 的进程,此时可以使用下面命令: #kill -9 XXX 其,XXX是无用的进程标识号。 然后使用下面命令: #free 此时会发现可用内存容量增加了。 (4)killall命令 Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如: # killall -HUP inetd crontab 1.作用 使用crontab命令可以修改crontab配置文件,然后该配置由cron公用程序在适当的时间执行,该命令使用权限是所有用户。 2.格式 crontab [ -u user ] 文件 crontab [ -u user ] { -l | -r | -e } 3.主要参数 -e:执行文字编辑器来设定时程表,内定的文字编辑器是vi。 -r:删除目前的时程表。 -l:列出目前的时程表。 crontab 文件的格式为“M H D m d cmd”。其,M代表分钟(0~59),H代表小时(0~23),D代表天(1~31),m代表月(1~12),d代表一星期内的天(0~6,0为星期天)。cmd表示要运行的程序,它被送入sh执行,这个Shell只有USER、HOME、SHELL三个环境变量。 4.说明 和at命令相比,crontab命令适合完成固定周期的任务。 5.应用实例 设置一个定时、定期的系统提示: [cao @www cao]#crontab -e 此时系统会打开一个vi编辑器。 如果输入以下内容:35 17 * * 5 wall "Tomorrow is Saturday I will go CS",然后存盘退出。这时在/var/spool/cron/目录下会生产一个cao的文件,内容如下: # DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.2707 installed on Thu Jan 1 22:01:51 2004) # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) 35 17 * * 5 wall "Tomorrow is Saturday I will play CS " 这样每个星期五17:35系统就会弹出一个终端,提醒星期六可以打打CS了!显示结果见图3所示。 图3 一个定时、定期的系统提示 动手练习 1.联合使用kill和top命令观察系统性能的变化 首先启动一个终端运行top命令,然后再启动一个终端使用kill命令,见图4所示。 图4 观察kill命令对top终端的影响 这时利用上面介绍的kill命令止一些程序: #kill SIGKILL XXX 然后再看top命令终端的变化,包括内存容量、CPU使用率、系统负载等。注意,有些进程是不能止的,不过学习Linux命令时可以试试,看看系统有什么反应。 2.使用at和halt命令定时关机 首先设定关机时间是17:35,输入下面代码: #at 17:35 warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh at>halt `-i -p at> job 6 at 2004-01-01 17:35 此时实际上就已经进入Linux系统的Shell,并且编写一个最简单程序:halt -i -p。上面Shell的文本结束符号表示按“Ctrl+D”组合键关闭命令,提交任务退出Shell。“Job 6 at 2004-01-01 17:35”表示系统接受第6个at命令,在“2004-01-01 17:35”时执行命令:先把所有网络相关的装置停止,关闭系统后关闭电源。 3.用crontab命令实现每天定时的病毒扫描 前面已经介绍了一个简单的crontab命令操作,这里看一些更重要的操作。 (1)建立一个文件,文件名称自己设定,假设为caoproject: #crontab -e (2)文件内容如下: 05 09 * * * antivir 用vi编辑后存盘退出。antivir是一个查杀Linux病毒的软件,当然需要时先安装在系统。 (3)使用crontab命令添加到任务列表: #crontab caoproject 这样系统内所有用户在每天的9点05分会自动进行病毒扫描。 4.用kill使修改的配置文件马上生效 Windows用户一般都知道,重要配置文件修改后往往都要重新启动计算机才能使修改生效。而Linux由于采用了模块化设计,可以自己根据需要实时设定服务。这里以网络服务inetd为例介绍一些操作技巧。 inetd 是一个监听守护进程,监听与提供互联网服务进程(如rlogin、telnet、ftp、rsh)进行连接的要求,并扩展所需的服务进程。默认情况下, inetd监听的这些daemon均列于/etc /inetd.conf文件。编辑/etc/inetd.conf文件,可以改变inetd启动服务器守护进程的选项,然后驱使inetd以 SIGHUP(signal 1)向当前的inetd进程发送信号,使inetd重读该文件。这一过程由kill命令来实现。 用vi或其它编辑器修改inetd.conf后,首先使用下面命令: #ps -ef |grep inetd 上面代码表明查询inetd.conf的进程号(PID),这里假设是1426,然后使用下面命令: # kill -1426 inetd 这样配置文件就生效了。 这一讲介绍的系统管理命令都是比较重要的,特别是crontab命令和quota命令使用起来会有一定难度,需要多做一些练习。另外,使用kill命令要注意“-9“这个参数,练习时最好不要运行一些重要的程序。 -------------------------------------------------------------------------------- Linux必学的60个命令(4)-网络操作命令 Linux必学的60个命令:网络操作命令 因为Linux系统是在Internet上起源和发展的,它与生俱来拥有强大的网络功能和丰富的网络应用软件,尤其是TCP/IP网络协议的实现尤为成熟。 Linux的网络命令比较多,其一些命令像ping、 ftp、telnet、route、netstat等在其它操作系统上也能看到,但也有一些Unix/Linux系统独有的命令,如ifconfig、 finger、mail等。Linux网络操作命令的一个特点是,命令参数选项和功能很多,一个命令往往还可以实现其它命令的功能。 ifconfig 1.作用 ifconfig用于查看和更改网络接口的地址和参数,包括IP地址、网络掩码、广播地址,使用权限是超级用户。 2.格式 ifconfig -interface [options] address 3.主要参数 -interface:指定的网络接口名,如eth0和eth1。 up:激活指定的网络接口卡。 down:关闭指定的网络接口。 broadcast address:设置接口的广播地址。 pointopoint:启用点对点方式。 address:设置指定接口设备的IP地址。 netmask address:设置接口的子网掩码。 4.应用说明 ifconfig是用来设置和配置网卡的命令行工具。为了手工配置网络,这是一个必须掌握的命令。使用该命令的好处是无须重新启动机器。要赋给eth0接口IP地址207.164.186.2,并且马上激活它,使用下面命令: #fconfig eth0 210.34.6.89 netmask 255.255.255.128 broadcast 210.34.6.127 该命令的作用是设置网卡eth0的IP地址、网络掩码和网络的本地广播地址。若运行不带任何参数的ifconfig命令,这个命令将显示机器所有激活接口的信息。带有“-a”参数的命令则显示所有接口的信息,包括没有激活的接口。注意,用ifconfig命令配置的网络设备参数,机器重新启动以后将会丢失。 如果要暂停某个网络接口的工作,可以使用down参数: #ifconfig eth0 down ip 1.作用 ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig、route等,使用权限为超级用户。几乎所有的Linux发行版本都支持该命令。 2.格式 ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]] 3.主要参数 OPTIONS是修改ip行为或改变其输出的选项。所有的选项都是以-字符开头,分为长、短两种形式。目前,ip支持如表1所示选项。 OBJECT是要管理者获取信息的对象。目前ip认识的对象见表2所示。 表1 ip支持的选项 -V,-Version 打印ip的版本并退出。 -s,-stats,-statistics 输出更为详尽的信息。如果这个选项出现两次或多次,则输出的信息将更为详尽。 -f,-family 这个选项后面接协议种类,包括inet、inet6或link,强调使用的协议种类。如果没有足够的信息告诉ip使用的协议种类,ip就会使用默认值inet或any。link比较特殊,它表示不涉及任何网络协议。 -4 是-family inet的简写。 -6 是-family inet6的简写。 -0 是-family link的简写。 -o,-oneline 对每行记录都使用单行输出,回行用字符代替。如果需要使用wc、grep等工具处理ip的输出,则会用到这个选项。 -r,-resolve 查询域名解析系统,用获得的主机名代替主机IP地址 COMMAND 设置针对指定对象执行的操作,它和对象的类型有关。一般情况下,ip支持对象的增加(add)、删除(delete)和展示(show或list)。有些对象不支持这些操作,或者有其它的一些命令。对于所有的对象,用户可以使用help命令获得帮助。这个命令会列出这个对象支持的命令和参数的语法。如果没有指定对象的操作命令,ip会使用默认的命令。一般情况下,默认命令是list,如果对象不能列出,就会执行help命令。 ARGUMENTS 是命令的一些参数,它们倚赖于对象和命令。ip支持两种类型的参数:flag和parameter。flag由一个关键词组成;parameter由一个关键词加一个数值组成。为了方便,每个命令都有一个可以忽略的默认参数。例如,参数dev是ip link命令的默认参数,因此ip link ls eth0等于ip link ls dev eth0。我们将在后面的详细介绍每个命令的使用,命令的默认参数将使用default标出。 4.应用实例 添加IP地址192.168.2.2/24到eth0网卡上: #ip addr add 192.168.1.1/24 dev eth0 丢弃源地址属于192.168.2.0/24网络的所有数据报: #ip rule add from 192.168.2.0/24 prio 32777 reject ping 1.作用 ping检测主机网络接口状态,使用权限是所有用户。 2.格式 ping [-dfnqrRv][-c][-i][-I][-l][-p][-s][-t] IP地址 3.主要参数 -d:使用Socket的SO_DEBUG功能。 -c:设置完成要求回应的次数。 -f:极限检测。 -i:指定收发信息的间隔秒数。 -I:网络界面使用指定的网络界面送出数据包。 -l:前置载入,设置在送出要求信息之前,先行发出的数据包。 -n:只输出数值。 -p:设置填满数据包的范本样式。 -q:不显示指令执行过程,开头和结尾的相关信息除外。 -r:忽略普通的Routing Table,直接将数据包送到远端主机上。 -R:记录路由过程。 -s:设置数据包的大小。 -t:设置存活数值TTL的大小。 -v:详细显示指令的执行过程。 ping 命令是使用最多的网络指令,通常我们使用它检测网络是否连通,它使用ICMP协议。但是有时会有这样的情况,我们可以浏览器查看一个网页,但是却无法 ping通,这是因为一些网站处于安全考虑安装了防火墙。另外,也可以在自己计算机上试一试,通过下面的方法使系统对ping没有反应: # echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all netstat 1.作用 检查整个Linux网络状态。 2.格式 netstat [-acCeFghilMnNoprstuvVwx][-A][--ip] 3.主要参数 -a--all:显示所有连线的Socket。 -A:列出该网络类型连线的IP相关地址和网络类型。 -c--continuous:持续列出网络状态。 -C--cache:显示路由器配置的快取信息。 -e--extend:显示网络其它相关信息。 -F--fib:显示FIB。 -g--groups:显示多重广播功能群组组员名单。 -h--help:在线帮助。 -i--interfaces:显示网络界面信息表单。 -l--listening:显示监控服务器的Socket。 -M--masquerade:显示伪装的网络连线。 -n--numeric:直接使用IP地址,而不通过域名服务器。 -N--netlink--symbolic:显示网络硬件外围设备的符号连接名称。 -o--timers:显示计时器。 -p--programs:显示正在使用Socket的程序识别码和程序名称。 -r--route:显示Routing Table。 -s--statistice:显示网络工作信息统计表。 -t--tcp:显示TCP传输协议的连线状况。 -u--udp:显示UDP传输协议的连线状况。 -v--verbose:显示指令执行过程。 -V--version:显示版本信息。 -w--raw:显示RAW传输协议的连线状况。 -x--unix:和指定“-A unix”参数相同。 --ip--inet:和指定“-A inet”参数相同。 4.应用实例 netstat 主要用于Linux察看自身的网络状况,如开启的端口、在为哪些用户服务,以及服务的状态等。此外,它还显示系统路由表、网络接口状态等。可以说,它是一个综合性的网络状态的察看工具。在默认情况下,netstat只显示已建立连接的端口。如果要显示处于监听状态的所有端口,使用-a参数即可: #netstat -a Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:32768 *:* LISTEN tcp 0 0 *:32769 *:* LISTEN tcp 0 0 *:nfs *:* LISTEN tcp 0 0 *:32770 *:* LISTEN tcp 0 0 *:868 *:* LISTEN tcp 0 0 *:617 *:* LISTEN tcp 0 0 *:mysql *:* LISTEN tcp 0 0 *:netbios-ssn *:* LISTEN tcp 0 0 *:sunrpc *:* LISTEN tcp 0 0 *:10000 *:* LISTEN tcp 0 0 *:http *:* LISTEN ...... 上面显示出,这台主机同时提供HTTP、FTP、NFS、MySQL等服务。 telnet 1.作用 telnet表示开启终端机阶段作业,并登入远端主机。telnet是一个Linux命令,同时也是一个协议(远程登陆协议)。 2.格式 telnet [-8acdEfFKLrx][-b][-e][-k][-l][-n][-S][-X][主机名称IP地址] 3.主要参数 -8:允许使用8位字符资料,包括输入与输出。 -a:尝试自动登入远端系统。 -b:使用别名指定远端主机名称。 -c:不读取用户专属目录里的.telnetrc文件。 -d:启动排错模式。 -e:设置脱离字符。 -E:滤除脱离字符。 -f:此参数的效果和指定“-F”参数相同。 -F:使用Kerberos V5认证时,加上此参数可把本地主机的认证数据上传到远端主机。 -k:使用Kerberos认证时,加上此参数让远端主机采用指定的领域名,而非该主机的域名。 -K:不自动登入远端主机。 -l:指定要登入远端主机的用户名称。 -L:允许输出8位字符资料。 -n:指定文件记录相关信息。 -r:使用类似rlogin指令的用户界面。 -S:服务类型,设置telnet连线所需的IP TOS信息。 -x:假设主机有支持数据加密的功能,就使用它。 -X:关闭指定的认证形态。 4.应用说明 用户使用telnet命令可以进行远程登录,并在远程计算机之间进行通信。用户通过网络在远程计算机上登录,就像登录到本地机上执行命令一样。为了通过 telnet登录到远程计算机上,必须知道远程机上的合法用户名和口令。虽然有些系统确实为远程用户提供登录功能,但出于对安全的考虑,要限制来宾的操作权限,因此,这种情况下能使用的功能是很少的。 t
### 回答1: 《Linux与Unix Shell编程指南》是一本比较经典的技术书籍,其内容涵盖了Linux和Unix系统下的Shell编程Shell是一种命令行解释器,它能够让用户通过输入命令来与操作系统进行交互。 该书的主要内容包括介绍了Shell编程的基本概念、语法、常用命令和技巧。通过讲解Shell的语法和基本命令,读者可以提高自己 Shell 编程的能力,并学会如何编写脚本来完成一些自动化的操作。此外,书还介绍了一些高级的 Shell 编程技巧,例如使用正则表达式、函数编程、流程控制等。 由于Linux和Unix系统广泛应用于服务器和计算机集群等领域,因此Shell编程技能也成为了很多IT从业者必备的技能之一。掌握Shell编程不仅可以提高工作效率,还能提高对系统的了解和理解,对于系统管理员、开发人员和软件测试人员等IT从业者来说都是非常重要的。 总之,《Linux与Unix Shell编程指南》对于想要进一步学习Linux和Unix系统、提高Shell编程技能的读者来说,是一本非常有价值的技术书籍。 ### 回答2: Linux与Unix Shell编程指南是一本非常著名的书籍,主要介绍了Shell编程的基础知识和实际应用技巧。ShellLinux和Unix系统的一种命令行解释器,也是一种编程语言,它可以通过脚本编写来自动化执行一些常用的任务。 本书的作者是Shih-Wei Yuan和Mark G. Sobell,共有25章,从介绍Shell的概念和历史开始,详细阐述Shell编程的语法、变量、流程控制、函数、调试等方面的知识。 其,重点涵盖了Shell脚本的结构和用途,Shell的字符串操作和正则表达式,Shell的内建命令和外部命令的使用,以及Shell如何处理变量和环境。 此外,该书还介绍了一些实际应用案例,例如Shell脚本编写的服务监控、日志分析和一些常用的工具应用等方面。这些例子丰富了读者的经验和实践能力。 总之,Linux与Unix Shell编程指南是一本深入浅出、通俗易懂的书籍,对Shell编程感兴趣的读者可以通过学习此书来快速上手,提高自己的工作效率。无论是在日常的运维管理、软件开发还是数据处理等方面,Shell都是一种非常强大的工具,能够为用户带来很多便利。 ### 回答3: Linux与Unix Shell编程指南是一本经典的编程入门书籍,通过简单易懂的方式介绍了Shell脚本语言的基础知识以及常用的编程技巧。本书内容涵盖Shell基本语法、变量、流程控制、函数、正则表达式等方面,深入浅出地带领读者进入Shell编程的世界。 Shell编程在Unix/Linux系统有着极其重要的应用,通过编写Shell程序可以轻松地完成常规的文本文件处理、系统管理及自动化化脚本等任务,提高工作效率,减少人为错误。本书通过大量的实例演示Shell编程的各种应用场景,让读者感受到编程的乐趣。 构造复杂的Shell程序需要掌握逻辑和算法,本书深入理解了各种算法和数据结构,并详细解释了如何使用Shell进行实现。此以外,本书通过对Shell开发环境、调试工具以及面向对象编程等方面的阐述,让读者通过本书学习到Shell开发的全过程,并顺利地实现编程目标。 总之,本书是一本适合初学者入门的Shell编程指南,也是一本深入学习Shell编程的经验分享之作。如果您是一名初学Shell编程的开发者或管理员,本书将是您不可错过的好书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值