Shell入门(二)——简介与变量

1、shell统配符

1、命令和文件自动补全
Tab只能补全命令和文件

2、常见的快捷键

ctrl+c 终止前台运行的程序
ctrl+z 将前台运行的程序挂起到后台
ctrl+d 退出 等价exit
ctrl+l 清屏
ctrl+a |home 光标移到命令行的最前端
ctrl+e |end 光标移到命令行的后端
ctrl+u 删除光标前所有字符
ctrl+k 删除光标后所有字符
ctrl+r 搜索历史命令

编辑文本:

shift+$ 光标移动至行尾
shift+^ 光标移动到行首

3 、常用的通配符(重点)

*: 匹配0或多个任意字符
?:匹配任意单个字符
[list]:匹配[list]中的任意单个字符,或者一组单个字符 [a-z]
[!list]:匹配除list中的任意单个字符
{string1,string2,…}:匹配string1,string2或更多字符串

示例:

[root@localhost shellDemo]# ls -l fil*
-rw-r--r--. 1 root root  58 116 18:54 file1
-rw-r--r--. 1 root root  32 115 14:19 file2
-rw-r--r--. 1 root root 171 116 17:39 file3
[root@localhost shellDemo]# ls -l file?
-rw-r--r--. 1 root root  58 116 18:54 file1
-rw-r--r--. 1 root root  32 115 14:19 file2
-rw-r--r--. 1 root root 171 116 17:39 file3
[root@localhost shellDemo]# ls -l file[12]
-rw-r--r--. 1 root root 58 116 18:54 file1
-rw-r--r--. 1 root root 32 115 14:19 file2

4、bash中的引号

  • 双引号"" :会把引号的内容当成整体来看待,允许通过$符号引用其他变量值
  • 单引号'' :会把引号的内容当成整体来看待,禁止引用其他变量值,shell中特殊符号都被视为普通字符
  • 反撇号`` :反撇号和$()一样,引号或括号里的命令会优先执行,如果存在嵌套,反撇号不能用

示例

[root@localhost ~]#  echo   "$(date +%F)"
2020-11-07
[root@localhost ~]#  echo   '$(date +%F)'
$(date +%F)
[root@localhost ~]# echo "`date`"
20201107日 星期六 15:55:32 CST

2、编程语言的分类

计算机只能认识(识别)机器语言(0和1),如(11000000 这种)。但是,我们的程序猿们不能直接去写01这样的代码,所以,要想将程序猿所开发的代码在计算机上运行,就必须找"人"(工具)来翻译成机器语言,这个"人"(工具)就是我们常常所说的**编译器或者解释器**。

  • 编译型语言:
    程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++

  • 解释型语言:
    ​ 程序不需要编译,程序在运行时由**解释器**翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Python/JavaScript/ Perl /ruby/Shell等都是解释型语言。

在这里插入图片描述

  • 总结

编译型语言比解释型语言速度较快,但是不如解释型语言跨平台性好。如果做底层开发或者大型应用程序或者操作系开发一般都用编译型语言;如果是一些服务器脚本及一些辅助的接口,对速度要求不高、对各个平台的兼容性有要求的话则一般都用解释型语言

3、shell介绍

shell介于内核与用户之间,负责命令的解释
在这里插入图片描述
总结:

  • shell就是人机交互的一个桥梁
  • shell的种类
[root@MissHou ~]# cat /etc/shells 
/bin/sh				#是bash的一个快捷方式
/bin/bash			#bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能
/sbin/nologin		#表示非交互,不能登录操作系统
/bin/dash			#小巧,高效,功能相比少一些

思考:终端敲打的命令和shell有什么关系?
打开一个终端,默认会打开一个shell,在终端敲打的任何指令,是由默认打开的shell帮忙去解析的
在这里插入图片描述
当前终端的解释器bash,当前终端敲打的任何指令都有它解释。

[root@localhost ~]# ps
   PID TTY          TIME CMD
 11559 pts/0    00:00:00 bash
 20252 pts/0    00:00:00 ps

