linux之shell

Shell编程

shell简介

shell的作用

1.解释执行用户输入的程序或者指令

2.用户输入一条指令,shell解释一条

3.键盘输入指令,Linux给与响应 ----- 这个过程称之为交互式响应流程

shell是一块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,shell可以把用户的输入,解释给操作系统, 然后处理操作系统的输出结果,输出到屏幕给用户看到结果。 ---- 翻译官

指令的工作流程

shell的分类和切换

shell解释器的版本

查看当前使用解释器版本

shell的修改
vim /etc/passwd

shell脚本

1. 当命令或者程序语句书写在文件中,我们去执行文件,读取其中的代码 ---- 这个文件就称之为 shell脚本
2. 在shell脚本中定义多条linux的指令,以及 选择分支,循环,函数,数组..... 然后将linux命令一次性执行完毕。
    这种执行脚本文件的方式 ------ 非交互式
    程序员在客户端敲指令,然后回车出结果 ------ 交互式
3. shell的脚本规则
    在linux系统中 shell脚本(shell程序) 通常由 vim 编辑 bash shell 指令 , 逻辑控制语言 , 注释等组成

第一个shell程序

方式一
1.编辑文件
    vim hello.sh
    文件内容: echo "HelloWorld
2.解释文件
    /bin/bash hello.sh # 自行指定文件的shell解释器版本 可以省略 (shebang)
    或者
    bash hello.sh
方式二
编辑文件
    vim hello.sh
    文件内容: echo "HelloWorld
1.给文件增加执行权限
    chmod +x hello.sh
2.执行文件 # 文件要提供相对或者绝对路径
[root@localhost localhost]# /localhost/hello.sh
HelloWorld
方式三
编辑文件
    vim hello.sh
    文件内容: echo "HelloWorld
    
[root@localhost localhost]# source hello.sh
HelloWorld
    等价于
[root@localhost localhost]# . hello.sh
HelloWorld
# source 文件.sh 等价于 . 文件.sh
方式四
1. 编辑文件
vim world.sh
​
#! /bin/bash
echo "Hello正统方式"
2. 执行文件
可以使用以上三种方式
Shebang (释伴)
文件内容 #! ------- shebang的两个符号
​
Shebang通常出现在类Unix系统的脚本中第一行,作为前两个字符。在Shebang之后,可以有一个或数个空白字符,后接解释器的绝对路径,用于指明执行这个脚本文件的解释器。在直接调用脚本时,系统的程序载入器会分析 Shebang 后的内容,将这些内容作为解释器指令,并调用该指令,将载有 Shebang 的文件路径作为该解释器的参数,执行脚本,从而使得脚本文件的调用方式与普通的可执行文件类似。例如,以指令#!/bin/sh开头的文件,在执行时会实际调用 /bin/sh 程序(通常是 Bourne shell 或兼容的 shell,例如 bash、dash 等)来执行。

注意

1. 如果没有指定 shebang 脚本执行的时候 默认使用的是 系统当前的shell解释器 $SHELL
2. 如果 #! 指定了解释器 但是没有执行该文件的权限 报错
3. 解释器的选择存在优先级
    1. 运行脚本文件时 自行指定的 解释器 (无论写没写 shebang)
    2. 若脚本文件中填充了 shebang 书写指令时,借助系统的shell解释器 但是shebang解析以后优先启用
    3. 若脚本中未填充 shebang 且运行文件时未书写 解释器 使用 系统的解释器 $SHELL

脚本注释

1. 在shell脚本中 "#" 后面的内容就代表注释
2. 注释提供给开发者查看的,系统会忽略注释
3. 脚本注释的语法
    # 注释内容
    举例:
    # 向界面输出HelloWorld
    echo "HelloWorld"

脚本语言

shell脚本语言属于一种弱类型语言 : 无需声明变量类型 直接定义使用
例如: name="小黑" age=20 score=80.0
​
强类型:
   int   double   char  boolean 
    int a = 10 √
    a = 15    √
    a = "shuaihui"  ×
​
弱类型:
   var  
   var  v = 10
   v = 15 √
   v = "zhangsan"  √

shell会保留会话中用户曾提交的命令

