文章目录

  • 1 Shell
    • 1.1 Shell 作用
  • 2 Shell 脚本概述
    • 2.1 Shell 脚本应用场景
  • 3 编写 Shell 脚本
    • 3.1 脚本的构成
    • 3.2 编写脚本代码
      • 3.2.1 注释有两种写法
    • 3.3 执行脚本方式
    • 3.4 脚本错误调试
  • 3 Shell 变量
    • 3.1 Shell 变量的类型
    • 3.2 变量的作用
    • 3.3 命名要求
    • 3.4 自定义变量
      • 3.4.1 echo用法
      • 3.4.2 赋值时使用引号
      • 3.4.3 从键盘输入内容为变量赋值---read
      • 3.4.4 设置变量的作用范围
      • 3.4.5 整数变量的运算
  • 4 特殊的 Shell 变量
    • 4.1 环境变量
      • 4.1.1 创建临时全局变量
      • 4.1.2 创建永久全局变量---/etc/profile
    • 4.2 只读变量
    • 4.3 位置变量
    • 4.4 预定义变量
  • 5 总结

1 Shell

shell 是 Linux 系统中运行的一种特殊程序
shell:介于系统内核与用户之间,负责解释命令行

1.1 Shell 作用

(1)命令解释器(翻译官):介于用户与系统内核之间,负责解释命令行

(2)用户登录的 shell

  • 用户登陆Linux系统时,自动加载一个Shell程序
  • bash是Linux系统中默认使用的Shell程序
  • bash文件位于/bin/bash

shell是用户和内核之间的翻译官,用户输入指令给shell;shell接收用户输入的指令后进行翻译,翻译后给内核;然后内核调用硬件设备硬件才能工作,否则无法交互。

2 Shell 脚本概述

  • shell 是弱类型语言,定义变量时不需要事先定义它的数据类型;而java、c++、go等是强类型语言,定义变量时需要事先定义它的数据类型(整数型、浮点型、字符型、字符型)
  • shell 脚本为一系列命令的集合,将要执行的命令按顺序保存到一个文本文件
  • 给该文件可执行权限
  • 可结合各种 Shell 控制语句以完成更复杂的操作

脚本执行逻辑

  • 顺序执行:程序按从上到下顺序执行(文件)
  • 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
  • 语环执行:程序执行过程中需要重复动行多次某段语句
[root@localhost ~]# cat /etc/shells    //查看系统可支持的 shell 环境
bash默认的shell程序
cah 语法类似于c语言的
sh bash的前身
nologin 用户无法登陆主机

2.1 Shell 脚本应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行

完成自动化运维
批量化的重复操作
结合crontal完成周期性任务

3 编写 Shell 脚本

3.1 脚本的构成

  • 脚本声明(解释器):若第一行为 “#!/bin/bash”,表示此行以下的代码语句是通过 /bin/bash 程序来解释执行,#!/bin/bash 为默认解释器。还有其它类型的解释器,比如 #!/usr/bin/python、#!/usr/bin/expect
  • 注释信息:以 “#” 开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行
  • 可执行语句:比如 echo 命令,用于输出 " " 之间的字符串

3.2 编写脚本代码

  • 使用 vim 文本编辑器,每一行的 Linux 命令按脚本执行顺序依次编写
  • 赋予可执行权限:使脚本具有可执行属性
[root@localhost ~]# vim first.sh
#!/bin/bash
表示本脚本由/bin/路径的bash程序来解释

3.2.1 注释有两种写法

第一种:使用#来注释

#人生如戏,全靠演技
#在哪里跌倒,就在哪里躺下

第二种:使用<<来注释,<<后面的单词不指定,但前后要一致

<<COMMENT
人生如戏,全靠演技
在哪里跌倒,就在哪里躺下
COMMENT

3.3 执行脚本方式

方法一:脚本无文件路径(绝对路径与相对路径,需要x权限)
赋予脚本可执行权限后,执行脚本的方式

[root@localhost ~]# vim two.sh
[root@localhost ~]# ./two.sh
[root@localhost ~]# chmod +x two.sh
[root@localhost ~]# pwd
[root@localhost ~]# ls -lh


相对路径

[root@localhost ~]# ls   //可以看到脚本文件在/root目录下
[root@localhost ~]# ./first.sh


绝对路径

[root@localhost ~]# ls
[root@localhost ~]# cd /
[root@localhost /]# /root/first.sh


方法二:shell 脚本文件路径(不要 x 权限)

