shell基础

什么是shell脚本

当命令或者程序语句写在文件中,我们执行文件,读取其中的代码,这个程序文件就称之为shell脚本。
在shell脚本里定义多条Linux命令以及循环控制语句,然后将这些命令一次性执行完毕,执行脚本文件的方式称之为,非交互式方式。

  • Windows中存在.bat批处理脚本
  • Linux中常用.sh脚本文件

shell脚本规则
在Linux系统中,shell脚本或者称之为(bash shell程序)通常都是vim编辑,由Linux命令、bash shell指令、逻辑控制语句和注释信息组成。

Shebang

计算机程序中,shebang指的是出现在文本文件的第一行的前两个字符#!
在Unix系统中,程序会分析shebang后面的内容,作为解释器的指令,例如:

  • #! /bin/sh开头的文件,程序在执行的时候会调用/bin/sh,也就是bash解释器
  • #! /usr/bin/python开头的文件,代表指定Python解释器去执行
  • #! /usr/bin/env解释器名称,是一种在不同平台上都能正确找到解释器的办法

注意事项:

  • 如果脚本未指定shebang,脚本执行的时候,默认用当前shell去解释脚本,即$SHELL
  • 如果shebang指定了可执行的解释器,如/bin/bash /usr/bin/python,脚本在执行时,文件名会作为参数传递给解释器
  • 如果#!指定的解释器程序没有可执行权限,则会报错‘bad interpreter:Permission denied’。
  • 如果#!指定的解释器程序不是一个可执行文件,那么指定的解释器程序会被忽略,转而交给当前的SHELL去执行这个脚本。
  • 如果#!指定的解释器程序不存在,那么会报错‘bad interpreter:No such file or directory’。
  • #!之后的解释器程序,需要写其绝对路径(如:#! /bin/bash),它是不会自动到$PATH中寻找解释器的。
  • 如果你使用‘bash test.sh’这样的命令来执行脚本,那么#! 这一行将被忽略掉,解释器当然是用命令行中显示指定的bash。

脚本案例

#! /bin/bash
echo "hello~ world~"
#! /bin/bash 这里就是注释的作用了

系统自带的bash脚本,开机自启动脚本

脚本注释,脚本开发规范

  • 在shell脚本中,#后面的内容代表注释的内容,提供给开发者或者使用者观看,系统会忽略此行
  • 注释可以单独写一行,也可以跟在命令后边
  • 尽量保持爱写注释的习惯,便于以后回顾代码的含义,尽量使用英文,而非中文
#! /bin/bash
# Date:2022年 02月 19日 星期六 12:00:11 CST
# Auther:created by beijing
# Blog:www.baidu.com

执行shell脚本的方式

  • bash script.shsh script.sh ,文件本身没有权限执行,没有x权限,则使用的方法,或脚本未指定shebang,重点推荐的方式
  • 使用绝对/相对路径执行脚本,需要文件含有x权限
  • source script.sh或者. script.sh,代表执行的含义,source等于点 .
  • 少见的用法,sh < script.sh

shell和运维

shell脚本语言很适合处理纯文本类型的数据,且Linux的哲学思想就是一切皆文件,如日志、配置文件、文本、网页文件、大多是都是纯文本类型的,因此shell可以方便的进行文本处理,好比强大的Linux三剑客(grep、sed、awk)。
在这里插入图片描述

脚本语言

shell脚本语言属于一种弱类型语言,无需声明变量类型,直接定义使用。

  • shell语言定义的变量,数据类型默认都是字符串类型。
  • 强类型语言,必须先定义变量类型,确定是数字、字符串,之后再赋予同类型的值。

centos7系统中支持的shell情况,有如下种类:

[root@bogon work]# cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
[root@bogon work]# 

默认的sh解释器

[root@bogon work]# ll /usr/bin/sh
lrwxrwxrwx. 1 root root 4 219 04:07 /usr/bin/sh -> bash
[root@bogon work]# 