# 查看历史命令记录 [包含文件中和内存中的历史记录]
history
# 查看文件中的历史指令记录 若误删了内存中的历史指令,可以借助 history -r 文件 进行恢复
[root@localhost localhost]# vim /root/.bash_histor
# 查看所有历史命令记录
history
列出历史命令以后 可以 选中 历史命令的编号 再次执行
# !历史命令的编号
# 查看前10条历史命令记录
history 10
history命令参数详解
-c 清空内存中历史命令
-r 可以从文件中恢复历史命令

shell变量

变量概念

变量是计算机内存存储数据的地方。是一种数据标记(房间号,标记了客人[数据]的位置) 数据存储在内存空间, 通过调用对应的变量名,即可获取对应的值。[变量名与值之间,包括等号 不能有空格]

# 定义一个变量
变量名=值 # shell规范中 所有的值都是字符串
例如:
name="小黑"
age="20"
score=1.2
#定义一个变量的案例
[root@localhost ~]# name="小黑"
[root@localhost ~]# echo "HelloWorld"
HelloWorld
[root@localhost ~]# echo HelloWorld
HelloWorld
[root@localhost ~]# echo $name
小黑
#获取变量的值
完整写法 ${变量名}
简化写法 $变量名
# 若变量名[在重合的作用域内]重复
name="小黑"
name="小白" # 指令执行,相当于修改变量name中保存的值
echo $name # 小白

变量名的规则

1. 名称定义要做到望文生义,要按照规则来 不能使用保留字,关键字
2. 只能包含数字,字母,下划线(_)
3. 不能以数字开头
4. 不能使用标点符号
5. 变量名要严格区分大小写
# 变量名严格区分大小写
[root@localhost ~]# name="小黑"
[root@localhost ~]# Name="小白"
[root@localhost ~]# echo $Name
小白
[root@localhost ~]# echo $name
小黑
# 以下命名不符合规则
change_123 OK!
change@123 error!
1change_123 error!
_change123 ok!
test_insert_student_info ok!

变量的分类

1. 本地变量
2. 全局变量
3. 局部变量
4. 特殊变量
5. 自定义的变量
# 安装软件 psmisc 查看父子 shell
yum -y install psmisc
# pstree
查看父子shell的关系

本地变量
在当前shell中有效(切换子shell , 子 shell 无法获取定义的变量)
注意:
    1. 父 shell 进 子 shell 运行 携带 bash或者sh的指令即可
    2. 子 shell 回 父 shell exit # 通过pstree 查看父子shell关系 以及当前所处的 shell

环境变量
环境变量也称之为全局变量.针对当前的shell以及任意的子shell 都有效。 环境变量也分为 自定义、内置。

每个用户都有自己的环境变量(全局变量)配置文件 ~/.bash_profile ~/.bashrc(个人) 优先加载并读取变量, 以个人的优先生效

 

2.全局配置文件 /etc/profile /etc/bashrc 但 系统建议最好创建在 /etc/profile.d/ 而非修改主文件 修改全局配 置文件 影响所有登录系统的用户 ---------- root有权修改

3.环境变量一般是指 使用 export内置命令导出的变量 , 用于定义shell的运行环境 保证shell命令的正确执行 shell设置登录的用户名 PATH路径 文件系统.....

4.环境变量可以在命令行中临时创建, 但是当用户退出终端时 命令丢失 在配置文件中定义,永久有效

检查系统环境变量(全局变量)
set # 输出所有变量 包含全局变量、局部变量
env # 只显示全局变量
declare # 输出所有变量 等同于 set
export # 显示和设置环境相关的变量值(等同于全局)
撤销系统环境变量
unset 变量名 # 删除变量或者函数
例如:
    unset age;
设置只读变量
readonly # 在shell结束前,只允许获取变量的值 不允许修改
[root@localhost ~]# readonly age=20
[root@localhost ~]# echo $age
20
[root@localhost ~]# age=30
bash: age: 只读变量
设置临时的全局变量
export age1=30
环境变量初始化与加载顺序

局部变量
定义在函数内部的变量,只在函数内部有效
特殊变量

shell的特殊变量,用在比如 脚本 , 函数传递参数时使用