[root@localhost ~]# vim first.sh
[root@localhost ~]# ls
[root@localhost ~]# chmod 000 first.sh
[root@localhost ~]# sh first.sh以sh方式一样是需要x权限的
执行方式也是区分相对路径和绝对路径


方法三:source 或 . 脚本文件路径(不需要x权限)
对比方法一

主内容编写案列:创建本地yum源

[root@localhost ~]# vim local.sh
[root@localhost ~]# chmod +x local.sh
[root@localhost ~]# ./local.sh
[root@localhost ~]# ls /etc/yum.repos.d/[root@localhost ~]# bash -x local.sh   //逐行调试,检测脚本错误,定位哪行错误
[root@localhost ~]# bash -n local.sh   //检测语法错误,只显示错误的那行


3.4 脚本错误调试

脚本错误常见的有三种区别

  • 语法错误,会导致后续的命令不继续执行,可以用 bash-n 检查错误,提示的出错行数不一定是准确的
  • 命令错误,默认后续的命令还会继续执行,用 bash-n 无法检查出来,可以使用 bash-x 进行观察
  • 逻辑错误:只能自己去筛查
查代码的正确
bash -n  脚本名称(不在当前目录下加绝对路径)  //检查语法错误
bash -x  脚本名称(不在当前目录下加绝对路径)  //逻辑错误

3 Shell 变量

变量是会变化的值,不会变化的是常量

3.1 Shell 变量的类型

  • 自定义变量:由用户自己定义,修改和使用
  • 环境变量:由系统维护,用于设置工作环境
  • 只读变量:只可以读取不可以更改
  • 位置变量:通过命令行给脚本传递参数
  • 预定义变量:Bash 中内置的一类变量,不能修改
    环境变量、只读变量、位置变量、预定义变量都是属于特殊变量

系统内置变量:PATH,UID,HOSTNAME,USER

3.2 变量的作用

  • 用来存放系统和用户需要使用的特定参数(值)
  • 变量名:使用固定的名称,由系统预设或用户定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

3.3 命名要求

  • 区分大小写
  • 不能使用程序中的保留字和内置变量:如:if,for,hostname 命令
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “-”,和主机名相反
  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
  • 大驼峰 StudentFirstName
  • 小驼峰 studentFirstName
  • 下划线 student_name

3.4 自定义变量

格式:变量名=变量值
#'=' 为赋值,
变量名:数字,字母,下划线组成,不能以数字开头,区分大小写,不能是特殊符号
echo $变量名   //查看变量的值

3.4.1 echo用法

-n 输出字符串不换行
-e 处理某些特殊符号
[root@localhost ~]# echo -n "hello"
hello[root@localhost ~]#[root@localhost ~]# echo -e "hello\c"
[root@localhost ~]# echo -e "hello\n"
\c #输出字符串不换行
\n #输出字符串换行,并增加一行空行[root@localhost ~]# echo -e "\e[33mhello\e[0m"
"\e[33m黄色\e[0m"#将字符串设为黄色字体[root@localhost ~]# unset name    //取消变量


举例一

[root@localhost ~]# name=fyr  //创建临时变量
[root@localhost ~]# echo $name   //查看变量值[root@localhost ~]# name=feng
[root@localhost ~]# echo $name[root@localhost ~]# producet=centos
[root@localhost ~]# version=7
[root@localhost ~]# echo $producet$version
[root@localhost ~]# echo ${producet}7