其他脚本语言

在这里插入图片描述

  • PHP是网页程序语言,专注于文本web页面开发,诸多开源产品,WordPress、discuz开源产品都是PHP开发
  • Perl语言,擅长支持强大的正则表达式,以及运维开发工具的开发
  • Python语言,明星语言,不仅适用于脚本程序开发,也擅长web页面开发,如(系统后台,资源管理平台),爬虫程序开发,大量Linux运维工具也是由Python开发,甚至于游戏开发也使用

shell的优势

虽然有诸多脚本编程语言,但是对于Linux操作系统内部应用而言,shell是最好的工具,Linux底层命令都支持shell语句,以及结合三剑客(grep、sed、awk)进行高级用法。

  • 擅长系统管理脚本开发,如软件启动停止脚本、监控报警脚本、日志分析脚本。

每个语言都有自己擅长的地方,扬长避短,达到高效运维的目的是最合适的。

[root@bogon work]# echo $SHELL
/bin/bash
[root@bogon work]# 

bash基础特性

bash是什么

在这里插入图片描述

  • bash是一个命令处理器,运行在文本窗口中,并能执行用户直接输入的命令
  • bash还能从文件中读取Linux命令,称之为脚本
  • bash支持通配符、管道、命令替换、条件判断等逻辑控制语句

bash有诸多方便的功能,有助于运维人员提升工作效率

命令历史

Shell会保留其回话中用户提交执行的命令

history #命令,查找历史命令记录,注意【包含文件中和内存中的历史记录】
-c 清空内存中命令历史。
-r 从文件中恢复历史命令。
数字:显示近N条命令
eg: history 10

----------------------------------------------------------------------------
# shell进程可保留的历史命令条数
[root@bogon work]# echo $HISTSIZE
1000
---------------------------------------------------------------------------
# 存放历史命令的文件
[root@bogon work]# vim ~/.bash_history 
[root@bogon work]#
-----------------------------------------------------------------------------
# 存放用户执行的历史命令,写入文件,用户退出登录后,持久化命令个数
[root@bogon work]# echo $HISTFILE
/root/.bash_history
[root@bogon work]# 
------------------------------------------------------------------------------
# 调用历史记录命令
# !n :执行历史记录中的某条命令
# !历史id,快速执行历史命令
[root@bogon work]# history 
    1  ifconfig 
    2  ls
    3  cd /opt/work/
    4  ls
    5  python
    6  python hello.py 
    7  vim hello.py 
    8  python hello.py 
    9  mv hello.py hello
   10  vim hello
   11  python hello
   12  date 
   13  . hello
   14  . hello.sh 
   15  source hello
   16  source  hello.sh 
   17  sh < hello.sh 
   18  cat /etc/shells 
   19  ll /usr/bin/sh
   20  echo $SHELL
   21  echo #HISTSIZE
   22  echo$HISTSIXE
   23  echo$HISTSIZE
   24  echo $HISTSIZE
   25  vim ~/.bash_history 
   26  [root@bogon work]# echo $HISTSIZE
   27  1000
   28  [root@bogon work]# vim ~/.bash_history 
   29  [root@bogon work]# echo $HISTFILE
   30  echo $HISTFILE
   31  history 
[root@bogon work]# !24
echo $HISTSIZE
1000
[root@bogon work]# 
------------------------------------------------------------------------------
# !!:执行上一次的命令,以及上下左右寻找
[root@bogon work]# !!
echo $HISTSIZE
1000
[root@bogon work]# !!
echo $HISTSIZE
1000
[root@bogon work]# echo $SHELL
/bin/bash
[root@bogon work]# !!
echo $SHELL
/bin/bash
[root@bogon work]# 
------------------------------------------------------------------------------
# !string  :执行名字以string开头的最近一次的命令
[root@bogon work]# !source
source  hello.sh 
hello world!
[root@bogon work]# !echo
echo $SHELL
/bin/bash
[root@bogon work]# !history
history 
    1  ifconfig 
    2  ls
    3  cd /opt/work/
    4  ls
		...
