红帽Linux操作系统基本命令(学习笔记)


前言

   Linux操作系统被广泛的应用于企业服务器领域,目前市场上的网络设备都是使用linux内核操作系统,一些网络服务器也是使用linux操作系统下面的服务搭建实现的,目前操作系统这块也基本被linux占据,使用linux的iptables功能可以做代理服务器和防火墙;使用samba服务的功能可以做搭建和打印共享服务器。
  在网络应用方向,比如一些企业软件都会基于linux,而且现在的软件与网络密切相关,系统维护方向,当然是对公司内部电脑进行管理维护,并非开发,其次驱动开发,开发外围设备的驱动程序;最后转向嵌入式linux相关工作,主要是arm、mips平台上应用程序及驱动开发。


一、安装linux系统

  1. 分区

    • /boot : 系统启动时候存放加载镜像文件
      vmlinuz-2.6.18-194.el5
      100M
    • swap : 用于处理数据
      大小:一般是内存(DDR)的1.5 ~ 2陪之间
    • / : 根文件系统
      所有的文件都是从根开始
      所有的设备皆文件
  2. 包选择

    • 开发:
      开发工具
      开发库 全选
    • 语言支持:
      中文支持
      英持 全选
  3. 安装vmware-tools:

    目的:

    1. 为了linux和windows之间鼠标共享
    2. 提高分辨率 ,就可以全屏显示linux
  4. 用户:root
    密码:123456
    提示:开发过程为了方便记忆,建议密码是自己记得住的

linux的桌面环境
1 如何打开终端:
点击鼠标右键 => 打开终端
alt+F2 => gnome-terminal => enter

	提示信息:
		[root@localhost ~]# 
		root : 表示当前登录用户名
		localhost : 表示主机名
		~	:表示当前工作目录
			:表示当前用户家目录 /root

2 关闭终端:
	exit

3 最大化窗口
	alt + F10
4 最小化窗口
	alt + F9
5 切换终端:
	alt + tab
6 放大字体
	ctrl + shift + +
7 缩小字体
	ctrl + -
	
	永久放大或者缩小字体
	编辑 => 当前配置文件 => 

8 一个终端打开多个标签
	ctrl + shift + t

	标签之间切换
		alt + num(1,2,3,4,5,6,7...)

9 关机
	shutdown -h now
	init 0

10 重启
	reboot
	shutdown -r now
	init 6

查看系统版本:

[root@localhost linux]# lsb_release -a
LSB Version:
:core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: RedHatEnterpriseServer
Description:    Red Hat Enterprise Linux Server release 5.5 (Tikanga)
Release:        5.5
Codename:       Tikanga

查看kernel版本 www.kernel.org

[root@localhost linux]# uname -r
 2.6.18-194.el5

2 : 表示主版本号
kernel系统架构发生大的改变,才会修改主版本号
6 :表示次版本号
奇数:表示测试版本
偶数:表示稳定版本
18 : 表示释放版本号
小的bug

查看系统平台:
[root@localhost linux]# uname -m
i686 表示32位系统
x86_64 表示64位系统
long => 32 => 4 => 32 => -2147483648 ~ 2147483647
=> 64 => 8 => 64 => -9223372036854775808 ~ 9223372036854775807

其他信息

[root@localhost linux]# uname -a
Linux localhost.localdomain 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:43 EDT 2010 i686 i686 i386 GNU/Linux

Linux	:	表示kernel
localhost.localdomain	:	表示主机名
2.6.18-194.el5	:	表示kernel版本
#1 SMP Tue Mar 16     21:52:43 EDT 2010	:表示第一次发布时间
i686 i686 i386	:	表示32位系统
GNU/Linux		:	表示系统名

 kening03 => 11223344
 service network restart
 ping 192.168.5.254 -c 3
 vncviewer 192.168.5.254

二 、根文件系统目录详解

1 所有的文件都是从根开始
2 所有的设备皆文件