3.4.2 赋值时使用引号

  • 双引号(" "):允许通过 $ 符号引用其他变量值
  • 单引号(’ '):禁止引用其他变量值, $视为普通字符
  • 反撇号(在tab上面):命令替换,提取命令执行后的输出结果,``和$(…)作用相同

    案例一:创建变量使用符号
[root@localhost ~]# b="hello world"
[root@localhost ~]# echo $b[root@localhost ~]# bb=hello\ world
[root@localhost ~]# echo $b


案例二:``引用结果等于$()

[root@localhost ~]# echo `date`[root@localhost ~]# a=`date`
[root@localhost ~]# echo $a[root@localhost ~]# a=$(date)
[root@localhost ~]# echo $a

3.4.3 从键盘输入内容为变量赋值—read

read读取输入

[root@localhost ~]# read -p "请输入你的名字:" name   //-p添加注释
[root@localhost ~]# echo $name[root@localhost ~]# read -n5 -p "请输入你的名字:" name    //-n5 表示变量值限制为五个字符
[root@localhost ~]# echo $name[root@localhost ~]# read -s -p "请输入你的passwd:" pass   //-s静默模式,隐藏变量值
[root@localhost ~]# echo $pass


read在脚本中使用

[root@localhost ~]# vim name.sh
[root@localhost ~]# bash name.sh


3.4.4 设置变量的作用范围

可以使用 pstree 命令查看Shell环境,输入 bash 命令进入子Shell环境,
按Ctrl+D组合键或输入 exit 命令退出子Shell环境

使用bash命令进入子Shell环境

默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell环境时,局部变量将无法再使用

可以通过内部命令 export 将指定的变量导出为全局变量,使用户定义的变量在所有的子 Shell 环境中能够继续使用

格式1:export 变量名
格式2:export 变量名=变量值

3.4.5 整数变量的运算

格式:expr 变量1 运算符 变量2 [运算符 变量3]...
expr不可计算小数,并且变量和运算符之间需要空格分隔

常用运算符

  • 加法运算:+
  • 减法运算:-
  • 乘法运算:*(计算乘法时,需要使用 “” 转义符)
  • 除法运算:/
  • 求模(取余)运算:%(取余只需要除后的余数)


    案例一:从1+100的结果
[root@localhost ~]# seq -s+ 100|bc


案例二:使用let

[root@localhost ~]#a=2
[root@localhost ~]#b=3
[root@localhost ~]#z=0;let z=a+b;echo $z


案例三:随机取余

[root@localhost ~]#expr $RANDOM%33
[root@localhost ~]#expr $[RANDOM%10+1]
[root@localhost ~]#echo $[RANDOM%10+1]


案例四:i++和++i的区别

[root@localhost ~]# i=100;let j=i++;echo $i $j
[root@localhost ~]# i=100;let j=++i;echo $i $j
i++是先赋值给j后再加,++i是加后再赋值


案例五:用脚本写个计算器

[root@localhost ~]# vim bc.sh
[root@localhost ~]# chmod +x *.sh
[root@localhost ~]# ./bc.sh


4 特殊的 Shell 变量

4.1 环境变量

由系统提前创建,用来设置用户的工作环境
配置文件:/etc/profile(全局生效)、~/.bash_profile(当前用户环境)

常见环境变量

  • PWD、PATH
  • USER、SHELL、HOME

使用 env 命令可以查看到当前工作环境下的环境变量
变量 USER 表示用户名称,HOME 表示用户的宿主目录,LANG 表示语言和字符集,PWD 表示当前所在的工作目录,变量PATH表示可执行程序的默认搜索路径

PATH(路径环境变量)

[root@localhost ~]# env  //查看系统所有环境变量
[root@localhost ~]# echo $HOME   //查看单个环境变量

4.1.1 创建临时全局变量

[root@localhost ~]# echo $PATH                  //查看当前搜索路径
[root@localhost ~]# PATH="$PATH:/root"           //将/root目录添加到搜索路径
[root@localhost ~]# export PATH="$PATH:/root"   //输出为全局环境变量


已经将该目录添加到路径环境变量中,目录内的所有具有执行权限的文件,都可以在当前环境任何目录中执行

4.1.2 创建永久全局变量—/etc/profile

[root@localhost ~]# vim /etc/profile   //进入全局变量配置文件
[root@localhost ~]# source /etc/profile   //当前shell环境执行此文件
[root@localhost ~]# echo $PATH

4.2 只读变量

用于变量值不允许被修改的情况

readonly 命令设置只读变量
readonly PRODUCT       //设置为只读变量
echo $PRODUCT
PRODUCT=Python     //只读变量不可以被重新赋值
unset PRODUCT       //只读变量不可以被删除,unset 命令用于删除变量,但无法删除只读变量,只能重启系统解决

案例

[root@localhost ~]# f=zhangsan
[root@localhost ~]# readonly f
[root@localhost ~]# echo $f
[root@localhost ~]# f=lisi

4.3 位置变量

  • 当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量

  • $n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}

4.4 预定义变量

  • $*:表示所有位置参数的内容看成一个整体返回,返回所有
  • $@:把各个参数加上双引号分隔成n份的参数列表,每个参数是独立 的,代表"$1" “$2” “$3” “$4”
  • $?:表示前一条命令或脚本执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值
  • $#:表示命令或脚本要处理的参数的个数
  • $0:表示当前执行的脚本或程序的名称
  • $$:当前进程id
  • $!:后台任务最后一个id

5 总结

