Redhat版本的Linux操作系统基本命令
前言
Linux操作系统被广泛的应用于企业服务器领域,目前市场上的网络设备都是使用linux内核操作系统,一些网络服务器也是使用linux操作系统下面的服务搭建实现的,目前操作系统这块也基本被linux占据,使用linux的iptables功能可以做代理服务器和防火墙;使用samba服务的功能可以做搭建和打印共享服务器。
在网络应用方向,比如一些企业软件都会基于linux,而且现在的软件与网络密切相关,系统维护方向,当然是对公司内部电脑进行管理维护,并非开发,其次驱动开发,开发外围设备的驱动程序;最后转向嵌入式linux相关工作,主要是arm、mips平台上应用程序及驱动开发。
一、安装linux系统
-
分区
- /boot : 系统启动时候存放加载镜像文件
vmlinuz-2.6.18-194.el5
100M - swap : 用于处理数据
大小:一般是内存(DDR)的1.5 ~ 2陪之间 - / : 根文件系统
所有的文件都是从根开始
所有的设备皆文件
- /boot : 系统启动时候存放加载镜像文件
-
包选择
- 开发:
开发工具
开发库 全选 - 语言支持:
中文支持
英持 全选
- 开发:
-
安装vmware-tools:
目的:
- 为了linux和windows之间鼠标共享
- 提高分辨率 ,就可以全屏显示linux
-
用户: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 程序开发器
编译器:gcc
版本:
vim -v
三种模式:
- 一般模式:vim filename 直接打开文件的模式
- 一编辑模式:文件的左下角有插入字样的模式
- 命令行模式:文件的左下角有 : 字样的模式
模式之间切换
一般模式切换到编辑模式
i I a A o O s S
编辑模式切换到命令行模式
ESC键 => :
:wq : 表示保存并退出
练习:实现C开发流程
-
创建.c源文件
touch hello.c
-
实现.c文件
vim hello.c #自行编写“hello world!”的输出!
-
编译
gcc hello.c
-
执行:
[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
-
水平切割:
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
- shell入口 => hello world
-
创建shell的脚本文件
touch 01_hello.sh
-
实现
#!/bin/bash echo hello
-
echo 命令用于向窗口输出文本。
3. 指定可执行权限
chmod 755 01_hello.sh
4. 执行
./01_hello.sh
-
变量:没有类型
局部变量:只对当前的shell起作用
定义 : valname=value
查看 :set
取值 :${valname}环境变量:不仅对当前的shell起作用,也对子shell起作用
定义:export valname=value
查看:env
取值:${valname}算术运算:+ - * / % 不支持浮点数
[ [ [valname option $valname]练习:实现两个数交换
-
输入输出语句
-
输出语句
echo
-n : 表示不换行
C语言的是printf -
输入语句
read:
-p : 表示显示提示信息
-s : 表示关闭回显
-t : 表示设置超时 秒
-n : 表示设置最大接受字符个数
C语言的是scanf
-
-
自动变量
$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 !
算数运算符
-
$((运算式)) 或 $[运算式]
-
*+, - , , /, % 加,减,乘,除,取余
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
注:可以使用管道符连续处理,接着重定向保存,使用\拼接换行
内置变量
-
FS
输入字段分隔符,默认空格或制表符。
示例:awk 'BEGIN{FS=":"} {print $1}' /etc/passwd # 等价于 `-F:`:cite[3]:cite[7]。
-
OFS
输出字段分隔符,默认空格。
示例:awk 'BEGIN{OFS="|"} {print $1, $2}' data.txt # 输出字段以 `|` 分隔:cite[3]:cite[7]。
-
RS
和ORS
-
RS
:输入记录分隔符(默认换行符)。awk 'BEGIN{RS=";"} {print $0}' data.txt # 以分号分隔记录:cite[3]:cite[7]。
-
ORS
:输出记录分隔符(默认换行符)。awk 'BEGIN{ORS=";"} {print $0}' data.txt # 输出以分号结尾:cite[3]:cite[7]。
-
-
NR
和FNR
NR
:全局行号(跨文件累计)。FNR
:当前文件行号(每个文件从1开始)。
示例:
awk '{print NR, FNR, $0}' file1.txt file2.txt # 显示全局和文件行号:cite[3]:cite[7]。
-
NF
当前行的字段数。
示例:awk '{print NF, $NF}' data.txt # 打印字段数和最后一个字段:cite[3]:cite[7]。