----------------------------------------------------------------------------
# 调用上一次命令的最后一个参数
# ESC . #快捷键
# !$
[root@bogon work]# source  hello.sh 
hello world!
[root@bogon work]# !$
hello.sh
bash: hello.sh: 未找到命令...
[root@bogon work]# echo $SHELL
/bin/bash
[root@bogon work]# !$
$SHELL
[root@bogon work]#

控制历史命令的环境变量

变量名:HISTCONTROL
ignoredups:忽略重复命令。
ignorespace:忽略以空白字符开头的命令。
ignoreboth:以上两者同时生效。

[root@bogon work]# echo $HISTCONTROL
ignoredups
[root@bogon work]# HISTCONTROL=ignoreboth
[root@bogon work]# echo $HISTCONTROL
ignoreboth
[root@bogon work]# history

bash特性汇总

  • 文件路径tab键补全
  • 命令补全
  • 快捷键Ctrl+a,e,u,k,l
  • 通配符
  • 命令历史
  • 命令别名
  • 命令行展开

变量含义

学生时代所学的数学方程式,如x=1,y=2,那会称x,y是未知数
对于计算机的角度,x=1,y=2等于定义了两个变量,名字分别是x,y,且赋值了1和2。
变量时暂时存储数据的地方,是一种数据标记(房间号,标记了客人所在的位置),数据存储在内存空间,通过调用正确的变量名字,即可取出对应的值。
在这里插入图片描述
在这里插入图片描述

[root@bogon work]# name=123
[root@bogon work]# echo $name
123
[root@bogon work]#

shell变量

  • 变量定义与赋值,注意变量与值之间不得有空格

name=“root”
变量名
变量类型,bash变量时弱类型,bash默认把所有变量都认为是字符串,无需声明类型,将声明和赋值同时进行。

  • 变量替换/引用
[root@bogon work]# name="root"
[root@bogon work]# echo ${name}
root
[root@bogon work]# echo $name #可以省略花括号
root
[root@bogon work]# 
  • 变量名规则
  • 名称定义要做到见名知意,切按照规则来,切不得引用保留关键字(help检查保留字)
  • 只能包含数字、字母、下划线
  • 不能以数字开头
  • 不能用标点符号
  • 变量名严格区分大小写
有效的变量名:
NAME_XIAOGE
_xiaoge
xiaoge1
xiaoGe2
Xiao2_GE

无效的变量名:
?xiaoge
xiao*ge
8xiaoge
xiao+ge
  • 变量的作用域
    作用域的理解(盒子的嵌套)
    在这里插入图片描述
  • 本地变量,只针对当前shell进程
    pstree检查进程树
    在这里插入图片描述

单引号变量,不识别特殊语法
双引号变量,能识别特殊符号

  • 本地变量,当前shell:在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
  • 环境变量,也称为全局变量,针对当前shell以及其任意子进程,环境变量也分自定义、内置两种环境变量。
  • 局部变量,针对在shell函数或是shell脚本中定义
  • 位置参数变量:用于shell脚本中传递的参数
  • 特殊变量:shell内置的特殊功效变量
  • $?
    • 0:成功
    • 1-255:错误码
      判断命令是否执行成功echo $?,返回0证明成功了。
[root@bogon work]# cd /opt/work/
[root@bogon work]# echo $?
0
[root@bogon work]# 
  • 自定义变量
  • 变量赋值:
  • 变量引用:
    • 双引号,变量名会替换为变量值
    • 单引号,识别为普通字符串
[root@bogon work]# echo $name
root
[root@bogon work]# echo ${name}
root
[root@bogon work]# name2='${name}'
[root@bogon work]# echo $name2
${name}
[root@bogon work]# name2="${name}"
[root@bogon work]# echo $name2
root
[root@bogon work]# 