当我在终端敲打ls并执行,就算是执行了一个程序,会产生一个进程,只不过很快结束了

[root@localhost ~]# ls
anaconda-ks.cfg  data  mq     nginx    sentinel   store   UnableCreateNewThreadTest
canal            logs  nacos  project  shellDemo  tomcat  zipkin

4、shell脚本

1、什么是shell脚本?

简单来说就是将需要执行的命令保存到文本中,按照顺序执行。它是解释型的,意味着不需要编译。

准确叙述:若干命令 + 脚本的基本格式 + 脚本特定语法 + 思想= shell脚本

2、什么时候用到shell脚本?
重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。

3、shell脚本能干啥?
①自动化软件部署 LAMP/LNMP/Tomcat…
②自动化管理 系统初始化脚本、批量更改主机密码、推送公钥…
自动化分析处理 统计网站访问量
自动化备份 数据库备份、日志转储…
⑤自动化监控脚本

4、shell脚本的基本写法
1)脚本第一行
#!/bin/bash 表示以下内容使用bash解释器解析
注意:
如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,所以可以使用:#!/bin/env 解释器 #!/bin/env bash

2)脚本第二部分,注释(#号)说明,对脚本的基本信息进行描述【可选】

#!/bin/env bash

# 以下内容是对脚本的基本信息的描述
# Name: 名字
# Desc:描述describe
# Path:存放路径
# Usage:用法
# Update:更新时间

#下面就是脚本的具体内容
commands
...

3)脚本第三部分,脚本要实现的具体代码内容

5、脚本的执行方式
比如:编写了如下脚本

#!/bin/env bash

# 以下内容是对脚本的基本信息的描述
# Name: first_shell.sh
# Desc: 11
# Path: /root/shellDemo/shell01/first_shell.sh
# Usage: /root/shellDemo/shell01/first_shell.sh
# Update: 2020-11-7

echo "hello world"
echo "hello world"
echo "hello world"

赋予可执行权限:[root@localhost shell01]# chmod +x first_shell.sh
标准脚本执行方法(建议):

[root@localhost shell01]# ./first_shell.sh 
hello world
hello world
hello world
[root@localhost shell01]# /root/shellDemo/shell01/first_shell.sh 
hello world
hello world
hello world

非标准的执行方法(不建议):

[root@localhost shell01]# sh first_shell.sh 
hello world
hello world
hello world
[root@localhost shell01]# bash first_shell.sh 
hello world
hello world
hello world
[root@localhost shell01]# source first_shell.sh 
hello world
hello world
hello world
[root@localhost shell01]# bash -x first_shell.sh 
+ echo 'hello world'
hello world
+ echo 'hello world'
hello world
+ echo 'hello world'
hello world
-x:一般用于排错,查看脚本的执行过程
-n:用来查看脚本的语法是否有问题

5、编写简单的shell脚本

[root@localhost shell01]# cat second_shell.sh 
#!/bin/env bash

# 以下内容是对脚本的基本信息的描述
# Name: second_shell.sh
# Desc:
#       1. 删除/tmp/目录下的所有文件
#       2. 然后在/tmp目录里创建3个目录,分别是dir1~dir3
#       3. 拷贝/etc/hosts文件到刚创建的dir1目录里
#       4. 最后打印"报告首长,任务已于2019-05-05 10:10:10时间完成"内容
# Path: /root/shellDemo/shell01/second_shell.sh
# Usage: /root/shellDemo/shell01/second_shell.sh
# Update: 2020-11-7