1、shell 编程规范:以 #!/bin/bash(shell 解释器)
#开头代表注释
命令或者表达式

2、执行脚本的方式

① 工作目录执行即当前目录(需要x权限)
工作目录执行,指的是执行脚本时,先进入到脚本所在的目录,然后使用 ./脚本方式执行② 绝对路径执行(需要x权限)
绝对路径中执行,指的是直接从根目录/到脚本目录的绝对路径
① 和 ② 路径 + 脚本名 (需要权限),路径分为绝对路径和相对路径③ sh执行
sh执行,指的是用脚本对应的sh或bash来接着脚本执行
bash  sh  绝对路径  相对执行 执行的脚本  会创建一个子shell环境,并在这个子shell环境中执行这个脚本④ shell环境执行
shell环境执行,指的是在当前的shell环境中执行,可以使用 . 接脚本 或 source 接脚本(不建议使用)

3、Shell变量

  • 自定义变量,位置变量,预定义变量
  • 环境变量,只读变量
    自定义变量
赋值:
定义变量的方法:
① 变量名=变量值
② read 变量名   //从键盘输入内容为变量赋值
read -p "提示内容"  变量名
③ vim /etc/profile   //输出全局变量
number=43zhangsan
export number
source /etc/profile   //加载删除:unset 变量名
调用:echo $变量名

位置变量

#$n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}./first.sh one two three four five  ......   10 ....  20$0    $1  $2  $3     $4  $5             ${10}  ${20}"one two three four five"             $*  数量为 1
"one" "two" "three" "four" "five"     $@  数量为 5

预定义变量

$0   代表脚本本身
$#   代表脚本后面跟的参数(位置变量)的个数
$*   不加双引号的话 $*和$@都代表脚本后面跟的所有参数,加上双引号 "$*" 会把所有参数当做一个整体的参数(此时参数数量为1)去看待
$@   加上双引号 "$@"  会把脚本后面跟的每一个参数当做一个个体去看待
$?   代表上一条命令或者脚本执行后返回的状态码,返回值为0表示执行正确,为非0值表示执行异常return 退出函数时获取的返回值(0-255,超过部分 %256 取余)

4、运算

#整数运算
i=$(expr 12 \* 5)    变量和运算符之间需要空格分隔(计算乘法时,需要使用 " \ "转义符)
i=$((12*5))      变量和运算符之间可以不加空格分隔
i=$[12*5]
let i=12*5   运算符两边不可以用空格分隔let i++   i=$[$i+1]
let i--   i=$[$i-1]
let i+=2  i=$[$i+2]
let i/=2  i=$[$i/2]#浮点数运算
echo "字符串" | bc
awk 'BEGIN {print 浮点运算字符串}'

5、赋值时使用引号

赋值时使用双引号("")可以直接调用变量--强引用
赋值时使用单引号('')$只会被认为是字符$不会调用变量--弱引用
赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结果 $() 用法相同--调用命令等于$()
{}可以分隔变量值--隔离变量范围

6、linux主要配置文件
/etc/profile /etc/bashrc /root/.bash_profile /root/.bashrc

  • /etc/profile 设置的是系统全局环境和登录系统的一些配置,该配置对所有用户生效;(需要用source /etc/profile加载)
  • /etc/bashrc 是shell 全局自定义配置文件,主要用于自定义 shell,该配置对所有用户的shell都生效;
  • /root/.bashrc 用于单独自定义root用户的 bash,只对root用户的bash生效,如果要使elk用户生效,则需要配置/home/elk/.bashrc文件;
  • /root/.bash_profile 用于单独自定义root用户的系统环境,只对root用户生效,如果要使elk用户生效,则需要配置/home/elk/.bash_profile。

./etc/profile 、/etc/bashrc这两个配置文件是全局配置文件,对所有用户生效;/username/.bashrc 、/username/.bash_profile是局部配置文件,只对单个用户生效。

系统每次启动都会自动执行 /etc/profile 文件里的命令,这个文件是对全局有效的(所有的shell环境和用户)
不同用户登录系统 会自动执行 自己家目录中的 ~/.bash_profile 文件中的命令,自动执行 ~/.bashrc
~/.bashrc 当前用户每切换一个shell环境都会自动执行,执行 /etc/bashrc
/etc/bashrc 针对所有用户的,用户每切换一个shell环境都会自动执行

