什么是命令以及命令的格式
指在Linux终端(命令行)中输入的内容就称之为命令。
命令格式:
一个完整的命令的标准格式:Linux通用的格式
#指令主体(空格) [选项](空格) [操作对象]
一个指令可以包含多个选项
操作对象也可以是多个
张三 去操场 去跑道 跑圈
1. ls(list)显示文件目录
语法: ls 选项 【-ald】
-a 显示所有文件,包括隐藏文件 (all)
-l 详情信息显示
-d 查看目录属性 (一般和 l 连用,可以查看详细信息)
-h 以可读性较高的形式显示 (一般和 l 连用 ls -lh )
ls -ld 目标目录 查看目标目录的 目录信息
ls -ld /tmp/test2
2. cd (change directory)切换目录
cd / 切换到根目录
cd .. 回到上一级目录
路径可以是相对路径也可以是绝对路径 ~代表的是当前用户的家目录
3. pwd (print working directory) 显示当前所在的工作目录
pwd
4. touch (touch) 创建空文件
touch newfile
newfile可以是一个文件名也可以是一个包含文件路径的文件名
使用touch来同时创建多个文件 touch 文件1 文件2
注意:不能创建多层文件
5. mkdir(make directory) 创建新目录
mkdir newdir
创建 多层文件夹 的时候使用的是 mkdir -p 文件夹/文件夹1
当一次性创建多层不存在的目录的时候,添加-p参数,否则会报错
一次性创建多个目录 mkdir 目录1 目录2 目录3 ….
注意:文件的颜色的含义
6. cp (copy) 复制文件或目录
语法:cp -R [ 源文件或目录 ] [ 目的目录 ]
-R 复制目录
cp [ 被复制的文件路径] [ 文档被复制到的路径 ]
当使用cp命令进行 文件夹 复制操作的时候需要添加选项“ -r ”【-r表示递归复制】,
否则目录将被忽略
复制的时候文件可以重新命名 但是如果非必须 不建议
7. mv(move) 移动文件 更名
语法:mv [ 源文件或目录] [ 目的目录 ]
实例:mv filel file (将当前目录下的 filel 名字更改为 file )
实例: mv file2 dir2 (将文件 file2 移动到 目录 dir2 下 )
mv 重新命名 mv 【原文件名】【新文件名】
实例: mv tem tem111 (将文件名 tem 更改为 tem111 )
8. rm (remove) 删除文件
f force 强制
语法: rm -rf [ 文件或目录 ] (强制删除,不会询问)
语法: rm -r [文件或目录] (会询问,输入 y (yes))
删除文件 file3 ( 范例: rm file3)
rm -r dir1 (删除目录 dir1 )
9. cat(concatenate and display files) 显示文件内容
cat可以对文件进行合并
语法2:cat 待合并的文件路径1 待合并的文件路径2 …. 文件路径n > 合并之后的文件路径 ( cat text3.txt text8.txt > text4.txt )
语法: cat [文件的名字]
范例: cat tem/text3.txt
cat 目录的名字
10. 输出重定向
>:覆盖输出,会覆盖掉原先的文件内容
>>:追加输出,不会覆盖原始文件内容,会在原始内容末尾继续添加
语法:正常执行的指令 > / >> 文件的路径
注意:文件可以不存在,不存在则新建
11. head 查看文件的前几行
语法: head -num [文件名] ( -num 显示文件的前num行)
head -5 text.txt
12. tail 查看文件的后几行
语法: tail -num [文件名] (-num 显示文件的后num行)
范例: tail -5 text5.txt
-f 动态显示文件内容
范例: tail -f text5.txt
新打开一个页面,在里边追加内容,则会在书写(tail -f text5.txt)的页面里边直接显示追加的内容
13. wc (word count) 统计文本的行数、字数、字符数
语法: wc -mwl [文件名]
-m 统计文本字符数
-w 统计空格字数
-l 统计文本行数
14. ln (link) 产生链接文件
语法: ln -s [源文件] [目标文件]
-s 创建软链接 (快捷方式)
范例: ln -s text2.txt 快捷方式
创建文件 text2.txt 的软连接 快捷方式
15. find 查找文件或目录
语法: find [搜索路径] [选择项] [搜寻关键字]
范例: find /tem1 -name text8.txt
在目录 /tem1 中查找文件 text8.txt
16. Grep 查找字符
类似于ctrl+F
grep [指定字串] [源文件]
范例: grep ftp text8.txt
grep -i aaa 不区分大小写aaa
grep -v aaa 排除关键字aaa
grep -w aaa 完全匹配aaa关键字
17. ps -ef 指令 主要是查看服务器的进程信息
选项含义:
-e:等价于“-A”,表示列出全部的进程
-f:显示全部的列(显示全字段)
ps -ef | grep -v grep|grep redis
| 管道通信符
ps -ef 查看所有的进程
| grep redis
18. gzip (GUN zip ) 压缩命令 压缩文件
语法:gzip 选项 [文件]
压缩后文件格式: .gz
19. gunzip (GUN unzip) 解压命令 解压缩 .gz 的压缩文件
语法: gunzip 选项 [压缩文件]
范例: gunzip file1.gz
20. 压缩解压命令 tar 打包目录
解压缩语法 tar -zxvf [指定的压缩文件] -C [目的目录]
-x 解压.tar文件
-v 显示详细信息
-f 指定解压文件
-z 解压缩
压缩后文件格式: .tar.gz
指定文件夹 -C
tar -zxvf 压文件的名字 -C 指定的目录
压缩语法:tar [-zcvf] [压缩文件的名字] [目录]
tar -zcvf jdk.tar.gz ./
( 压缩后的 文件 叫的名字 jdk.tar.gz ./ 压缩的目录)
-c 产生.tar打包文件
-v 显示详细信息
-z 打包同时压缩
-f 指定压缩后的文件名
vim 编辑器
1、安装:
yum -y install vim
2、使用方法:
vim filename
进入编辑模式 i
从编辑模式退出 按esc 再输入:wq 单击回车键
3、三种状态
命令模式 (command mode)
在该模式下是不能对文件直接编辑,可以输入快捷键进行一些操作(控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last )
插入模式 (Insert mode)
也称为编辑文本模式 只有在Insert mode下,才可以做文字输入,按 「ESC」键可回到命令行模式。
底行模 式 (last line mode)
将文件保存或退出vi,也可以设置编辑环境,如搜索、替换、保存、退出、撤销、高亮等等
插入命令
i 在光标前插入
I 在光标当前行开始插入
a 在光标后插入
A 在光标当前行末尾插入
o 在光标当前行的下一行插入新行
O 在光标当前行的上一行插入新行
定位命令
:set nu 显示行号
:set nonu 取消行号
gg 到文本的第一行
G 到文本的最后一行
:n 到文本的第n行
$ 当前行的最后一个字符
替换和取消命令
u 取消上一步操作 Ctrl+r 返回到undo之前
r 替换光标所在处字符
R 从光标所在处开始替换,按esc结束
删除命令
x 删除光标所在字符
nx 删除光标所在处后n个字符
dd 删除光标所在行,ndd删除n行
dG 删除光标所在行到末尾行的所有内容
D 删除光标所在处到行尾的内容
:5,7d 删除指定范围的行,从第5行到第7行
常用快捷键
Shift+ zz 保存退出,与“:wq”作用相同
v 进入字符可视模式
V 或 Shift + v 进入行可视模式
Ctrl + v 进入块可视模式
快捷键
Linux中vi编辑器的使用详解,下面的引号和括号不算啊
光标的移动除了键盘上的上下左右键.也可以是小写模式下,按键盘上的"h,j,k,l",
"ctrl+b":屏幕往后移动一页
"ctrl+f":屏幕往前移动一页
"ctrl+u":屏幕往后移动半页
"ctrl+d":屏幕往前移动半页
输入任何一个整数,然后输入"shift+G" 就可以到这一页的开头了.
按键盘上的大写"G"移动到文章的最后.
按"$"符号将光标移动到行尾
"^"将光标移到行头
"w":将光标移到下一行头
b":跟"w"相反.移到上一行行头
"e":将光标移到下一行尾.
如果想让文本显示行号.就在【命令行】 模式下,在文本最后输入":set nu"命令.就可以了
复制
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「yy」:复制光标所在行到缓冲区。当前行
「#yy」:例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字。
将缓冲区内的字符贴到光标所在位置。
注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴 功能。
p 粘贴
Esc 回到命令模式
查找
用"/"加上要查找的内容.例如"/hello"或者是"?hello"也是可以的.
替换
「r」:替换光标所在处的字符。 ,按一下"r"然后输入要即可.
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
恢复上一次操作
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。
按多次"u"可以执行多次恢复.就相当于"CTRL +Z"的操作.
替换
在命令模式下使用“s/原字符/新字符/g” 代表当前行所有
如果想全局替换,s变为%s
文件内全部替换:
:%s#abc#123#g (如文件内有#,可用/替换,:%s/abc/123/g)
--注:把abc替换成123
(或者: %s/str1/str2/g 用str2替换文件中所有的str1)
文件内局部替换:
:20,30s#abc#123(如文件内有#,可用/替换,:%s/abc/123/g)
--注:把20行到30行内abc替换成123
4、时间 date
格式化当前的时间: date "+%Y-%m-%d %H:%M:%S" 或 date "+%F %T"
(2021-02-21 21:57:00)
获取之前或者之后的某个时间(备份): date -d "-1 day" "+%Y-%m-%d %H:%M:%S"
符号的可选值:+(之后) 或者 - (之前)
单位的可选值:day(天)、month(月份)、year(年)
%F:表示完整的年月日
%T:表示完整的时分秒
%Y:表示四位年份
%m:表示两位月份(带前导0)
%d:表示日期(带前导0)
%H:表示小时(带前导0)
%M:表示分钟(带前导0)
%S:表示秒数(带前导0)
时间不一致的问题:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
用户权限管理和时间
1.添加用户
useradd [选项] 用户名
常用选项:
-g:表示指定用户的用户主组,选项的值可以是用户组的id,也可以是组名
-G:表示指定用户的用户附加组,选项的值可以是用户组的id,也可以是组名
-u:uid,用户的id(用户的标识符),系统默认会从500之后按顺序分配uid,如果不想使用系统分配的,可以通过该选项自定义
-c comment:添加注释
案例:创建用户 yyl 不带任何选项
验证是否成功:
a. 验证/etc/passwd的最后一行,查看是否有yyl的信息;
b. 验证是否存在家目录(在Centos下创建好用户之后随之产生一个同名家目录);
注意:在不添加选项的时候,执行useradd之后会执行一系列的操作
a. 创建同名的家目录;
b. 创建同名的用户组;
注意:查看用户的主组可以查看passwd文件,查看附加组可以查看group文件。
2.修改用户
usermod [选项] 用户名
Usermod:user modify,用户修改
常用选项:
-g:表示指定用户的用户主组,选项的值可以是用户组的id,也可以是组名
-G:表示指定用户的用户附加组,选项的值可以是用户组的id,也可以是组名
-u:uid,用户的id(用户的标识符),系统默认会从500之后按顺序分配uid,如果不想使用系统分配的,可以通过该选项自定义号
-l:修改用户名
注意:已经登录的用户不能修改
groups 用户名 --- 用户所在的组
3.修改用户密码
Linux不允许没有密码的用户登录到系统,因此前面创建的用户目前都处于锁定状态,需要设置密码之后才能登录计算机。
passwd 用户名
案例:设置yuyongli用户的密码
设置密码之后在shadow文件中能够看出用户是否有密码。
在设置用户密码之后可以登录帐号,例如此处需要登录yuyongli
4.切换用户
切换用户命令:su [用户名] (switch user)
从root往普通用户切换不需要密码,但是反之则需要root密码;
5.删除用户
常用语法:userdel [选项] 用户名
常用选项:
-r:表示删除用户的同时,删除其家目录;
案例:删除yuyongli用户
注意:已经登录的yuyongli用户删除的时候提示删除失败,但是没有登录的lisi用户可以正常删除
如果想要删除yuyongli这个用户可以强制删除
a. ps -ef|grep yuyongli
b. kill -9 xxx
提示:所有跟用户操作的命令(除passwd外)只有root超级管理员有权限执行。
6.查看用户有谁
ls /home
7.锁定用户
usermod -L 用户名
usermod -L yyl
8.解锁用户
usermod -U 用户名
用户组管理
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。
文件结构:
用户组名:密码:用户组ID:组内用户名
密码:X表示占位符,虽然用户组可以设置密码,但是绝大部分的情况下不设置密码;
组内用户名:表示附加组是该组的用户名称
1.添加用户组
常用语法:#groupadd [选项] 用户组名
常用选项:
-g:类似用户添加里的“-u”,-g表示选择自己设置一个自定义的用户组ID数字,如果自己不指定,则默认从1000之后递增;
案例:使用groupadd指令创建一个新的用户组,命名为xxx
groupadd xxx
2.更改组名称
groupmod [选项] 新组名 老组名
常用选项:
-g:类似用户修改里的“-u”,-g表示选择自己设置一个自定义的用户组ID数字
-n:类似于用户修改“-l”,表示设置新的用户组的名称
案例:修改Administrators用户组,将组ID从502改成520,将名称改为admins
groupmod -g 520 -n admins Administrators
3.删除组
groupdel 组名
注意:当如果需要删除一个组,但是这个组是某个用户的主组时,则不允许删除;如果确实需要删除,则先从组内移出所有用户。
4.修改用户的组
usermod -g 用户组 用户名
注:-g|–gid,修改用户的gid,该组一定存在
多组:
usermod -G 组名,组名 用户名
usermod -G test,root yyl
5.给文件授权到组
-- change group premission
chgrp 组名 文件名
chgrp g1 /home/test
6.设置文件权限
chmod 770 /home/test
750
用数字来表示权限(r=4,w=2,x=1,-=0)
磁盘和文件管理和使用检测和维护
一.磁盘目录:
/bin (binaries) :该目录中存储的都是一些二进制文件,文件都是可以被运行的。
/dev (devices):该目录中主要存放的是外接设备,例如盘、其他的光盘等。在其中的外接设备是不能直接被使用的,需要挂载(类似windows下的分配盘符)。
/etc (etcetera):该目录主要存储一些配置文件。
/home :表示“家”,表示除了root用户以外其他用户的家目录,类似于windows下的User/用户目录。
/proc:process,表示进程,该目录中存储的是Linux运行时候的进程。
/root:该目录是root用户自己的家目录。
/sbin:全称super binary,该目录也是存储一些可以被执行的二进制文件,但是必须得有super权限的用户才能执行。
/tmp:表示“临时”的,当系统运行时候产生的临时文件会在这个目录存着。
/usr:存放的是用户自己安装的软件。类似于windows下的program files。
/var:存放的程序/系统的日志文件的目录。
/mnt:当外接设备需要挂载的时候,就需要挂载到mnt目录下。
/ 根目录root 超级用户目录
/lost+found 存放一些系统出错的检查结果
注:特殊权限:粘着位t
粘着位定义:当权限为777的目录被授予粘着位,用户只能在此目录下删除自己是所有者的文件
二.安装软件
1.rpm命令
rpm的作用类似于管家,主要作用是对linux服务器上的软件包进行对应管理操作,管理分为:查询、卸载、安装。
2.命令语句
①查询某个软件的安装情况
rpm -qa|grep 关键词
选项:
-q:查询,query
-a:全部,all
②卸载某个软件
rpm -e 软件的名称
当存在依赖关系的时候又不想去解决这个问题的时候可以:
rpm -e 软件包名 --nodeps
③安装软件:
rpm -ivh 软件包完整名称
选项:
-i:install,安装
-v:显示进度条
-h:表示以“#”形式显示进度条
-U:update升级
3.安装jdk
1.检查jdk是否存: java -version
2、存在则卸载原本jdk:
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64
格式: rpm -e --nodeps (jdk的名字)
3、下载 jdk 的 安装包 并上传到指定的文件夹( /usr/jdk )里面
a.创建文件夹,使用 Xftp /usr/jdk
b.将tar文件上传到指定的目录下 ( /usr/jdk )
c.解压文件:tar -zxvf jdk-8u191-linux-x64.tar.gz (-c 指定的目录)
d.修改/etc/profile配置环境变量:
export JAVA_HOME=/usr/jdk/jdk1.8.0_144 (自己的路径)
export JRE_HOME=/usr/jdk/jdk1.8.0_144/jre (自己的路径)
$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
e.使配置文件生效
source /etc/profile
f:测试是否安装成功
java -version
4.进行验证
关闭会话,打开网页,依旧可以访问
打印 nohup 日志信息:tail -f nohup.out
rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
5.安装Tomcat
下载并上传压缩包 选择 8.5.82版本
解压 并 配置
配置命令:
vim /etc/profile
CATALINA_HOME=/usr/tomcat/tomcat8.5
输入下面命令让设置的环境变量生效
生效命令:source /etc/profile
第一种启动方法:进入到/usr/tomcat/tomcat8.5/bin目录下,输入以下命令
./startup.sh
第二种方法,无论在哪个目录都可以启动tomcat
sh /usr/tomcat/tomcat8.5/bin/startup.sh
查看是否启动成功
查看命令: ps -ef | grep tomcat
未启动成功
关闭tomcat
1)第一种启动方法:进入到/usr/tomcat/tomcat8.5/bin目录下,输入以下命令
./shutdown.sh
验证tomcat是否安装成功
Linux启动tomcat后,我们在浏览器中输入:http:\\IP地址:8080 如果出现tomcat的主页则代表安装成功
如果访问tomcat主页失败,有可能是防火墙没有关闭
关闭防火墙命令:
service iptables stop
chkconfig iptables off
6.安装 mysql57
1、安装之前导入信息
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y --enablerepo=mysql57-community install mysql-community-server
Shell 脚本
什么是 shell
Shell脚本语言:
是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。它是一种编程语言,像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/…
理清Shell语言与Shell之间的关系:
当命令不在 命令行 中执行,而是从一个 文件中 执行时,该文件就是shell脚本。
Shell是一种解释型编程语言,不需要编译,按行执行。
Shell脚本是由解释器解释执行的,常见的解释器有:bash dash ash ksh sh等
特点:
shell脚本是普通的文本文件,由流程控制逻辑和命令构成。
shell脚本通常以.sh作为后缀名,但不是必须的。
我们现阶段学习的主要是bash dash.
Shell脚本:
命令、变量和流程控制语句等有机的结合起来
shell脚本擅长处理纯文本类型的数据,而linux中,几乎所有的配置文件,日志,都是纯文本类型文件
脚本语言的种类
编译型语言:
使用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制器码(具有操作数、指令、以及相应的格式),这个过程叫做编译 (./configure make makeinstall) ;编译好的可执行性文件(.exe),可在相对应的平台上运行(移植性差,但运行效率高)。 C语言、C++
解释型语言:
使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言;相当于把编译型语言的编译链接过程混到一起同时完成的。
解释型语言执行效率较低,且不能脱离解释器运行,但它的跨平台型比较容易,只需提供特定解释器即可。 Python(同时是脚本语言)与Ruby
Java语言是一门很特殊的语言,Java程序需要进行编译步骤,但并不会生成特定平台的二进制机器码,它编译后生成的是一种与平台无关的字节码文件(*.class)(移植性好的原因),这种字节码自然不能被平台直接执行,运行时需要由解释器解释成相应平台的二进制机器码文件;大多数人认为Java是一种编译型语言,但我们说Java即是编译型语言,也是解释型语言也并没有错。
脚本语言:
为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。
程序代码即是最终的执行文件,只是这个过程需要解释器的参与,所以说脚本语言与解释型语言有很大的联系。脚本语言通常是被解释执行的,而且程序是文本文件。
典型的脚本语言有,JavaScript,Python,shell等。
Shell常见种类
Bsh、Csh、Ksh、Bash、Zsh
bash版本以及sh和bash的关系以及脚本书写规范
展示 shells 代码: cat /etc/shells
查看 bash 版本: /bin/bash --version
sh与bash的关系:sh是一种POSIX标准,它有很多种实现,包括ksh88, dash,bash等
因为sh是一种规范,并不是实现,所以/bin/sh实际上是一个硬链接,链接到某种实现上。大多数情况下,/bin/sh 会链接到 /bin/bash。所以执行sh xx.sh 等价于执行 bash xx.sh
开头的"#!"字符又称为幻数,在执行bash脚本的时候,内核会根据"#!"后的解释器来确定该用那个程序解释这个脚本中的内容。
init.d目录包含许多系统各种服务的启动和停止脚本。init.d目录都是用来放服务脚本的,当Linux启动时,会寻找这些目录中的服务脚本,并根据脚本的run level确定不同的启动级别。
开发规范
1) 放在统一的目录
2) 脚本以.sh为扩展名 (不是必需的)
3) 开头指定脚本解释器。(#! /bin/sh)
4) 开头加版本版权等信息,可配置~/.vimrc文件自动添加。
5) 脚本不要用中文注释,尽量用英文注释。
6) 代码书写优秀习惯
a、成对的内容一次性写出来,防止遗漏,如[ ]、' '、" "等
b、[ ] 两端要有空格,先输入[ ],退格,输入2个空格,再退格写。
c、流程控制语句一次书写完,再添加内容。(if 条件 ; then 内容;fi)
语法结构为
if condtion
then
do something
elif condtion
then
do something
else
do something
fi
d、通过缩进让代码易读。
f、脚本中的引号都是英文状态下的引号,其他字符也是英文状态。
6 shell脚本的编写/执行/调试
shell脚本的编写/执行/调试
创建第一个shell脚本文件
创建脚本文件test.sh
[root@localhost tmp]# mkdir demo1
[root@localhost tmp]# cd demo1
[root@localhost demo1]# ls
[root@localhost demo1]# touch test.sh
[root@localhost demo1]#
运行脚本 sh test.sh 或者 ./test.sh
刚开始执行不成功,是因为权限不够 如果赋权限 使用chmod命令
赋权之后,变为绿色
文件权限解读
开头的-rwxrw-r--这一字符串标识文件权限。
这个字符串有10位,可以分为4段来解读。注:r--可读,w--可写,x--可执行。
第一段(第1位)表示是目录还是文件,-表示是文件,d表示是目录;
第二段(第2-4位,共3个字符串)表示文件所属用户对它的权限;
第三段(第5-7位,共3个字符串)表示文件所属用户组用户对它的权限;
第四段(第8-10位,共3个字符串)表示其他用户对它的权限;
读取权限 r = 4
写入权限 w = 2
执行权限 x = 1
775 这三个数字代表拥有者,组用户,其他用户的权限。
shell 的变量
环境变量:也可称为全局变量,分为自定义环境变量和Bash**内置的环境变量**
普通变量:也可称为局部变量,只能在创建他们的Shell函数或Shell脚本中使用。
特殊变量:脚本内置的具有特殊用途的变量
env 显示用户的环境变量
export 显示当前导出成用户变量的shell变量,并显示变量的属性(是否只读),
按变量名称排序
输出一个系统中的 环境变量 echo $HOME
普通变量
本地变量在用户当前的Shell生存期的脚本中使用。例如,本地变量a取值为1,这个值在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出,本地变量值将无效。
注意 : $用来获取变量的值 , = 前后两端不能有空格
#! /bin/sh
#输出数字,字符串
echo "不带引号的数字:"
echo 1
echo "带单引号的数字:"
echo '1'
echo '双引号数字:'
echo "1"
echo "带单引号字符串:"
echo 'hello'
echo "双引号字符串:"
echo "hello"
#定义变量
str="123"
#输出变量
echo $str
echo "单引号变量:"
echo '$str'
echo '双引号变量:'
echo "$str"
#定义转义字符
echo '转义字符\'\'
echo "转义字符\"\""
注意:
单引号字符串的限制:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号里可以有变量,可以出现转义字符。
双引号和不加引号 能正常的取值
取特殊变量的值 date
A=`date`
特殊变量
位置变量 | 作用说明 |
$0 | 获取当前执行的shell脚本的文件名,如果执行脚本带路径那么就包括脚本路径。 |
$n | 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9用大括号括起来{10},参数以空格隔开。 |
$# | 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9用大括号括起来{10},参数以空格隔开。 |
$* | 获取当前shell的所有传参的参数,不加引号同如果给加上双引号,例如: “$”,则表示将所有的参数视为单个字符串,相当于“112$3”。 12 34 56 |
$@ | 获取当前shell的所有传参的参数,不加引号同如果给@加上双引号,例如: “则表示将所有参数视为不同的独立字符串,相当于1” “3” “……”,这是将参数传递给其他程序的最佳方式,因为他会保留所有内嵌在每个参数里的任何空白。 12 34 56 |
当“$*”和“$@”都加双引号时,两者有区别,都不加双引号时,两者无区别。 |
#! /bin/sh
#未知参数
#输出纹喊名字
echo $0
#输出第一个参数
echo $1
#输出第二个参数
echo $2
#输出第三个参数
echo $3
#输出参数个数
echo $#
#获取所有传参的参数
echo $*
#获取当前shell的所有传参的参数,不加引号同如果给@加上双引号
echo $@
~
$* 12 34 56
“$*”=”12 34 56”
条件表达式
&&,||
如果第一个命令执行成功(返回1),与操作符&&才会执行第二个命令
如果第一个命令执行不成功就直接返回0
如果第一个命令执行失败,或操作符||才会执行第二个命令
如果第一个命令执行成功就直接返回1
判断文件是否存在 存在为0 不存在为1
使用read 进行交互式的取值
#! /bin/bash
read -p "强输入用户名:" name
read -p "强输入密码:" pwd
[ "$name" == "admin" ] && [ "$pwd" == "123" ] && echo "登录成功" || echo "登录失败"
if条件语句
单分支语句
if 条件表达式
then
Do something
fi
双分支语句
if 条件表达式
then
。。。。。。
else
fi
多分支语句
if 条件
then
elif
then
else
fi
caea条件语句
for循环
列表for循环
#!/bin/bash
for i in 取值列表
do
循环主体
命令done