不同的执行方式,不同的shell环境

在这里插入图片描述解答:

  1. 每次调用bash/sh解释器执行脚本,都会开启一个子shell,因此不保留当前shell变量,通过pstree命令检查进程树
  2. 调用source或者点符号,在当前shell环境加载脚本,因此保留变量。
# 演示
1. 开启子shell的执行模式
[root@bogon work]# vim make_vars.sh
[root@bogon work]# echo $name

[root@bogon work]# bash make_vars.sh 
[root@bogon work]# echo $name

[root@bogon work]# cat make_vars.sh 
name="大西瓜"
[root@bogon work]# 
--------------------------------------------------------------------------
2. 不开启子shell的执行方式
[root@bogon work]# bash make_vars.sh 
[root@bogon work]# echo $name

[root@bogon work]# source make_vars.sh 
[root@bogon work]# echo $name
大西瓜
[root@bogon work]# 

shell变量面试题

问,如下输入什么内容
答案:C

`linux命令`
在Linux中反引号,中的命令执行结果会被保留下来
[root@bogon work]# . test2.sh
[root@bogon work]# echo $user1
root
[root@bogon work]#
--------考点------------------------------------------------------------------
[root@bogon work]# cat test2.sh 
user1=`whoami`
[root@bogon work]# sh test2.sh 
[root@bogon work]# echo test2.sh 
test2.sh
[root@bogon work]# echo $user1

A.当前用户
B.root
C.

环境变量设置

环境变量:能够找出Linux本主机中的各种变量

环境变量一般指的是用export内置命令导出的变量,用于定义shell的运行环境、保证shell命令的正确执行。
shell通过环境变量确定登录的用户、PATH路径、文件系统等各种应用。
环境变量可以在命令行中临时创建,但是用户退出shell终端,变量即丢失,如果永久生效,需要修改环境变量配置文件

  • 用户个人配置文件~/.bash_profile~/.bashrc远程登录用户特有文件。
  • 全局配置文件/etc/profile/etc/bashrc,且系统建议最好创建在/etc/profile.d/,而非直接修改主文件,修改全局配置文件,影响所有登录系统的用户。
    父子shell的不同作用域:在这里插入图片描述
  • 每个用户都有自己的环境变量配置文件,~/.bash_profile ~/.bashrc,且以个人配置文件,优先加载变量,读取,以个人的优先生效
  • 当你需要给所有用户都是用某个变量,写入全局即可/etc/profile

set命令能够找到挡前的shell环境中的所有变量,以及包括局部变量(sh脚本文件中定义的变量)


检查系统环境变量的命令

  • set,输出所有变量,包括全局变量、局部变量
  • env,只显示全局变量
  • declare,输出所有的变量,如同set
  • export,显示和设置环境变量值

撤销环境变量

  • unset 变量名,删除变量或者函数。

设置只读变量

  • readonly,只有shell结束,只读变量失效
直接readonly 显示当前系统只读变量
[root@bogon work]# readonly 
declare -r BASHOPTS="checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath"
declare -ir BASHPID
declare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d"
declare -ar BASH_REMATCH='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -ir EUID="0"
declare -ir PPID="69397"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="0"
[root@bogon work]# readonly name="root"
[root@bogon work]# name=123
-bash: name: 只读变量
[root@bogon work]# 


系统保留环境变量关键字
bash内嵌了诸多环境变量,用于定义bash的工作环境

[root@bogon ~]# export | awk -F '[ :=]' '{print $3}'
HISTCONTROL
HISTSIZE
HOME
HOSTNAME
LANG
LESSOPEN
LOGNAME
LS_COLORS
MAIL
OLDPWD
PATH
PWD
SHELL
SHLVL
TERM
USER
XDG_DATA_DIRS
XDG_SESSION_ID
[root@bogon ~]# 

bash多命令执行

环境变量初始化与加载顺序

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值