由于windows运行时间过长时其运行速度会减慢,需要重启才能解决问题,而Linux能够保持服务器长时间稳定的运行,故而Linux的学习就很有必要,该文章主要是熟悉Linux并学习书写shell脚本完成满足部署服务器和Jenkins脚本的配置任务。
Linux安装详情请见
辅佐工具Xshell下载地址
辅佐工具WinSCP下载地址
目录名 | 目录作用 |
---|---|
/bin/ | 存放系统命令,普通和超级用户都可执行。是/usr/bin/目录软链接 |
/sbin/ | 存放系统命令,只有超级用户才可以执行。是/usr/sbin/目录软链接 |
/usr/bin | 存放系统命令,普通和超级用户都可执行 |
/sbin | 存放系统命令,只有超级用户才可以执行 |
/boot/ | 系统启动目录,保存于系统启动相关文件,如内核文件和启动引导程序grub文件等 |
/dev/ | 设备文件保存位置 |
/etc/ | 配置文件保存位置。系统内所有采用默认安装(rpm安装)服务配置文件都保存在此目录中,如用户信息、服务启动脚本、常用服务的配置文件等 |
/home/ | 普通用户家目录。创建用户时,每个用户都有一个默认登录和保存自己数据位置就是家目录,所有普通用户宿主目录是/home/下建立的一个和用户名相同的目录。如用户user1的家目录就是/home/user1/ |
/lib/ | 调用系统函数库保存位置。是/usr/lib的软链接 |
/lib/ | 64位函数库保存位置。是/usr/lib的软链接 |
/lost+found | 当系统意外崩溃或者机器意外关机产生的文件碎片存放地址。在系统启动的时候fsck工具会检查这里修复已经损坏的文件系统。这个目录只在每个分区中出现,例如/boot/lost+found就是/boot分区的备份恢复目录 |
/media/ | 挂载目录。系统建议用来挂载媒体设备,如软盘和光盘 |
/misc/ | 挂载目录。系统建议用来挂载NFS服务的共享目录 |
/mnt/ | 挂载目录。早期Linux只有这一个挂载目录。现系统建议用这个目录挂载额外设备,如U盘、移动硬盘和其他操作系统分区。但是常用/mnt/cdrom挂载光盘,/mnt/usb挂载U盘 |
/opt/ | 第三方安装软件保存位置。这个目录是放置和安装其他软件的位置,手工安装的源码包软件都可以安装到这个目录。不过还是习惯将软件放到/usr/local/目录中,也就是说,/usr/local/目录可以用来安装软件 |
/proc/ | 虚拟文件系统。该目录中的数据不保存在硬盘而是内存,主要保存系统内核、进程、外部设备状态和网络状态等。如/proc/cpuinfo保存CPU信息的 |
/sys/ | 虚拟文件系统。和/proc/目录相似,主要保存与内核相关的信息 |
/root/ | 普通用户宿主目录在/home/下,root宿主目录直接在"/"下 |
/run/ | 系统运行时产生的数据。/var/run/是次目录的软链接 |
/srv/ | 服务器数据目录。一些服务启动后,可以在这个目录中保存所有需要的数据 |
/tmp/ | 临时目录。系统存放临时文件的目录。所有用户都可以访问和写入。不建议存放重要数据,最好每次开机都将该目录清空 |
/usr/ | 系统软件目录。“UNIX Software Resource” 缩写,存放系统软件资源的目录。系统中安装的软件大多数保存在这里 |
/usr/lib | 应用程序调用的函数库保存位置 |
/usr/local | 手工安装软件保存位置。一般建议源码包软件安装在这个位置 |
/usr/share | 应用程序资源文件保存位置,如帮助文档、说明文档和字体目录 |
/usr/src/ | 源码包存放的位置。手工下载的源码包和内核源码包都可以保存在这里。不过更习惯吧手工下载的源码包保存到/usr/local/src/目录中,把内核源码保存到/usr/src/kernels/目录中 |
/usr/src/kernels/ | 内核源码保存位置 |
/var/ | 动态数据保存位置。主要保存缓存、日志以及软件运行所产生的文件 |
/var/www/html/ | RPM包安装的Apache的网页主目录 |
/var/lib | 程序运行中需要调用或改变的数据保存位置。如MySQL数据库保存在/var/lib/mysql.目录中 |
/var/log | 系统日志保存位置 |
/var/run | 一些服务和程序运行后,它们的PID(进程ID) 保存的位置。是/run/目录的软链接 |
/var/spool/ | 放置队列数据的目录。就是排队等待其他程序使用的数据,比如邮件队列和打印队列 |
/var/spool/ mail/ | 新收到的邮件队列保存位置 |
/var/spool/cron/ | 系统定时任务队列保存位置 |
用户身份 | 赋值方式 | 权限 | 数字权限 | 常用权限 |
---|---|---|---|---|
u:代表所有者 | +:加入权限 | r:读取权限 | 4代表读权限 | 644代表所属者具有读写权限,组和其他只读权限 |
g:代表所属组 | -:减去权限 | w:写入权限 | 2代表写权限 | 755代表所属者具有读写执行权限,组和其他只有读和执行权限 |
o:代表其他人 | =:设置权限 | x:执行权限 | 1代表执行权限 | |
a:代表全部身份 |
符号 | 第1位含义 |
---|---|
- | 普通文件 |
b | 块设备文件。特殊设备文件,存储设备都是这种文件,如分区文件/dev/sda1 |
c | 字符设备文件。特殊设备文件,输入设备都是这种文件,如鼠标,键盘 |
d | 目录文件 |
l | 软链接文件 |
p | 管道符文件 |
s | 套接字文件 |
符号 | 第2-4,5-7,8-10位含义 |
---|---|
r | red,读权限 |
w | write,写权限 |
e | execute,执行权限 |
- | 没有权限 |
权限 | 文件 | 目录 | 常用权限 |
---|---|---|---|
r | 可使用文件查看命令(cat等)看到文件内容 | 可以用目录查看命令(ls等)查看目录下有哪里子文件和子目录 | 0:任何权限都不赋予 |
w | 可以使用文件编辑命令(echo等)修改文件内容 | 可以用目录编辑命令(touch等)修改目录下的数据,也就是新建/删除/剪切/复制子文件或目录 | 5:浏览和进入权限 |
x | 可以执行该文件 | 代表可以用cd命令进入目录 | 7:完全权限 |
通配符(用于匹配文件名,完全匹配,find命令采用) | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配任意多个任意字符,也就是可以匹配任意内容 |
[] | 匹配括号中任意一个字符 |
[-] | 匹配一个任意字符,-代表一个范围 |
[^] | 匹配不是中括号内的一个字符 |
正则符(用于匹配字符串,模糊匹配,grep命令采用) | 作用 |
---|---|
? | 匹配前一个字符重复0次或1次(?是扩展正则,需要使用egrep命令) |
* | 匹配前一个字符重复0次或者任意多次 |
[] | 匹配中括号中任意一个字符 |
[-] | 匹配中括号中任意一个字符,-代表一个范围 |
[^] | 匹配不是中括号内的一个字符 |
^ | 匹配行首 |
$ | 匹配行尾 |
常用快捷键 | 作用 |
---|---|
Tab | 命令或文件补全 |
ctrl+A | 将光标移动到命令开头 |
ctrl+E | 将光标移动到命令结尾 |
ctrl+C | 强制终止当前命令 |
ctrl+L | 清屏 |
ctrl+U | 删除或剪切光标之前命令 |
ctrl+Y | 粘贴Ctrl+U剪切的内容 |
zip(/usr/bin/zip 压缩文件或目录) 格式:zip 压缩包名 源文件或目录 -r递归
unzip(/usr/bin/zip 解压缩)格式:unzip -d (指定解压缩位置) ana.zip
gzip(/bin/gzip 压缩文件或目录).gz格式是linux中常用压缩格式 -c输出压缩二进制文件,主要用于在压缩同时不删除源文件 -d解压缩 -r压缩目录中的文件
gunzip(/bin/gunzip 解压缩)
bzip2(/usr/bin/bzip2 压缩文件,不能压缩目录).bz2格式也是linux中的压缩格式 -d:解压缩 -k:压缩时保留源文件 -v显示压缩详细信息
bunzip2(/usr/bin/bunzip2解压命令)
tar(/bin/tar 打包与解打包命令) -c打包 -f指定压缩包的名称 -v显示打包过程 -x解打包 -t测试,不解打包,只查看包中有哪些文件 -C指定解打包位置
使用tar命令直接打包压缩:tar -z压缩和解压缩.tar.gz格式 -j压缩和解压缩.tar.bz2格式
sync(/bin/sync) 刷新文件系统缓存区
shutdown(/sbin/shutdown) 关机和重启 -c取消已经执行的shutdown命令
reboot重启
halt和poweroff命令都是关机命令。但是不会完全关闭和保存系统服务,不建议使用
init是修改Linux运行级别的命令,也可以用于关机(init 0)和重启(init 6)。但是并不安全,不建议使用
配置IP地址1)setup工具 2)vi /etc/sysconfig/network-scripts/ifcfg-eth0
重启网络服务 service network restart
ifconfig(configure a network interface /sbin/ifconfig 配置网络接口) 主要用来查看IP地址信息,直接输入ifconfig命令即可
ping(/bin/ping 向网络主机发送ICMP请求)是常用网络命令,主要通过ICMP协议进行网络探测,测试网络中主机的通信情况
netstat(/bin/netstat 网络状态查看命令,既可以看到本机开启的端口,也可以看到有哪些客户端连接)在CentOSetup7.x中netstat命令默认没有安装,需要安装net-snmp和net-tools软件包-tuln查看开启的端口 -tulnp查看本机有哪些程序开启端口 -an查看所有连接
write(/usr/bin/write 向其他指定用户发送消息)
wall给所有登录用户发送消息
mail(/bin/mail 发送和接收电子邮件)
w命令(/usr/bin/w)是显示正在登录的用户信息命令,查看的痕迹日志是/var/run/utemp,who命令和w命令相似不过显示内容更加简单
lat命令查看系统所有登录过的用户信息,包括登录用户和之前登录用户,查看的是/var/log/wtmp
lastlog命令查看系统中所有用户最后一次登录时间的命令,查看的日志是/var/log/lastlog文件
lastb命令查看错误登录的信息,查看的是/var/log/btmp痕迹日志
mount(/bin/mount linux所有存储设备都必须挂载使用,包括硬盘)
直接回车:查询系统中已经有的挂载设备
umount 设备文件名/挂载点 :LInux中使用完设备之后一定要卸载
CentOS 5.x以前系统光盘设备文件名是/dev/hdc,CentOS6.x之后的系统光盘设备文件名是/dev/sr0,无论哪个系统都有软链接/dev/cdrom,与可以作为光盘的设备文件名
U盘会和硬盘共用设备文件名,所以U盘的设备文件名不是固定的,需要手工查询fdisk -l(查询硬盘) mount -t vfat进行挂载 mount -a根据配置文件/etc/fstab的内容自动挂载(""Linux中表示换行)
挂载NTFS分区
命令 | 作用 |
---|---|
a | 在光标所在字符后插入 |
A | 在光标所在行尾插入 |
i | 在光标所在字符前插入 |
I | 在光标所在行首插入 |
o | 在光标下插入新行 |
O | 在光标上插入新行 |
命令 | 作用 |
---|---|
:w | 保存不退出 |
: w 新文件名 | 把文件另存为新文件 |
:q | 不保存退出 |
:wq | 保存退出 |
: ! | 强制 |
:q! | 强制不保存退出。用于修改文件后不保存数据退出 |
:wq! | 强制保存退出。当文件的所有者或者root用户,对文件没有写权限的时候,强制写入数据使用 |
效果 | 操作 |
---|---|
移动光标 | 方向键或者h、j、k、l键 ;gg移动到文件头、G移动到文件尾 ;移动到行首,$移动到行尾 ;n移动到第n行 |
删除或剪切 | x删除单个字母 ;nx删除n个字母 ;dd删除单行 ;ndd删除n行 ;:n1,n2d删除指定范围的行 ;dG从光标所在行删除到文件尾 |
复制 | yy复制单行 ;nyy复制n行 |
粘贴 | p粘贴到光标后 ;P粘贴到光标前 |
撤销 | u撤销 ;ctrl+r反撤销 |
替换 | r替换光标所在处字符 ;R从光标所在处开始替换字符,按ESC结束;:1,10s/old/new/g 替换1到10行所有old为new;:%s/old/new/g 替换整个文件的old为new ; |
查找 | /光标所在行之下查找; ?光标所在行之上查找 ;n下一个; N上一个 |
注释 | :1,10s/^ /#g "#“注释1到10行;:1,10s/^ #//g取消”#“注释;:1,10s/^ ////g”//“注释1到10行;1,10s/^////g取消”//"注释 |
设置参数 | 含义 |
---|---|
:set nu :set nonu | 显示与取消行号 |
:syntax on :syntax off | 是否依据语法显示相关颜色帮助 |
:set hlsearch :set nohlsearch | 设置是否将查找的字符串高亮显示。默认是高亮 |
:set ruler :set noruler | 设置是否显示右下角的状态栏。默认是设置 |
:set showmode :set noshowmode | 设置是否在左下角显示如"–INSERT–"之类的状态栏。默认是显示 |
:set list :set nolist | 设置是否显示隐藏字符,例如Tab键用"^I"表示等。默认是nolist显示。显示时使用"cat -A 文件名" |
:set all | 支持更多设置参数 |
注意:这些设置都是临时生效,要想永久生效需要手工建立配置文件"~/.vimrc",将需要的参数写入配置文件就能永久生效。Windows下回车符在Linux中是用"^M " 显 示 而 不 是 " "显示而不是" "显示而不是"",会导致在Windoss下写的脚本无法在Linux中执行,这时可以通过命令"dos2unix"把windows格式转化为Linux格式,也可通过"unix2dos"把Linux格式转化为windows格式,当然这两个命令需要手工安装才行。
命令 | 作用 |
---|---|
:r 文件名 | 把文件内容导入到光标位置 |
:! 命令 | 在vim中执行系统命令。只在vim中执行系统命令但并不把系统命令结果写入文件中。主要用于文件编辑中查看系统信息,如时间 |
:r !命令 | 在vim中执行系统命令,并把命令结果导入光标所在行 |
:map 快捷键 快捷键执行的命令 | 自定义快捷键。常用自定义快捷键有:map ^P I# 按"ctrl+p"时,在行首加入注解 ;:map ^B ^x 按"ctrl+b"时,删除行首第一个字母(删除注释)。注意: ^P快捷键不能手动输入,需要执行ctrl+V+P来定义,或ctrl+V,然后ctrl+P, ^B同 |
:ab 源字符 替换为字符 | 字符替换。需要频繁输入某长字符串(比如邮箱,这时候使用字符替换能增加输入效率) |
vim -o/-O 文件1 文件2 | 可以上下/左右分屏打开两个文件,ctrl+w进行两屏的切换 |
源码包 | 二进制包 |
---|---|
开源,可修改源码 | 分为DPKG包应用在Debian和unbuntu操作系统;RPM包应用在CentOS等操作系统。但是都是经过编译不可看见源码 |
软件是编译安装,所以更加适合自己系统,更加稳定效率也更高 | |
卸载方便 | |
安装过程步骤多 | 包管理系统简单,几个简单命令即可实现包的安装、升级、查询和卸载 |
编译时间长,安装比二进制时间长 | 安装速度比源码包安装块 |
编译安装,报错新手很难解决 | 依赖性 |
查询函数库所在软件包
rpm包命名规则
httpd-2.2.15-15.el6.centos.1.i686.rpm
httpd软件包名 2.2.15软件版本 15软件发布次数 el软件发行商 i686适合的硬件平台 rpm包的扩展名(注意:如果操作系统是未安装软件包则使用包全名而且要注意绝对路径;如果操作的是已经安装的软件包,则使用包名即可,系统会产生RPM包的数据库(/var/lib/rpm/),而且可以在任意路径下操作)
rpm包默认安装位置
RPM包默认安装路径 | 含义 |
---|---|
/etc/ | 配置文件安装目录 |
/usr/bin/ | 可执行的命令安装目录 |
/usr/lib | 程序所使用的函数库保存位置 |
/usr/share/doc/ | 基本的软件使用手册保存位置 |
/usr/share/man | 帮助文件保存位置 |
RPM包手工操作
RPM包在线操作(yum安装)
源码包操作
文件类型(apache包为例) | RPM包 | 源码包 |
---|---|---|
配置文件 | /etc/httpd/conf/httpd.conf | /usr/local/apache2/conf/httpd.conf |
网页位置 | /var/www/html/ | /usr/local/apache2/htdocs |
日志位置 | /var/log/httpd/ | /usr/local/apache2/logs |
启动方法 | service httpd restart /etc/rc.d/init.d/httpd restart | /usr/local/apache2/bin/apchect1 start |
文件位置 | 描述 |
---|---|
/etc/passwd 用户信息文件 | root(用户名):x(密码位):0(用户ID):0(组ID):root(用户说明):/root(用户家目录):/bin/bash(登录shell) |
/etc/shadow 影子文件 | bin(用户名): *(加密密码,密码前加"!"或者该符号使无法登录 伪用户密码都是!!或该符号,代表该用户没有密码):15980(密码更改时间):0(两次密码的修改间间隔时间):99999(密码有效期):7(密码到期警告天数):(密码过期后宽限天数):(密码失效时间):(保留) |
/etc/group 组信息文件 | root(组名):x(组密码位):0(GID):(附加组) |
/etc/gshadow 组密码文件 | |
/etc/default/useradd | useradd命令执行时参考默认文件 |
/etc/login.defs | useradd命令执行时参考默认文件 |
命令 | 作用 |
---|---|
useradd | 添加用户 |
passwd | 设定密码 --stdin通过管道符输出数据为用户密码,主要在批量添加用户时使用 直接回车表示修改当前用户密码 例如echo “123” |
chage -d 0 user1 | 通过命令把密码修改日期归零,这样用户一登录就 需要修改密码 |
usermod | 修改已经添加用户信息 不建议修改用户名 |
userdel | 在删除用户的同事修改用户的家目录 |
su | 切换成不同用户身份 -代表连带用户环境变量一起切换 -c 命令 仅执行一次命令不切换用户身份 |
groupadd | 添加组 |
groupdel | 删除组 |
gpasswd | -a将用户加入组 -d把用户从组中删除 usermod也可以达到同样的效果 |
newgrp | 改变有效组 |
组权限实验上
组权限实验下
设置ACL权限 | 用法 |
---|---|
setfacl -m u:用户名:权限 文件名 | 设置用户权限 |
setfacl -m g:组名:权限 文件名 | 设置组权限 |
setfacl -x u:用户名 文件名 | 删除用户权限 |
setfacl -b 文件名 | 删除文件所有ACL权限 |
setfacl -m u:cc:rx -R(递归,不建议文件执行权限为可执行) 目录 | 对已存在的文件生效 |
setfacl -m d:u:aa:rwx -R /test | 对以后新建的文件生效 |
setfacl -m m:rwx /test | getfacl中mask为指定最大有效权限,可以通过这种方式进行修改 mask::rwx |
命令 | 作用 |
---|---|
df | -ahT 显示文件系统状况 用于统计空间大小(包括缓存) |
du | -ah -s统计总占用量 用于统计文件大小 |
fsck | -y 文件系统修复命令 |
dumpe2fs | 查看磁盘状态 |
stat | 查看文件详细时间 |
file | 判断文件类型 |
type | 判断命令类型 |
手动分区实操
磁盘配额实操
LVM逻辑卷实操
#查看Linux支持的Shell
[root@localhost ~]# vi /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
############Shell常用命令###########
echo [选项 -e支持反斜杠控制的字符转换 -n取消输出后行末的换行符号] [输出内容]
history [选项 -c清空历史命令 -w把缓存中的历史命令写入历史命令保存文件。默认地址为~/.bash_history中] [历史命令保存文件]
vi /etc/profile HISTSIZE=1000 默认保存1000条
history命令查看缓存中的历史命令
~/.bash_history文件中当前用户登录操作命令没有写入,而是只保存在缓存中
在空白的命令符输入 !!重复执行上一条命令 !字串重复执行上一条以该字串开头的命令 !$重复上一条命令的最后一个参数
快捷键 | 作用 |
---|---|
ctrl+A | 把光标移动到命令开头 |
ctrl+E | 把光标移动到命令结尾 |
ctrl+C | 强制终止当前命令 |
ctrl+L | 清屏。相当于clear命令 |
ctrl+U | 删除或者剪切光标之前的命令 |
ctrl+K | 删除或剪切光标之后的内容 |
ctrl+Y | 粘贴ctrl+U或ctrl+K剪切的内容 |
ctrl+R | 在历史命令中搜索,按下ctrl+R后,就会出现搜索界面,输入搜索内容,就会从历史命令中搜索 |
ctrl+D | 退出当前终端 |
ctrl+Z | 暂停并放入后台 |
ctrl+S | 暂停屏幕输出 |
ctrl+Q | 恢复屏幕输出 |
符号 | 作用 |
---|---|
命令 > 文件 | 以覆盖方式将命令正确输入到指定文件 |
命令>>文件 | 以追加方式把正确命令输出到指定文件或设备中 |
错误命令 2> 文件 | 以覆盖方式将命令错误输入到指定文件 |
错误命令2>>文件 | 以追加方式把错误命令输出到指定文件或设备中 |
命令>文件 2>&1 / 命令 &>文件 | 以覆盖模式把正确命令输出和错误输出保存到同一个文件中 |
命令>>文件 2>&1 / 命令 &>>文件 | 以追加模式把正确命令输出和错误输出保存到同一个文件中 |
命令>>文件1 2>>文件2 | 把正确文件追加到文件1中,把错误文件追加到文件2中 |
多命令执行符 | 格式 | 作用 |
---|---|---|
; | 命令1;命令2 | 多个命令顺序执行 |
&& | 命令1&&命令2 | 命令1执行命令2才会执行 |
ΙΙ | 命令1ΙΙ命令2 | 命令1执行不成功命令2才会执行 |
Bash中符号 | 作用 |
---|---|
‘’ | 单引号中的特殊字符都无特殊含义 |
“” | 双引号中特殊符号没有含义,"$"、"`“和”"除外 |
·· | 反引号。不推荐使用 |
$() | 用来引用系统命令 |
() | 用于一串命令执行时,()中命令会在子Shell中运行 |
{} | 用于一串命令执行时 ,{}中命令会在当前Shell中运行 |
[] | 用于变量测试 |
# | 注释 |
$ | 用于调用变量的只 |
\ | 转义符 |
控制字符 | 作用 |
---|---|
\a | 输出警告音 |
\b | 退格键,也就是向左删除键 |
\c | 取消输出行末的换行符。和"-n"选项一致 |
\e | ESCAPE键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符,也就是Tab键 |
\v | 垂直制表符 |
\0nnn | 按照八进制ASCII码输出字符。其中0是数字零,nnn是三位八进制数 |
\xhh | 按照八进制ASCII码输出字符。其中hh是l两位十六进制数 |
#第一个Shell脚本
[root@localhost ~]# vim hello.sh
#!/bin/Bash
#The first program
#Author: chang
echo -e "Hello World!"
#运行:第一种方式-赋予权限直接运行
[root@localhost ~]# chmod 755 hello.sh
[root@localhost ~]# ./hello.sh
Hello World!
[root@localhost ~]# pwd
/root
[root@localhost ~]# /root/hello.sh
Hello World!
#运行:第二种方式-通过Bash调用执行脚本
[root@localhost ~]# bash hello.sh
Hello World!
#变量的使用
[root@localhost ~]# name=chang #给变量赋值
[root@localhost ~]# echo '$name' #单引号直接输出
$name
[root@localhost ~]# echo "$name" #双引号$拥有转义含义
chang
[root@localhost ~]# echo $name #直接输出可以转义
chang
[root@localhost ~]# echo `date` #··可以执行系统命令
2019年 09月 30日 星期一 23:51:22 CST
[root@localhost ~]# echo data
data
[root@localhost ~]# echo $(date)
2019年 09月 30日 星期一 23:54:00 CST
变量分类 | 描述 |
---|---|
用户自定义变量 | 有用户自由定义的变量名和变量的值 |
环境变量 | 相当于windows中环境变量。其变量名可以自动定义,但一把对系统起作用的环境变量名是系统预先定义好的 |
位置参数变量 | 用来向脚本中传递参数或数据 |
预定义变量 | Bash中 定义好的变量,变量名不能自定义,变量作用也是固定的 |
[root@localhost ~]# name="YF chang"
[root@localhost ~]# echo $name
YF chang
#set -u 如果设定此选项,调用未生命变量时回报错(默认无任何提示)
#set -x 如果设定此选项,在命令执行之前,会把命令先输出一次
[root@localhost ~]# unset name 删除变量
[root@localhost ~]# set 查看所有变量
[root@localhost ~]# env 查看环境变量
#PATH变量:系统查找命令路径
[root@localhost ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
#PS1变量:命令提示符设置
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
#输入冲定向
[root@localhost ~]# wc[选项:-c统计字节数 -w统计单词数 -l统计行数] [文件名]
#LANG变量定义了Linux系统的主语系环境,这个环境的默认值是:
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
#当前系统语系
[root@localhost ~]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
#通过文件/etc/sysconfig/i18n定义系统默认预习
[root@localhost ~]# cat /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"
#默认语系是下次重启之后系统所使用的语系,而当前系统预习是当前系统使用的语系
#如果系统重启,会从默认语系配置文件/etc/sysconfig/i18n中读出语系,然后赋予变量LANG让这个语系生效
#$n,n为数字,$n代表命令本身,$1-$9代表第一和第九个参数,10个以上的参数需要用大括号包含,如{10}
#!/bin/bash
num1=$1 #给num1变量赋值是第一个参数
num2=$2 #给num2变量赋值是第二个参数
sum=$(($num1+$num2))
echo $sum
[root@localhost ~]#
[root@localhost ~]# chmod 755 count.sh
[root@localhost ~]# /root/count.sh 11 22
33
#$*这个变量代表命令行中所有参数,$*把所有的参数看成一个整体
#$@这个变量代表命令行中所有参数,不过$@把每个参数区分对待
#$#代表所有参数个数
#!/bin/bash
#Author: chang
#$#代表所有参数个数
echo "A total of $# parameters"
echo "The parameters is: $*"
echo "The parameters is: $@"
[root@localhost ~]# /root/count.sh 11 22
A total of 2 parameters
The parameters is: 11 22
The parameters is: 11 22
#$*与$@区别与应用
#!/bin/bash
#Author: chang
for i in "$*"
#定义for循环,in后面有几个值,for会循环多少次,注意$*要用双引号括起来
#每次循环会把in后面的值赋予变量i
#shell把$*中所有参数看成一个整体,所以这个for循环值要循环一次
do
#打印变量$i的值
echo "The parameters is: $i"
done
#定义变量
x=1
for y in "$@"
#同样in后面有几个值,for循环几次,每次都把值赋予变量y
#可是Shell中吧"$@"中每个参数都看成是独立的,所以"$@"中有几个参数,就会循环几次
do
echo "The parameter$x is: $y"
#输出变量y的值
x=(($x+1))
#让变量每次都循环加1,为了输出时看的更加清楚
done
[root@localhost ~]# /root/count.sh 11 22
The parameters is: 11 22
The parameter1 is: 11
The parameter2 is: 22
###################################################################################
# $?最后一次执行命令的返回状态。只有这个变量的值为0才证明上一个命令正确执行
# 这个值还多少是在编写ls命令时定义好的,如果朋友文件不存在则返回2
[root@localhost ~]# ls
anaconda-ks.cfg CentOS-Base.repo count.sh install.log install.log.syslog
[root@localhost ~]# $?
-bash: 0: command not found
[root@localhost ~]# labs
-bash: labs: command not found
[root@localhost ~]# $?
-bash: 127: command not found
# $$当前进程的进程号(PID)
# $!后台运行的最后一个进程的进程(PID)
[root@localhost ~]# /root/count.sh
The current process is 2084
The last one Deamon process is 2085
####################################接收键盘输入####################################
[root@localhost ~]# read [选项 -p:提示信息 -t:指定等待秒数 -n:指定接收字符数 -s:隐藏输入内容] [变量名:可以自定义,若不指定则保存进默认变量REPLY]
#!/bin/bash
#Author: chang
read -t 30 -p "Please input your name:" name
#提示"请输入姓名"并等待30秒,把用户输入保存在name中
echo "name is $name"
read -s -t 30 -p "Please enter your age: " age
#提示“请输入年龄”并等待30秒,把用户的输入保存入变量age中
#年龄是隐私,所以我们用"-s"选项隐藏输入
echo -e "\n"
#调整输出格式,如果不输出换行,一定的年龄速出不会换行
echo "Age is $age"
read -n 1 -t 30 -p "Please select you gender[M/F]: " gender
#提示"请选择性别"并等待30秒,把用户输入保存人变量gender
#使用"-n 1"选项只接收一个输入字符就会指定(都不用输入回车)
echo -e "\n"
echo "Sex is $gender"
[root@localhost ~]# /root/count.sh
Please input your name:chang
name is chang
Please enter your age:
Age is 23
Please select you gender[M/F]: M
Sex is M
####################################Shell运算符####################################
[root@localhost ~]# declare [+/-][选项] 变量名
# -: 给变量设定类型属性
# +: 取消变量的类型属性
#-i: 将变量声明为整数型(integer)
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# declare -i cc=$aa+$bb
[root@localhost ~]# echo $cc
33
# 数组变量类型
[root@localhost ~]# name[0]="da tou"
[root@localhost ~]# name[1]="er pang"
[root@localhost ~]# name[2]="xiao fei zai"
[root@localhost ~]# echo ${name}
da tou
[root@localhost ~]# echo ${name[*]}
da tou er pang xiao fei zai
# -x: 将变量声明为环境变量
[root@localhost ~]# declare -x test=123
# -r: 只读属性,如果给变量设置了只读属性,那么这个变量既不能修改变量的值,也不能删除变量,甚至不能用"+r"选项取消只读属性
[root@localhost ~]# declare -x test=123
[root@localhost ~]# declare -r test
[root@localhost ~]# test=456
-bash: test: readonly variable
[root@localhost ~]# declare +r test
-bash: declare: test: readonly variable
[root@localhost ~]# unset test
-bash: unset: test: cannot unset: readonly variable
#不过还好这个变量知识命令声明,所以只要重新登录或者重启,这个变量就会消失
# -p可以查询变量属性
[root@localhost ~]# declare -i var=15
[root@localhost ~]# declare -p var
declare -i var="15"
# 使用expr或let数值运算工具,但是$((运算符))或者$[运算符]方式运算
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# dd=$(expr $aa + $bb)
# dd的值是aa和bb的和。注意"+"号左右必须有空格
[root@localhost ~]# echo $dd
33
[root@localhost ~]# bb=22
[root@localhost ~]# aa=11
[root@localhost ~]# let ee=$aa+$bb
[root@localhost ~]# echo $ee
33
[root@localhost ~]# n=20
[root@localhost ~]# let n+=1
[root@localhost ~]# echo $n
21
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(( $aa+$bb ))
[root@localhost ~]# echo $ff
33
[root@localhost ~]# gg=$[ $aa+$bb ]
[root@localhost ~]# echo $gg
33
####################################Shell运算符优先级####################################
四则运算练习题
####################################变量测试与内容置换####################################
# x=${y-新值}
[root@localhost ~]# unset y
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x
new
[root@localhost ~]# echo $y
[root@localhost ~]# y=""
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x
[root@localhost ~]# echo $y
[root@localhost ~]# y=old
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x
old
[root@localhost ~]# echo $y
old
[root@localhost ~]#
# x=${y=新值}
[root@localhost ~]# unset y
[root@localhost ~]# x=${y:=new}
[root@localhost ~]# echo $x
new
[root@localhost ~]# echo $y
new
[root@localhost ~]# y=""
[root@localhost ~]# x=${y:=new}
[root@localhost ~]# echo $x
new
[root@localhost ~]# echo $y
new
[root@localhost ~]# y=old
[root@localhost ~]# x=${y:=new}
[root@localhost ~]# echo $x
old
[root@localhost ~]# echo $y
old
# x=${y?新值}
[root@localhost ~]# unset y
[root@localhost ~]# x=${y?new}
-bash: y: new
[root@localhost ~]# y=old
[root@localhost ~]# x=${y?new}
[root@localhost ~]# echo $x
old
[root@localhost ~]# echo $y
old
自定义环境变量存放位置:如果是对所有用户生效则放入/etc/profile环境变量配置文件;如果修改只对自己有用则放入~/.bash_profile或 ~/.bashrc这两个配置文件中任意一个
还有一些其他的变量配置文件,最常见的就是~/bash_history文件,也就是历史命令保存文件。还有shell登录信息(/etc/issue,登陆tty1-tty6这六个本地终端时欢迎界面;/etc/issue.net是在本地终端登录时显示欢迎信息的,如果是远程登录如SSH登录或telnet远程登录需要显示的欢迎信息,注意使用这个文件要注意首先/etc/issue.net文件中不能使用/etc/issue文件中支持的转义符,其次ssh远程登录是否显示/etc/issue.net文件中的欢迎信息由SSH配置文件决定的即在/etc/ssh/sshd_config Banner /etc/issue.net)。/etc/nod文件亦可显示欢迎信息,不过是在正确登录之后。
[root@localhost ~]# stty -a #查询所有快捷键
[root@localhost ~]# stty 关键字 快捷键 #可自定义快捷键
正则表达式用来在文件中匹配符合条件的字符串,常用在grep、awk、sed文件等命令中
通配符用来匹配符合条件的文件名,常用在ls、find、cp等文件操作命令中
元字符 | 作用 |
---|---|
* | 前一个字符匹配0次或任意多次 |
. | 匹配除了换行符外任意一个字符 |
^ | 匹配行首 |
$ | 匹配行尾 |
[] | 匹配中括号中地址的任意一个字符,只匹配一个字符 |
[^] | 匹配出中括号中以外的任意一个字符 |
\ | 转义符 |
{n} | 表示其前面的字符出现不小于n次 |
{n,} | 表示其前面的字符出现不少于n次 |
{n,m} | 表示其前面的字符至少出现n次,至多出现m次 |
扩展元字符 | 作用 |
---|---|
+ | 前一个字符匹配1次或者任意多次 |
? | 前一个字符匹配0次或1次 |
l | 匹配两个或者多个分支选择 |
() | 匹配整体为一个字符 |
cut命令 字符截取和替换
#cut命令默认分隔符是制表符,也就是"tab"建,但是不能对空格符进行分割
[root@localhost ~]# vim student.txt
ID Name gender Mark
1 ZS M 89
2 LS M 91
3 ZL M 98
#cut -f 列号 文件名 提取第几列
#提取第二列
[root@localhost ~]# cut -f 2 student.txt
Name
ZS
LS
ZL
#提取第二,三行
[root@localhost ~]# cut -f 2,3 student.txt
Name gender
ZS M
LS M
ZL M
#cut -d 分隔符 文件名 按照指定分隔符分割列
#以":"作为分隔符,提取/etc/passwd文件的第一列和第三列
[root@localhost ~]# cut -d ":" -f 1,3 /etc/passwd
awk编程
[root@localhost ~]#printf '输出类型输出格式' 输出内容
#输出类型: %ns-输出字符串,n是数字带边输出几个字符
# %ni-输出整数,n是数字代表输出几个数字
# %m,nf-输出浮点数,m和n是数字,指整数和小数位
#输出格式: \a-输出警告声音
# \b-输出退格键,也就是Backsapce键
# \f-清除屏幕
# \n-换行
# \r-回车
# \t-水平输出退格键,也就是Tab键
# \v-垂直输出退格键,也就是Tab键
[root@localhost ~]# printf '%s' $(cat student.txt)
IDNamegenderMark1ZSM892LSM913ZLM98[root@localhost ~]#
#这就是printf命令,如果不指定输出格式则会把所有输出内容连在一起
#cat等文件输出命令之所以能够按照格式输出是应为cat命令已经设定了输出格式
#为了使用printf输出合理的格式,应该这样
[root@localhost ~]# printf '%s' $(cat student.txt)
IDNamegenderMark1ZSM892LSM913ZLM98[root@localhost ~]#
[root@localhost ~]# printf '%s\t %s\t %s\t %s\t\n' $(cat student.txt)
ID Name gender Mark
1 ZS M 89
2 LS M 91
3 ZL M 98
#awk基本使用规则
[root@localhost ~]# awk '条件1{动作1}条件2{动作2}...' 文件名
#条件 x>10 判断变量x是否大于10
# x==y 判断x是否等于变量y
# A~B 判断字符串A中是否包含能匹配B表达式的子字符串
# A!~B 判断字符串A中是否不包含能匹配B表达式的子字符串
#动作 格式化输出/流程控制语句
#例如输出第二列和第六列
[root@localhost ~]# awk '{printf $1 "\t" $2 "\n"}' student.txt
ID Name
1 ZS
2 LS
3 ZL
条件类型 | 条件 | 说明 |
---|---|---|
awk保留字 | BEGIN | awk程序一开始时,尚未读取任何数据之前执行。BEGIN后的动作只在程序开始时执行一次 |
awk保留字 | END | awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次 |
关系运算符 | > | 大于 |
关系运算符 | < | 小于 |
关系运算符 | >= | 大于等于 |
关系运算符 | <= | 小于等于 |
关系运算符 | == | 等于 |
关系运算符 | != | 不等于 |
关系运算符 | A~B | 判断A中是否包含能匹配B表达式的子字符串 |
关系运算符 | A!~B | 判断字符串A中是否不包含能匹配B表达式的子字符串 |
关系运算符 | /正则/ | 如果在"//"中可以写入字符,也可以支持正则表达式 |
# 查看ZL用户的成绩
# 在awk中,使用"//"包含的字符串,awk命令才会找到。也就是说字符串必须用"//"包含
[root@localhost ~]# awk '$2 ~ /ZL/ {printf $4 "\n"}' student.txt
98
链接提取码dl22
错误描述 | 现象 | 解决方法 |
---|---|---|
#!/bin/Bash | -bash: ./hello.sh: /bin/Bash: bad interpreter: 没有那个文件或目录 | #!/bin/bash |