Shell 编程规范与变量相关推荐

  1. 【拔刀吧少年】之shell编程规范与变量

    shell编程规范与变量 一.Shell脚本概述 1.shell脚本的概念 2.shell脚本应用场景 3.shell的作用--命令翻译器,"翻译官"(`又称命令的组合`) 二.用 ...

  2. shell脚本详解(一)——Shell编程规范与变量

    详解Shell编程规范与变量 一.Shell脚本概述 1.shell脚本的概念 2.shell脚本应用场景 3.shell的作用--命令翻译器,"翻译官" 二.用户的登录shell ...

  3. Shell脚本——Shell编程规范及变量

    Shell编程规范及变量 一.Shell脚本概述 1.1.1 Shell基本概念 1.1.2 Shell脚本应用场景 1.1.3 Shell作用--翻译官 二.shell编程规范 2.1 用户登录sh ...

  4. Shell脚本:shell编程规范与变量

    shell编程规范与变量 一.概述:解释器,编译器,翻译官. 1.定义: 2.作用: 3.应用场景: 4.登录: 5.shell脚本基本格式: 二.重定向与管道操作: 1.交互式硬件设备: 2.重定向 ...

  5. Shell编程规范与变量(shell编程规范,执行脚本文件的四种方式,管道符号与重定向,shell变量的作用于类型)

    文章目录 Shell脚本概述 Shell脚本的概念 Shell的作用 Shell编程规范 重定向与管道 Shell脚本变量 自定义变量 特殊变量 Shell脚本概述 Shell Script ,She ...

  6. Shell编程规范与Shell中的管道符号(|)和重定向符号<、>、>>

    Shell脚本编程规范 Shell脚本的应用场景 Shell编程规范 1.Shell解释器程序的种类 2.编写一个简单的Shell脚本 3.执行脚本文件的方式 4.Shell环境中的:管道(|)与重定 ...

  7. Linux学习总结(79)—— Shell 编程规范

    前言 Shell 编程与其它的语言一样也有其约定的一些大家共同认可的约束和规范.编码规范对于程序员而言尤为重要,有以下几个原因: 一个软件的生命周期中,80% 的花费在于维护 几乎没有任何一个软件,在 ...

  8. Linux【实操篇】—— Shell 编程入门、变量、运算符、条件判断、流程控制

    目录 一.Shell 编程入门 1. 认识 Shell 2. Shell 脚本的创建与执行 二.Shell 变量 1. 系统变量和自定义变量 2. 变量的基本规则 3. 设置环境变量 4. 位置参数变 ...

  9. shell编程之特殊变量

    一.特殊变量:$n 1.基本语法 $n(功能描述:n为数字,$0代表该脚本名称, $1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}) 2.案例实操 [root@ ...

最新文章

  1. 从零开始搭建创业公司后台技术栈!
  2. python之字符串的切片操作
  3. 分析时间复杂度和空间复杂度(一级)
  4. bzoj 1232: [Usaco2008Nov]安慰奶牛cheer【最小生成树】
  5. 书评:Just the Computer Essentials(Vista)
  6. 【引用】如何结束线程运行(转)
  7. 明年1月发布!三星Galaxy S21系列爆料:首发骁龙875旗舰芯片
  8. leetcode191-打家劫舍
  9. 千万别急着入手 5G 手机!
  10. 合上More Exceptional C++的瞬间
  11. e class connect.php,帝国CMS6.6程序剖析——e/class/connect.php
  12. 使用Camera的几个步骤
  13. python之小坑:IndentationError: expected an indented block
  14. C语言版,传教士与野人渡河问题,使用深度优先搜索法求解(DFS),变态版,随便输入人数和船的最大载人数,人工智能经典题目,简单易懂,注释到位,没有bug
  15. 使用cloud studio建立免费的云主机
  16. 音视频通话:​Linphone基于SIP协议的语音视频电话软件
  17. 军工企业信息化与信息安全概要
  18. java全拼,Java获取汉字全拼和首拼
  19. 进击的PyTorch,和它背后的开源领袖
  20. 根据激光雷达点云中点的坐标计算ring的值

热门文章

  1. 幼儿园科学教案计算机,幼儿园大班科学教案_大班科学教案_幼教网
  2. 人工智能时代是什么时代?
  3. React-moveable的使用
  4. 【Mac】快捷键锁屏
  5. 批量将多个文件夹整理合并到一个文件夹中
  6. java同时引用不同版本同一个jar包
  7. k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC
  8. 区别主要在于服务器对带宽的分配:
  9. 101. Symmetric Tree (C语言)
  10. 利用SPI驱动12864液晶