rm  -rf /root/shellDemo/demo/*
mkdir /root/shellDemo/demo/dir{1..3}
cp /etc/hosts /root/shellDemo/demo/dir1
eacho "任务已于$(date +'%F %T')完成"

6、变量的定义

一句话概括:变量是用来临时保存数据的,该数据是可以变化的数据。

变量定义:变量名=变量值
变量名:用来临时保存数据的
变量值:就是临时的可变化的数据

示例:

#定义变量
[root@localhost shell01]# A=hello
#使用变量$A或者${A}
[root@localhost shell01]# echo $A
hello
#取消变量
[root@localhost shell01]# unset A
[root@localhost shell01]# echo $A

[root@localhost shell01]# 

7、变量定义的规则

  • 变量名区分大小写
  • 变量名不能有特殊符号,对于有空格的字符串给变量赋值时,要用引号引起来
  • 变量名不能以数字开头,但是可以包含数字
  • 等号两边不能有任何空格
  • 变量名尽量做到见名知意

8、变量的定义方式有哪些?

1、基本方式

普通方式定量以及获取变量
[root@MissHou ~]# A=1234567
[root@MissHou ~]# echo $A
1234567
通过截取的方式定义变量
[root@MissHou ~]# echo ${A:2:4}		表示从A变量中第3个字符开始截取,截取4个字符
3456
批量定义变量
[root@localhost shellDemo]# echo user{1..5}
user1 user2 user3 user4 user5

说明:
$变量名 和 ${变量名}的异同
相同点:都可以调用变量
不同点:${变量名}可以只截取变量的一部分,而$变量名不可以

2、命令执行结果赋值给变量

[root@localhost shell01]# B=$(uname -r)
[root@localhost shell01]# echo $B
3.10.0-957.el7.x86_64
[root@localhost shell01]# name=`hostname`
[root@localhost shell01]# echo $name
localhost.localdomain

3、交互式定义变量
目的:用户自己给变量赋值,比较灵活。

语法:read [选项] 变量名

常见选项:

选项释义
-p定义提示用户的信息
-n定义字符数(限制变量值的长度)
-s不显示(不显示用户输入的内容)
-t定义超时时间,默认单位为秒(限制用户输入变量值的超时时间)

示例:
用法1:用户自己定义变量值

[root@localhost shell01]# read  -p 'input you name:' name
input you name:lzh
[root@localhost shell01]# echo $name
lzh
[root@localhost shell01]# read  -p 'input you password:' -s  password
input you password:
[root@localhost shell01]# echo $password
123456

用法2:变量值来自文件

[root@localhost shellDemo]# cat ip.txt 
127.0.0.1
[root@localhost shellDemo]# read -p "请输入ip地址: " IP <ip.txt
[root@localhost shellDemo]# echo $IP
127.0.0.1

while+read定义变量用法:

[root@localhost shellDemo]# while read ip pass ;do echo $ip;echo $pass; done < ip.txt
192.168.128.169
12345678
192.168.128.170
12345678
[root@localhost shellDemo]# cat ip.txt 
192.168.128.169 12345678
192.168.128.170 12345678

4、定义有类型的变量
目的: 给变量做一些限制,固定变量的类型,比如:整型、只读

用法:declare 选项 变量名=变量值

常用选项:

选项释义举例
-i将变量看成整数declare -i A=123
-r定义只读变量declare -r B=hello
-a定义普通数组;查看普通数组
-A定义关联数组;查看关联数组
-x将变量通过环境导出declare -x AAA=123456 等于 export AAA=123456

示例:
定义整数

#定义A为整数
[root@localhost shellDemo]# declare -i A=123
[root@localhost shellDemo]# echo $A
123
#把A的值尝试改为字符串
[root@localhost shellDemo]# A=hello
#变为0
[root@localhost shellDemo]# echo $A
0

定义只读变量,改不了删不了,除非exit当前终端,即当前程序,它只在当前终端生效,临时的

[root@localhost shellDemo]# declare -r B=hello
[root@localhost shellDemo]# echo $B
hello
[root@localhost shellDemo]# B=123
-bash: B: 只读变量
[root@localhost shellDemo]# unset B
-bash: unset: B: 无法反设定: 只读 variable

定义环境变量:

#定义一个环境变量
#declare -x AAA=123456 等于 export AAA=123456
[root@localhost ~]# export AAA
[root@localhost ~]# AAA=heima
#从环境变量里过滤出一个环境变量AAA
[root@localhost ~]# env |grep AAA
AAA=heima
[root@localhost ~]# declare -x BB=sadf
[root@localhost ~]# env |grep BB
BB=sadf

9、变量的分类

  • 本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。前面四种变量的定义方式,都是定义的本地变量
  • 环境变量:当前进程有效,并且能够被子进程调用。
    • env查看当前用户的环境变量
    • set查询当前用户的所有变量(临时变量与环境变量)set |grep 'USER'
    • export 变量名=变量值 或者 变量名=变量值;export 变量名或者declare -x BBB=heima
#定义一个环境变量
[root@localhost ~]# declare -x AAA=hello
#查看环境变量,也可以直接env查看
[root@localhost ~]# set | grep AAA
AAA=hello
#查看当前终端的所有进程的父进程bash
[root@localhost ~]# ps
   PID TTY          TIME CMD
 18549 pts/0    00:00:00 bash
 19412 pts/0    00:00:00 ps
 #开一个子进程
[root@localhost ~]# /bin/bash
#查看当前终端的所有进程的父进程bash
[root@localhost ~]# ps
   PID TTY          TIME CMD
 18549 pts/0    00:00:00 bash
 19415 pts/0    00:00:00 bash
 19424 pts/0    00:00:00 ps
 #查看进程的父子关系
 [root@localhost ~]# ps auxf|grep bash
root      18549  0.0  0.0 115572  1492 pts/0    Ss   13:37   0:00      \_ -bash
root      19415  0.0  0.1 115436  2108 pts/0    S    13:55   0:00      |   \_ /bin/bash
root      19647  0.0  0.0 112724   988 pts/0    S+   14:00   0:00      |       \_ grep --color=auto bash
root      18926  0.0  0.1 115440  2104 pts/1    Ss+  13:43   0:00      \_ -bash
#子进程也能查看环境变量
[root@localhost ~]# set | grep AAA
AAA=hello
  • 全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用.
    解读相关配置文件
    $HOME/.bashrc:当前用户的bash信息,用户登录时读取。定义别名、umask、函数等
    $HOME/.bash_profile:当前用户的环境变量,用户登录时读取
    $HOME/.bash_logout:当前用户退出当前shell时最后读取。定义用户退出时执行的程序等
    /etc/bashrc:全局的bash信息,所有用户都生效
    /etc/profile:全局环境变量信息。系统和所有用户都生效
    $HOME/.bash_history:用户的历史命令。history -w 保存历史记录 history -c 清空历史记录
  • 系统变量(内置bash中变量)shell本身已经固定好了它的名字和作用.
$? :上一条命令执行后返回的状态;状态值为0表示执行正常,==0==表示执行异常或错误
$0:当前执行的程序或脚本名
$#:脚本后面接的参数的个数
$*:脚本后面==所有参数==,参数当成一个整体输出,每一个变量参数之间以空格隔开
$@:脚本后面==所有参数==,参数是独立的,也是全部输出
\$1\~$9:脚本后面的==位置参数==,$1表示第1个位置参数,依次类推
\${10}\~${n}:扩展位置参数,10个位置变量必须用{}大括号括起来(2位数字以上扩起来)
$$:当前所在进程的进程号,如`echo $$`
$!:后台运行的最后一个进程号 (当前终端)
!$:调用最后一条命令历史中的==参数==

进一步了解位置参数$1~${n}

#!/bin/bash
#了解shell内置变量中的位置参数含义
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1" 
echo "\$2 = $2" 
echo "\$3 = $3" 
echo "\$11 = ${11}" 
echo "\$12 = ${12}" 

[root@localhost shell01]# ./variable.sh  a bc c
$0 = ./variable.sh
$# = 3
$* = a bc c
$@ = a bc c
$1 = a
$2 = bc
$3 = c
$11 = 
$12 = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值