/ : 表示根目录

/bin 	: 表示存放命令的目录 二进制可执行文件
/sbin 	: 表示管理员命令  root
/media	: 表示挂载U盘 光盘 硬盘目录
/usr	: 表示用户安装软件的目录
	/usr/bin
	/usr/sbin
	/usr/include : 表示系统头文件存放路径
/boot	: 表示存放镜像文件分区
	vmlinuz-2.6.18-194.el5
/dev	: 表示存放设备类文件目录
	字符设备类文件
	块设备类文件
/mnt	: 表示默认挂载目录
	共享windows目录给linux 
		/mnt/hgfs/dirname

/etc	: 表示配置文件存放目录
	/etc/sysconfig/network-scripts/ifcfg-eth0 网卡配置信息
	/etc/passwd	用户信息文件

/lib	: 表示系统库目录
	.so : 表示动态库
	.a  : 表示静态库

/opt	: 表示扩张包存放目录
/sys	: 虚拟目录 系统模块目录
/proc   : 虚拟目录 进程目录

/tmp    : 表示临时目录
/root	: 表示管理员的家目录
	/root/Desktop/	: 表示桌面
/home	: 表示普通用户家目录

基本命令:
分类:
内部命令:就是shell(kernel)自带的一些命令,没有路径
外部命令:就是用户安装的一些命令,会存放路径
区分:
type + cmd
案例:

		[root@localhost ~]# type cd
		cd is a shell builtin		表示内部命令
		[root@localhost ~]# type tar
		tar is /bin/tar				表示外部命令
		[root@localhost ~]# type ls
		ls is aliased to `ls --color=tty'	表示别名
		[root@localhost ~]# which ls	查找命令路径	
		alias ls='ls --color=tty'
		        /bin/ls

别名:

临时有效
[root@localhost ~]# alias lls=ls
[root@localhost ~]# lls
01_hello.c       a.out    install.log         minicom.log
anaconda-ks.cfg  Desktop  install.log.syslog
永久有效
	vim ~/.bashrc
	
	添加如下一行
	alias lls='ls'

	文件生效
	source  ~/.bashrc

三、文件属性与权限

用户名:root =>

基本命令:
\quad 内部命令:
\quad 外部命令:

man : 表示帮助
\quad format : man + [num] + cmd
\quad man 7 man
\quad 1 Commands 表示基本命令
\quad 2 System calls 表示系统调用函数说明文档
\quad 3 Library calls 表示C库或者第三方库的说明文档
\quad 4 Special files 表示特殊文件说明 /dev
\quad 5 File formats and conventions : 表示文件格式说明文档
\quad 6 Games 表示内核相关说明文档
\quad 7 Conventions and miscellaneous 表示网络相关
\quad 8 System management commands 表示管理员命令
\quad 9 Kernel routines 表示内核相关
退出man : q

help :
\quad 内部命令:help + cmd
\quad 外部命令:cmd + --help

info :

内事不绝问百度 外事不绝问谷歌

tab键
\quad 1 对文件自动补齐
\quad 2 对命令自动补齐

注意: 按tab件没有补全,则可能不存放匹配信息或者可能匹配多个文件信息,则再按一次tab键。

ls : 显示目录相关连接
\quad format : ls [option] … [filename | dirname] …

option :
	-a : 表示显示所有的文件或者目录
		.filename or .dirname : 表示隐藏
		. : 表示当前的工作目录
		..: 表示上级目录
	-i : 表示显示文件inode节点号或者文件索引号
		计算机识别文件的唯一标识。
		如果inode节点号一致,表示是同一个文件。
	-l : 表示长格式显示文件信息
		[root@localhost test]# ls -l
		总计 16
		-rwxr-xr-x 1 root root 4729 03-18 20:40 a.out
		-rw-r--r-- 1 root root    0 03-19 09:56 hehelo.c
		-rw-r--r-- 1 root root  106 03-18 22:00 hello.c
		第一列:表示文件类型和权限
			类型:第一个字符
				- : 表示普通文件
				d : 表示目录文件
				c : 表示字符设备类文件
				l : 表示软连接文件
				b : 表示块设备类文件
				s : 表示套接子文件
				p : 表示管道文件
			权限:三位为一组,共三组
				第一组:表示文件属主权限
				第二组:表示文件属组的权限
				第三组:表示其他用户对文件权限
				r : 表示只读
				w : 表示只写
				x : 表示可执行
				- : 表示无权限

		第二列:表示文件硬连接数
			硬连接:相当于给文件做一个备份
				ln srcfilename  destfilename

			软连接:相单当于创建一个快捷方式
				ln -s stcfilename destfilename
			区别:
				1 硬链接inode节点号是一致的,软连接的inode节点号不一致。
				2 硬连接不可以操作目录,软连接可以
				3 如果跨目录,硬连接不需要指定路径,软连接要指定绝对路径。
				4 硬连接不可以跨分区,软连接可以跨分区
		第三列:表示文件属主
			表示文件拥有者是那个用户
		第四列:表示文件属组
			表示文件的拥有组是那个组中的用户所有
		第五列:表示文件大小 字节
			-h : 表示易读方式显示文件大小
			Byte => K => M => G => T => P => ....

		第六列:表示修改文件内容时间
			atime:访问时间(cat more less head tail ...)
			ctime:修改文件属性(chmod chown)
			mtime:修改文件内容,同时会触发atime 和 ctime时间(vim)
				
		第七列:表示文件名

四、用户和用户组管理

pwd : 查看当前工作目录的绝对路径

文件权限:
r => 4
w => 2
x => 1

用户:
	属主:		u
	属组:		g
	其他用户:	o
	所有用户:	a

设定权限:chmod

案例:
	属主添加一个可执行权限
		[root@localhost test]# ll
		总计 0
		-rw-r--r-- 1 root root 0 03-19 10:29 a.txt
		[root@localhost test]# chmod u+x a.txt 
		[root@localhost test]# ll
		总计 0
		-rwxr--r-- 1 root root 0 03-19 10:29 a.txt
	属组删除读权限
		[root@localhost test]# ll
		总计 0
		-rwxr--r-- 1 root root 0 03-19 10:29 a.txt
		[root@localhost test]# chmod g-r a.txt 
		[root@localhost test]# ll
		总计 0
		-rwx---r-- 1 root root 0 03-19 10:29 a.txt

	其他用户指定可读,可写,可执行权限
		[root@localhost test]# ll
		总计 0
		-rwx---r-- 1 root root 0 03-19 10:29 a.txt
		[root@localhost test]# chmod o=rwx a.txt 
		[root@localhost test]# ll
		总计 0
		-rwx---rwx 1 root root 0 03-19 10:29 a.txt

	所用用户只读权限
		[root@localhost test]# chmod a=r a.txt 
		[root@localhost test]# ll
		总计 0
		-r--r--r-- 1 root root 0 03-19 10:29 a.txt

	数字设定权限方式
		[root@localhost test]# chmod 754 a.txt 
		[root@localhost test]# ll
		总计 0
		-rwxr-xr-- 1 root root 0 03-19 10:29 a.txt

创建用户:

useradd usrename 
案例:
	[root@localhost test]# useradd xiaocao
	[root@localhost test]# ls /home
	lisi  wangmazi  xiaocao

用户设定密码

[root@localhost test]# passwd xiaocao
Changing password for user xiaocao.
New UNIX password: 
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password: 
passwd: all authentication tokens updated successfully.

删除用户:

[root@localhost test]# userdel -r xiaocao

切换用户

su - username

退出:

exit

设定属主和属组 chown

案例:
	修改文件属主
		[root@localhost test]# ll
		总计 0
		-rwxr-xr-- 1 root root 0 03-19 10:29 a.txt
		[root@localhost test]# ls /home
		lisi  wangmazi  xiaocao
		[root@localhost test]# chown lisi a.txt 
		[root@localhost test]# ll
		总计 0
		-rwxr-xr-- 1 lisi root 0 03-19 10:29 a.txt

	修改属组:
		[root@localhost test]# ll
		总计 0
		-rwxr-xr-- 1 lisi root 0 03-19 10:29 a.txt
		[root@localhost test]# chown :xiaocao a.txt 
		[root@localhost test]# ll
		总计 0
		-rwxr-xr-- 1 lisi xiaocao 0 03-19 10:29 a.txt

查看文件属性:

[root@localhost test]# stat a.txt 
  File: “a.txt”
    Size: 0               Blocks: 0          IO Block: 4096   一般空文件
	Device: 802h/2050d      Inode: 6710906     Links: 1
	Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/
	root)
	Access: 2023-03-19 11:48:21.000000000 +0800
	Modify: 2023-03-19 11:48:21.000000000 +0800
	Change: 2023-03-19 11:48:21.000000000 +0800
	[root@localhost test]# 

ls -l

chmod 指定权限
chown 指定属主和属组
useradd 创建用户
passwd 设置用户密码
userdel -r 彻底删除用户
su - 切换用户

cd : 切换目录
pwd : 查看当前工作目录的绝对路径

mkdir rmdir
touch rm

cp mv

cat tac more less head tail
grep cut uniq sort wc tr

管道命令:|
前一个命令的输出作为后一个命令输入
案例:

[root@localhost test]# cat /etc/passwd | grep root | wc -l
2

练习:统计/etc/passwd共有多少种shell

cat /etc/passwd | cut -d : -f 7 | sort | uniq | grep -v ^$ | wc -l

五、重定向

重定向:改变输入或者输出的方向

输出重定向:
   正确的输出重定向:>
案例:

			[root@localhost test]# ls 
			a  aa  a.txt
			[root@localhost test]# ls > a.txt 
			[root@localhost test]# cat a.txt 
			a
			aa
			a.txt

  错误的输出重定向:2>
案例:

			[root@localhost test]# ls /khfjd
			ls: /khfjd: 没有那个文件或目录
			[root@localhost test]# ls /khfjd 2> a.txt
			[root@localhost test]# cat a.txt 
			ls: /khfjd: 没有那个文件或目录

正确追加输出重定向:>>
错误追加输出重定向:2>>
错误和正确保存同一个文件中: &>

黑洞文件:

		/dev/null

输入重定向:<
  案例:

		[root@localhost test]# passwd < a.txt 
		Changing password for user root.
		New UNIX password: BAD PASSWORD: it is too simplistic/systematic
		Retype new UNIX password: passwd: all authentication tokens updated successfully.

函数结束标记:<<
  案例:

		[root@localhost test]# cat << AAA
		> jdh
		> kjklfjhkd
		> jhgkdjgf
		> kjgf
		> AAA
		jdh
		kjklfjhkd
		jhgkdjgf
		kjgf

六、vim 程序开发器

vim 的官方网站

编辑器:vim 程序开发器
编译器:gcc

版本:
vim -v

三种模式:

  • 一般模式:vim filename 直接打开文件的模式
  • 一编辑模式:文件的左下角有插入字样的模式
  • 命令行模式:文件的左下角有 : 字样的模式

模式之间切换
一般模式切换到编辑模式
i I a A o O s S

编辑模式切换到命令行模式
	ESC键 => :
	:wq : 表示保存并退出

练习:实现C开发流程

  1. 创建.c源文件

    touch hello.c
    
  2. 实现.c文件

     vim hello.c  #自行编写“hello world!”的输出!
    
  3. 编译

     gcc hello.c
    
  4. 执行:

    [root@localhost test]# ./a.out 
    hello world!
    

一般模式常用命令和参数

删除:
	dd 	: 删除一行
	ndd	: 删除n行
	u	: 撤销上次操作

	dw	: 删除一个单词 必须在单词首字母处
	ndw : 删除n个单词
	daw	: 删除一个单词 单词任意位置
	
	d$	: 删除到行尾
	d^	: 删除到行首
	dgg	: 删除到文件开头
	dG	: 删除到文件结尾
复制:
	yy	: 复制一行
	p	: 粘贴

	同上 d => y
可视化操作:
	可视化字符:
		v => 方向键 => y => p
	可视化行:
		shift + v => 方向键 => y => p
	可视化块:
		ctrl + v => 方向键 => y => p

剪贴:
	yy => p => dd
	dd => p
移动:
	h	: 左移
	j	: 下移
	k	: 上移
	l	: 右移
	ngg	: 定义第8行
	$	: 行尾
	^	: 行首
	gg	: 文件开头
	G	: 文件结尾
	H	:屏幕顶部
	L	: 屏幕底部
	M	: 屏幕中间
	50%	: 文件中间
	J	: 合并两行为一行

i	: 光标前面的插入
I	: 行首的插入	
a	: 光标后面插入	
A	: 行尾插入
o	: 下一行插入(新行)
O	: 上一行插入(新行)
s	: 删除光标位置字符插入
S	: 删除当前行的插入
ctrl + p : 补齐关键字

命令行模式常用命令和参数

:wq		表示保存并退出
:w		表示保存
:q		表示退出
:wq!	表示强制保存并退出
:q!		表示强制退出

:w filename 表示另存为

执行外部命令格式:
	:r !cmd
	案例:所有的内容加载到当前文件中
		:r !cat world.c
	案例:复制若干行到当前文件中
		:r !sed -n "5,8p" ./world.c
		复制world.c文件中的第五行到第八行的内容到当前文件中。

临时有效:
:set number		表示显示行号
:set nonu		表示取消行号

永久有效
vim ~/.vimrc	vim的配置文件

添加如下一行
	set nu

	set ic  : 表示不区分大小写

移动:
	左移:shift + <
	右移:shift + >

七、终端分屏显示

分屏显示:
1. 垂直切割:

	vim -O filename1 filename2 ... filenamen

	文件切换:
		ctrl + w 2次
	关闭所有文件:
		:wqa
	
	:vslpit filename
  1. 水平切割:

     vim -o filename1 filename2 ... filenamen
    
     :split filename
    

八、查找 和 替换

查找格式:
	:/key

	n : 表示查找下一个
	N : 表示查找上一个

替换:
	:m,ns/oldkey/newkey/option

	m : 表示起始行
	n : 表示结束行
	s : 表示关键字
	option :
		g : 表示全部替换
		i : 表示不区分大小写替换
练习:
	:%s/\/\/https:www/ftp/g

	% : 表示全文
	\ : 表示转义字符

设定密码:

:X 

取消密码:

:set key=

九、shell编程

  Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
  Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
  Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
shell也叫命令解析器 或者说用于用户和kerne交互式界面
shell也是一门计算机语言

查看当前系统所支持所有shell

[root@localhost test]# ls /bin/*sh
/bin/bash  /bin/csh  /bin/ksh  /bin/sh  /bin/tcsh

查看当前系统使用shell

[root@localhost test]# echo $SHELL
/bin/bash
  1. shell入口 => hello world
    1. 创建shell的脚本文件

      touch 01_hello.sh
      
    2. 实现

       #!/bin/bash
       echo hello
      
    #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

echo 命令用于向窗口输出文本。
3. 指定可执行权限

	  chmod 755 01_hello.sh
	
4. 执行

	   ./01_hello.sh
  1. 变量:没有类型
    局部变量:只对当前的shell起作用
    定义 : valname=value
    查看 :set
    取值 :${valname}

    环境变量:不仅对当前的shell起作用,也对子shell起作用
    定义:export valname=value
    查看:env
    取值:${valname}

    算术运算:+ - * / % 不支持浮点数
    [ [ [valname option $valname]

    练习:实现两个数交换

  2. 输入输出语句

    • 输出语句
      echo
      -n : 表示不换行
      C语言的是printf

    • 输入语句
      read:
      -p : 表示显示提示信息
      -s : 表示关闭回显
      -t : 表示设置超时 秒
      -n : 表示设置最大接受字符个数
      C语言的是scanf

  3. 自动变量
    $0 : 表示执行文件名
    $1 : 表示第一个参数
    $1 : 表示第二个参数

    $# : 表示接受参数个数
    $? : 表示上次执行命令成功与否
    成功:0
    失败:非零

    计算机识别程序的唯一表示叫进程号
    $$ : 表示进程号

shell补全内容

系统变量

$HOME :当前登录用户的 "家目录" 路径
$USER:当前用户名
$RANDOM 可以随机生成 0~32767之间的整数数字

自定义变量

变量名=值;常量:readonly

xm="你好"
echo "姓名:$xm"
echo '姓名:$xm'
readonly p=3.14
n=`cat /etc/passwd | grep -c "root"`
echo $n

在shell编程中,``(反引号)的主要作用是命令替换‌。具体来说,反引号会将其中的命令执行,并将输出结果赋值给变量。

##特殊变量

特殊变量
$n n为number,$0代表该脚本名称,$1-$9代表第一到第九个参数
$# 获取所有输入参数的个数,常用于循环;
$@ 代表命令行中所有的参数,$@会把每个参数区分对待;
$? 返回最后一次命令执行的状态,返回0代表正确执行,返回非0代表执行不正确。

read 读取终端输入

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒)。

read -p “请输入密码:” s

read -p “请输入密码:” -t 10 mima

运算符

赋值运算符 =

算数运算符 + - * / %

比较运算符

字符串比较: == !=

数值比较:-eq 等于 -ne 不等于 -lt 小于 -le 小于等于 -gt 大于 -ge 大于等于

类型权限:-f 存在且是文件 -d 存在且是目录-r 读 (read) -w 写(write) -x 执行 (execute)

逻辑运算符 -a -o !

算数运算符

  1. $((运算式)) 或 $[运算式]

  2. *+, - , , /, % 加,减,乘,除,取余

echo 3 + 4
n1=3
n2=4
echo $((($n1+$n2*3)/2%2))

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"
let c=($a + $b)

echo $c

选择结构

改变程序的执行顺序

选择一个结果

条件为bool类型,只能选择一个执行,

if和case两种

if结构,if、 if else、多重if

可以随意嵌套,两种方法都可以互相实现,选择更适合的方法实现

if 选择结构 —then 独立一行

[ ] 必须用空格隔开条件判断。

  if [ 条件判断 ]
then
程序
elif [ 条件判断 ]
then
程序
else
程序
  fi

case语句 等值判断

case $变量名 in	

"value 1")

如果变量的值等于value 1,则执行程序1

;;

"value 2")

如果变量的值等于value 2,则执行程序2

;;

…省略其他分支…

***)**

如果变量的值都不是以上的值,则执行此处程序

  ;;

esac
# if结构
sex="男"
if [ $sex == "男" ]
then
echo "去做饭"
elif [ $sex == "女" ]
then
echo "去逛街"
else
echo "其他"
fi

# case结构
sex="男"
case $sex in
"男")
echo "1"
;;
"女")
echo "2"
;;
*)
echo "3"
;;
esac
# 多条件应用
a=3
b=4
c="s"
if [ $a -lt $b -a $c == "s" ]
then
echo "true"
else
echo "false"
fi
# 判断文件是否存在
if [ -f /root/a.txt ]
then
echo "是"
cat /root/a.txt
else
echo "不是"
fi

for 循环

循环语句

循环具备的两个条件:循环条件和循环操作

条件为bool类型,plsql的循环能够让一段代码反复执行,为实现这一功能一共提供了三

种不同的循环结构:

loop简单循环或无限循环,其他语言叫do while

for循环

while循环

循环结构

三种循环各有差异但每个结构都包含两个部分:循环边界以及循环体。循环边界有一些

保留词组成,包括初始化循环、终止循环条件、完成循环的 end loop 语句。

循环结构和选择结构随意嵌套,同一功能可以互相实现,选择合适的方法

WHILE循环

while循环时一个条件循环,只要循环边界处定义的布尔条件的值为真,循环就会继续。

while循环的特性:

属性描述
循环结束语句当循环边界的布尔表达式为false 或者null时循环结束。
结束循环语句位置结束循环语句放在while关键字后,在循环体要执行前进行判断,所以while循环可能一次都不会执行循环体。
while循环使用场景无法明确循环体会循环几次,但有明确的循环停止条件,并且循环体不是一定要执行的情况使用 while循环。

for循环

for循环的特性

属性描述
循环结束语句for循环达到范围区间的循环次数就结束,或者在循环体中使用exit等语句停止。
结束循环语句位置每次循环体执行后,程序自动递增循环索引的值,直到超过区间范围后停止循环。
while循环使用场景有明确循环次数,并不提前结束循环的情况使用for循环。

for i in 集合

\# 序列
for i in `seq 1 5`
do
echo $i
done

\# 位置参数
for i in $@
do
echo $i
done
# 字符串
s="a b c dd e"
for i in $s
do
echo $i
done
# 命令结果
s=`ls /root` echo $s
echo $s
for i in $s
do
echo $i
done

while 循环

while [ 条件判断 ]

i=1
while [ $i -le 10 ]
do
echo $i
i=$(($i+1))
done
# 不确定循环次数
read -p "及格了吗?(y/n):" answer
while [ $answer == "n" ]
do
echo "学习做作业考试"
read -p "及格了吗?(y/n):" answer
done
echo "终于及格了"

乘法表(双层嵌套)

for i in `seq 1 9`
do
for j in `seq 1 $i`
do
echo -n " $j * $i = $(($i * $j)) "
done
echo ""
done

循环控制

break

continue

二重循环

循环里面嵌套循环,外层循环先开始,内层循环结束后,再开始外层的下一个循环:

for i in `seq 1 5`
do
	for j in `seq 1 5`
	do
	echo -n "$j"#内层循环
	done
echo "$i"#外层循环
done

自定义函数

name(){
action;
}

function name
{
Action;
}

name

因为shell脚本是从上到下逐行运行,不会像其它语言一样先编译,所以函数必须在调用之前,先声明。

函数返回值,return后只能跟数值n(0-255)

接收返回值方法:在函数内部使用 echo命令将结果输出,在函数外部使用$()或者``捕获结果。

# 无输入无返回
hello(){
echo "test"
}
hello
#写一个自定义函数,计算两个输入参数的和
he(){
s=0
s=$(($1 + $2))
echo "$s"
}
he 3 65
jieguo=`he 3 65`
echo "和是:$jieguo"

###可以输入参数

read -p "请输入第一个数:" n1

read -p "请输入第二个数:" n2

jieguo=`he $n1 $n2`

echo "和是:$jieguo"

\#也可以使用shell位置参数传递到函数

可以互相调用

he(){
date
hello
s=0
s=$(($1 + $2))
echo "$s"
}

递归自己调用自己

# 输入一个目录显示里面的所有目录

fun(){
for i in `ls $1`
do
if [ -d $1/$i ]
then
echo $i
fi
done
}

fun /root

Shell工具

sort

sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。

选项说明
-n依照数值的大小排序
-r以相反的顺序来排序
-t设置排序时所用的分隔字符
-k指定需要排序的列

参数:指定待排序的文件列表

shell下面建立如下文件sort.txt

bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6

按照“:”分割后的第三列倒序排序。

sort -t ":" -nrk 3 /root/shell/sort.txt

bb:40:5.4
bd:20:4.2
cls:10:3.5
xz:50:2.3
ss:30:1.6

grep 、sed、awk被称为linux中的三剑客。

我们总结一下这三个"剑客"的特长。

  • grep 更适合单纯的查找或匹配文本

  • sed 更适合编辑匹配到的文本

    • awk 更适合格式化文本,对文本进行较复杂格式处理

sed

sed: stream editor(流编辑器)的简称。

它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中(“模式空间“),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

  • p 打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

  • i 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

  • a 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)

  • s 取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!

1.显示文件的第 2 行的内容:
sed -n '2 p' /root/shell/sort.txt
2.显示文件的第 2 行到第 4 行的内容:
sed -n '2,4 p' /root/shell/sort.txt
3.将文件中的bb全部替换为BB
sed 's/bb/BB/g' /root/shell/sort.txt
4.以文件bb开头的上一行添加
sed '/^bb/i hello' /root/shell/sort.txt
5.将文件中的d全部删除
sed 's/d//g' /root/shell/sort.txt
注:可以使用管道符连续处理,接着重定向保存,使用\拼接换行

awk

一个完整的awk命令形式如下:

awk [options] 'BEGIN{ commands } { commands } END{ commands }' file

-v 指定 FS 和 OFS 字段分隔符和输出字段分隔符

内置参数:

  • NF 分割完字段的数量

  • $1 代表文本行中的第 1 个数据字段;

  • $2 代表文本行中的第 2 个数据字段;

输出指定列:{print $1,$2}

分隔符相同的情况输出一整行:{print}

1.以:为分隔符,打印第2列和第1列
awk -v FS=":" '{print $2,$1}' /root/shell/sort.txt
2.以:为分隔符,打印第2列和第1列,列之间用,分割
awk -v FS=":" -v OFS="," '{print $2,$1}' /root/shell/sort.txt
3.添加列保存为csv,下载,使用excel查看
awk -v FS=":" -v OFS="," 'BEGIN{print "one,two,three"}{print $2,$1,$3}'
/root/shell/sort.txt > /root/shell/sort.csv
4.第二列大于30
awk -v FS=":" '{ if($2>30){print $2}}' /root/shell/sort.txt
5.行列总数量
awk -v FS=":" 'BEGIN{n=0}{for(i=1;i<=NF;i++){n++} }END{print n}' /root/shell/sort.txt
注:可以使用管道符连续处理,接着重定向保存,使用\拼接换行
内置变量
  1. FS
    输入字段分隔符,默认空格或制表符。
    示例

    awk 'BEGIN{FS=":"} {print $1}' /etc/passwd  # 等价于 `-F:`:cite[3]:cite[7]。
    
  2. OFS
    输出字段分隔符,默认空格。
    示例

    awk 'BEGIN{OFS="|"} {print $1, $2}' data.txt  # 输出字段以 `|` 分隔:cite[3]:cite[7]。
    
  3. RSORS

    • RS:输入记录分隔符(默认换行符)。

      awk 'BEGIN{RS=";"} {print $0}' data.txt  # 以分号分隔记录:cite[3]:cite[7]。
      
    • ORS:输出记录分隔符(默认换行符)。

      awk 'BEGIN{ORS=";"} {print $0}' data.txt  # 输出以分号结尾:cite[3]:cite[7]。
      
  4. NRFNR

    • NR:全局行号(跨文件累计)。
    • FNR:当前文件行号(每个文件从1开始)。
      示例
    awk '{print NR, FNR, $0}' file1.txt file2.txt  # 显示全局和文件行号:cite[3]:cite[7]。
    
  5. NF
    当前行的字段数。
    示例

    awk '{print NF, $NF}' data.txt  # 打印字段数和最后一个字段:cite[3]:cite[7]。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锦鳞 百跃升

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值