殊变量 $0 $1 $2的案例演示
结果为 ./special.sh --- 小黑 ---- abc
########################################
特殊变量$#的案例演示
获取参数的总个数
参数的总个数为: 5
#########################################
演示 $*的案例
结果为: 小黑 abc 小白 def 小兰
########################################
演示 $@ 的案例
结果为: 小黑 abc 小白 def 小兰
[root@localhost localhost]# cat special.sh
#! /bin/bash
echo '特殊变量 $0 $1 $2的案例演示'
echo '结果为' $0 '---' $1 '----' $2
echo '########################################'
echo '特殊变量$#的案例演示'
echo '获取参数的总个数'
echo '参数的总个数为:' $#
echo '#########################################'
echo '演示 $*的案例'
echo '结果为:' $*
echo '########################################'
echo '演示 $@ 的案例'
echo '结果为:' $@
# $* 和 $@ 的区别
[root@localhost localhost]# ./special2.sh 小黑 123 小白 456 小兰
演示 "$*" 的用法
小黑 123 小白 456 小兰
---------------------------------------
演示 "$@" 的用法
小黑
123
小白
456
小兰
[root@localhost localhost]# cat special2.sh
#! /bin/bash
echo '演示 "$*" 的用法'
for i in "$*"
do
    echo "$i"
done
echo '---------------------------------------'
echo '演示 "$@" 的用法'
for a in "$@"
do
    echo "$a"
done
$? 获取上一次指令执行的状态返回值 0 正确 非0失败可以自定义 exit 120  执行失败时echo? 就打印 120
$$ 当前 shell脚本的 进程号
$! 上一次后台进程的PID
$_ 获取上一次的命令执行时传递的最后一个参数
## 1. 演示$?
[root@localhost localhost]# ll /etc # 正确指令
[root@localhost localhost]# echo $?
0
[root@localhost localhost]# ll /etcc # 路径错误
ls: 无法访问/etcc: 没有那个文件或目录
[root@localhost localhost]# echo $?     # 上个命令执行失败,输出2
## 2. 演示 $$
[root@localhost localhost]# echo $$     # 执行失败时,输出的状态码
## 3. 演示 $_
[root@localhost localhost]# sh special.sh 小黑 小白
特殊变量 $0 $1 $2的案例演示
结果为 special.sh --- 小黑 ---- 小白
########################################
特殊变量$#的案例演示
获取参数的总个数
参数的总个数为: 2
#########################################
演示 $*的案例
结果为: 小黑 小白
########################################
演示 $@ 的案例
结果为: 小黑 小白
[root@localhost localhost]# echo $_     # 获取上一个命令的最后一个参数
小白

脚本控制返回值

[root@localhost localhost]# ./t1.sh 123 456 789
你必须传递两个参数
刚刚好传递了两个参数
[root@localhost localhost]# vim t1.sh
[root@localhost localhost]# ./t1.sh 123 456 789
你必须传递两个参数
[root@localhost localhost]# ./t1.sh 123 456
刚刚好传递了两个参数
[root@localhost localhost]# cat t1.sh
#! /bin/bash
[ $# -ne 2 ] && {
    echo "你必须传递两个参数"
    exit 119 # 终止程序运行,且返回119状态码以后 提供给当前shell的 $? 变量
}
echo "刚刚好传递了两个参数"
内置的shell命令
1. echo 打印输出内容
参数:
-n 不换行输出
-e 解析字符串中的特殊符号
##echo 案例演示
[root@localhost localhost]# echo 你瘦了;echo 你多吃点
你瘦了
你多吃点
[root@localhost localhost]# echo -n 你瘦了;echo 你多吃点
你瘦了你多吃点
[root@localhost localhost]# echo "你人还挺好"
你人还挺好
[root@localhost localhost]# echo "你人\n还挺好"
你人\n还挺好
[root@localhost localhost]# echo -e "你人\n还挺好"
你人
还挺好
2.eval 相当于把第二个指令当做参数传递给 eval
## eval案例演示
[root@localhost localhost]# ls < /etc
demo.sh hello.sh special2.sh special.sh t1.sh world
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值