复习shell编程规范与变量看这篇就够了(孤独前是迷茫,孤独后是成长)

目录

前言

一、shell编程规范

1.1 shell的作用

1.2 查看shell环境

 1.3 为什么要学shell

1.4 shell脚本构成

1.5 执行脚本的方法

1.6 重定向和管道操作

1.6.1 交互式硬件设备

1.6.2 重定向操作

扫描二维码关注公众号,回复: 14235453 查看本文章

二、shell变量

2.1 变量的作用

2.2 变量的类型

2.2.1 自定义变量

2.2.2 位置变量

三、运算

3.1 整数运算

3.2 浮点数运算

总结


前言

本篇是对shell脚本编程规范和变量的复习,重点部分详细写了一下,其他部分移步至我对应的博客

一、shell编程规范

1.1 shell的作用

命令解释器,翻译官,介于用户和内核之间,复制解释命令行

计算机用户输入相关指令,shell进行解释,转换成计算机可以识别的二进制语言,传递给内核,内核调用系统资源执行,并输出相应的结果

1.2 查看shell环境

[root@localhost~]# cat /etc/shells
/bin/sh  #以前的shell环境
/bin/bash  #替代了sh,默认环境
/sbin/nologin  #用户无法登录
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh  #csh的增强版
/bin/csh  #类似c的shell环境

用户登录时,会指定shell环境

 

 1.3 为什么要学shell

  1. 完成自动化运维
  2. 批量化的重复操作
  3. 结合crontab完成周期性任务
  4. 可以帮运维人员减轻工作量
  5. 提高正确率,脚本的执行结果始终一样

shell是一种弱类型语言,定义变量时,定义变量时不需要事先定义数据类型 (Python也是)解释性语言

强类型语言: Java c c++ go 定义变量时需要事先定义他的数据类型( 整数型、浮点型、字符型......)

1.4 shell脚本构成

1.申明解释器

#!/bin/bash (默认解释器)   #!/usr/bin/python
#作者,创作日期,脚本的功能,维护信息等

2.注释信息 #开头,被注释的语句在脚本运行时,不被执行

3.执行的语句

vim first.sh
#写入以下脚本代码
#!/bin/bash
#my first shell script <stevelu 2022-4-7>

cd /boot
echo "当前的目录位于"
pwd

echo "其中以vml开头的文件包括:"
ls -lh vml*

1.5 执行脚本的方法

1.路径+脚本名,需要权限

chmod +x first.sh
  • 绝对路径
  • 相对路径

2.调用解释器 不需要权限

  • bash 脚本名
  • source或 . 不建议使用,可能 会影响系统环境

3.写入PATH环境,需要权限

  • 将文件放入已有的PATH环境目录中
  • 将脚本所在目录加入PATH环境

注:

source 和 . 会在当前 shell 环境中执行脚本

bash、sh、绝对路径、相对路径执行的脚本,会创建一个子shell环境,并在这个子shell环境中执行这个脚本

[root@localhost/data/sh]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#/usr/local/sbin:管理员才能执行的自己创建的命令或者第三方的命令
#/usr/local/bin:所有用户可以执行的自己创建的命令或者第三方的命令
#/usr/sbin:管理员才能执行的系统命令
#/usr/bin:所有用户可以执行的系统命令
#/root/bin:默认不存在

[root@localhost/data/sh]# vim /etc/profile
export PATH=$PATH:/data/sh
[root@localhost/data/sh]# source /etc/profile
#刷新
[root@localhost/data/sh]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data/sh
[root@localhost/data/sh]# 

 

 

1.6 重定向和管道操作

1.6.1 交互式硬件设备

  1. 标准输入:从该设备接收用户输入的数据
  2. 标准输出:通过该设备向用户输出数据
  3. 标准错误:通过该设备报告执行出错信息

类型

设备文件

文件描述编号

默认设备

标准输入

/dev/stdin

0

键盘

标准输出

/dev/stdout

1

显示器

标准错误输出

/dev/stderr

2

显示器

1.6.2 重定向操作

类型

操作符

用途

重定向输入

<

从指定文件读取数据,而不是从键盘输入

重定向输出

>

将输出结果保存到指定的文件(覆盖原有内容)

重定向输出

>>

将输出结果追加到指定的文件尾部

重定向错误输出

2>

将错误信息保存到指定的文件(覆盖原有的内容)

重定向错误输出

2>>

将错误信息追加到执行的文件中

混合输出

&>

将标准输出、标准错误的内容保存到同一个文件中

 

#两种混合输出方式,老程序员喜欢用第二种
ls-lh &> log.txt  
ls -lh >log.txt 2>&1

ls -lh 标准输出 1--->屏幕
>log.txt  1-->log.txt  重定向至屏幕
2>&1  2-->1  1指向log.txt,所以2也就指向log.txt

二、shell变量

2.1 变量的作用

用来存放系统和用户需要使用的特定参数(值)

  • 变量名:使用固定的名称,由系统预设或用户定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

2.2 变量的类型

  • 自定义类型:由用户自己定义、修改和使用
  • 特殊变量:环境变量,只读变量,位置变量,预定义变量

2.2.1 自定义变量

1.变量名以字母或下划线开头,区分大小写,建议全大写 变量名=变量值

2.查看变量的值 echo $变量名

3.赋值时使用引号:

  • 双引号:允许通过$符号引用其他变量值
  • 单引号:禁止引用其他变量值,$视为普通字符
  • 反撇号:命令替换,提取命令执行后的输出结果

4.从键盘输入内容为变量赋值 read [ -p " 提示信息 " ] 变量名

 

 

 

 

 

 造成上述情况的原因是运行的bash环境的差异,下面就详细补充一下

子bash进程中的变量在父bash进程中无法查看(全局变量的补充)

#实验前的name没有值,以及进程树所在地
[root@localhost~]# echo $name

[root@localhost~]# pstree
─sshd───sshd───bash───pstree

 

 

那么如何使该变量无论在哪个bash环境中都生效呢?我们需要将变量写入系统的文件中

[root@localhost~]# source /etc/profile
#加载一下

 

 

得出结论,命令行的全局变量只对后面的bash环境有效,且在一个进程树下,要想所有bash环境生效,写入系统文件中

系统环境文件

/etc/profile   
/etc/bashrc   
~/.bash_profile   
~/.bashrc

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

变量替换

tmp=$a
a=$b
b=$tmp
# ab之间的数值进行替换,借助第三个变量来实现

2.2.2 位置变量

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

shell变量详细解析的博客:

https://blog.csdn.net/qq_42327944/article/details/123832407?spm=1001.2014.3001.5502

三、运算

3.1 整数运算

shell默认只支持整数的运算。常用的运算表达式如下

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]

3.2 浮点数运算

  1. echo "字符串" |bc
  2. awk 'BEGIN {print 浮点运算字符串}'

shell中的运算详细解析:

https://blog.csdn.net/qq_42327944/article/details/123836316?spm=1001.2014.3001.5502

总结


定义变量的方法1:
变量名=变量值

定义变量的方法2:
read [ -p "请输入"]变量名     从键盘输入中获取变量名的值
echo -n "请输入"
read name

四种运算
i=$((10*20 ))
i=$[10*20]
let i=10*20
expr 10\*20


猜你喜欢

转载自blog.csdn.net/qq_42327944/article/details/124030737