jquery list forms pdo cmd module graphics path sql server 视频教程 打印缩放怎么设置 excel动态图表制作 mysql卸载重装 java手机验证码 java接收数组 matlab取实部 plsql卸载 python库 python教程 python创建txt文件并写入 java实用教程 java对象序列化 java格式化字符串 java命令 javaabstract 凯立德地图免费下载 python入门经典 kms神龙版 js轮播图代码 vfloppy win10画图 京东钱包客户端 ip切换软件 pr抖动特效 c语言从入门到精通 foobar2000插件 目标聚光灯 c语言图书管理系统 三星打印机怎么加墨 未来教育考试系统 数据库同步解决方案
当前位置: 首页 > 学习教程  > 编程语言

Shell脚本编程规范与变量(shell脚本必须要知道的规矩!)

2020/12/28 19:48:26 文章标签:

Shell脚本编程规范与变量 文章目录Shell脚本编程规范与变量一、Shell脚本概述1.Shell脚本的概念2.Shell脚本的应用场景3.Shell的作用二、编写一个Shell脚本1.编写脚本代码2.赋予可执行权限3.执行脚本文件1)方法一∶ 指定路径的命令,要求文件必须有 x 权限…

Shell脚本编程规范与变量

文章目录

  • Shell脚本编程规范与变量
    • 一、Shell脚本概述
      • 1.Shell脚本的概念
      • 2.Shell脚本的应用场景
      • 3.Shell的作用
    • 二、编写一个Shell脚本
      • 1.编写脚本代码
      • 2.赋予可执行权限
      • 3.执行脚本文件
        • 1)方法一∶ 指定路径的命令,要求文件必须有 x 权限。(绝对路径和相对路径)
        • 2)方法二∶指定Shell来解释脚本,不要求文件必须有 x 权限。
        • 3)方法三:source 脚本路径或 . 脚本路径(不需要x权限)
      • 4.更完善的脚本构成
    • 四、重定向与管道操作
      • 1.交互式硬件设备
      • 2.重定向操作
      • 3.管道操作符号"|"
    • 五、Shell变量的作用、类型
      • 1.变量的作用
      • 2.变量的类型
      • 3.自定义变量
      • 4.赋值时使用引号
      • 5.从键盘输入内容为变量赋值
      • 6.变量的作用范围
      • 7.整数变量的运算
    • 六、特殊的Shell变量
      • 1.环境变量
      • 2.常见环境变量
      • 3.PATH(路径环境变量)
      • 4.只读变量
      • 5.位置变量
      • 6.预定义变量

Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。Bash (/bin/bash)是目前大多数 Linux 版本采用的默认 Shell。

一、Shell脚本概述

1.Shell脚本的概念

1)将要执行的命令吧顺序保存到一个文本文档
2)给该文件可执行权限,便可运行
3)可结合各种Shell控制语句以完成更复杂的操作

2.Shell脚本的应用场景

1)重复性操作
2)批量事物处理
3)自动化运维
4)服务运行状态监控
5)定时任务执行

3.Shell的作用

1)Shell是命令解释管,用户与内核之间的“翻译官”,负责解释用户输入的命令行。

在这里插入图片描述

2)用户登录Shell

  • 登录后默认使用的ShellI程序,一般为/bin/bash
  • 不同Shell的内部指令、运行环境等会有所区别
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
....

在这里插入图片描述

二、编写一个Shell脚本

1.编写脚本代码

●使用vim文本编辑器
每行一条Linux命令,按执行顺序依次编写

[root@localhost ~]#vim first.sh #编辑脚本文件,以.sh结尾是方便识别出这是个shell脚本文件
cd /boot/ #切换到根目录
pwd  #查看当前所在目录
ls -lh vml* #以长格式更人性化的方式显示以vml开头的文件

在这里插入图片描述

上述first.sh脚本文件中,包括三条命令:cd /boot/、pwd、ls -lh vml*。执行此脚本文件后,输出结果实际上就是这三条命令依次执行的结果,从而实现了“批量处理”。

2.赋予可执行权限

●使脚本具有可执行属性

[root@localhost~]#chmod +x first.sh

在这里插入图片描述

3.执行脚本文件

1)方法一∶ 指定路径的命令,要求文件必须有 x 权限。(绝对路径和相对路径)

chmod +x /root/first.sh

指定绝对路径∶ /root/first.sh

在这里插入图片描述

指定相对路径∶ ./first.sh

在这里插入图片描述

2)方法二∶指定Shell来解释脚本,不要求文件必须有 x 权限。

sh 脚本路径∶ sh first.sh或者sh /root/first.sh

相对路径(需要在脚本所在目录下),此脚本本来就建立在家目录(~目录)下,root的家目录就是root。

在这里插入图片描述

绝对路径(直接指定文件具体路径)

在这里插入图片描述

3)方法三:source 脚本路径或 . 脚本路径(不需要x权限)

.first.sh 或者 source first.sh(同上对路径有要求)

在这里插入图片描述

这种执行方法会自动切换到boot目录。这是因为source 以及 . 直接在当前的进程中读取脚本的配置,不会开一个新的进程!
source会将脚本的内容直接容影响到父进程的(因为它不开辟新线程,可以说是直接在当前进程中加入脚本的执行内容)。所以你source之后,里面配置的变量都会加入到当前环境中,你可以在该shell中调用脚本中的变量!
而./first.sh 以及 sh first.sh
是在当前进程下新开一个子shell进程运行这个脚本,当脚本运行完毕了,sh中设置的变量和子进程一起被销毁了!(该子shell继承了父进程的shell的环境变量,子shell结束了变量将被销毁,如果使用了export可以将子shell的变量反馈到父级别的shell中)。

4.更完善的脚本构成

  • 脚本声明
  • 注释信息
  • 可执行语句
[root@localhost~]#vim /first.sh
#!/bin/bash 
#This is my first Shell-Script. 
cd /boot
echo "当前的目录位于∶" 
pwd
echo "其中以vml开头的文件包括∶"   #输出友好提示信息
ls -Ih vml*

在这里插入图片描述

上述 first.sh 脚本文件中,第一行"#!/bin/bash"是一行特殊的脚本声明,表示此行以后的语句通过/bin/bash程序来解释执行;其他以"#"开头的语句表示注释信息; echo 命令用于输出字符串,以使脚本的输出信息更容易读懂。例如,执行改写后的 first.sh 脚本,输出结果如下所示。

在这里插入图片描述

四、重定向与管道操作

1.交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息
类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

2.重定向操作

类型操作符用途
重定向输入<从指定的文件读取数据
重定向输出>将标准输出结果 保存 到指定的文件,并且覆盖原有内容
重定向输出>>将标准输出结果 追加 到指定的文件的尾部,不覆盖原有内容
标准错误输出2>将错误信息 保存 到指定的文件,并且覆盖原有内容
标准错误输出2>>将错误信息 追加 到指定的文件的尾部,不覆盖原有内容
混合输出&>将标准输出、标准错误保存到同一文件中
混合输出2>&1将标准错误输出重定向到标准输出

For Example:

vim passwd.txt
222222
echo "123456" > passwd.txt
echo "123456" >> passwd.txt

用>表示将内容输出到文件中,会直接覆盖文件内容

在这里插入图片描述

在这里插入图片描述

用>>表示追加到文件中,会另起一行

在这里插入图片描述

setenforce 0
echo "123456" > passwd.txt
passwd --stdin zs < passwd.txt

在这里插入图片描述

从pass.txt文件中获取密码,需要注意SELinux会影响命令执行,若执行失败可尝试关闭后重试。

3.管道操作符号"|"

将左侧的命令输出结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。

For Example:

ps aux | wc -l #显示所有进程数

在这里插入图片描述

echo "abc123" | passwd --stdin zs #更改用户zs的密码为abc123

在这里插入图片描述

五、Shell变量的作用、类型

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

1.变量的作用

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

2.变量的类型

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

3.自定义变量

定义一个新的变量

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

查看变量的值

echo $变量名 #查看当前变量的值

注意:赋值时“=”两边不能有空格

For Example:

在这里插入图片描述

4.赋值时使用引号

双引号:允许通过$符号引用其他变量值

单引号:禁止引用其他变量值, $视为普通字符

反撇号:命令替换,提取命令执行后的输出结果,``和$(…)作用相同

在这里插入图片描述

5.从键盘输入内容为变量赋值

read命令获取输入内容

read -p 提示信息 变量名
echo $变量名

在这里插入图片描述

也可用于脚本中用于收集信息。

For Example:

在这里插入图片描述

赋予脚本执行权限后,执行结果如下

在这里插入图片描述

6.变量的作用范围

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

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

  • 设置变量的作用范围表达式:
格式1:export 变量名
格式2:export 变量名=变量值

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

在这里插入图片描述

输入bash,进入子bash环境(也可称为子Shell环境),相当于开了一个子进程。

在这里插入图片描述

在当前父bash环境中给PRODUCT赋值后,进入子环境,发现子环境中无法查看PRODUCT的变量值,是因为PRODUCT并非全局环境变量,子环境中的PRODUCT并没有被赋值。当把PRODUCT输出为全局环境变量后,即使进入子Shell环境依然可以查看父环境的变量PRODUCT的变量值。

在这里插入图片描述

7.整数变量的运算

  • 运算表达式
格式:expr 变量1 运算符 变量2 [运算符 变量3]
  • 常用运算符

加法 +、减法 -、乘法 \*、除法 /,取余 %。

常用的运算表达式:

a=`expr 11 \* 2`
echo $((10 / (1+1)))
echo $[10 / (1+1)]
let i=12*4

i++ 相当于 i=$[$i+1]
i-- 相当于 i=$[$i-1]
i+=2 相当于 i=$[$i+2]

在这里插入图片描述

六、特殊的Shell变量

1.环境变量

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

2.常见环境变量

PWD、PATH
USER、SHELL、HOME

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

3.PATH(路径环境变量)

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

在这里插入图片描述

切换到子Shell环境依然可执行,且其他目录下依然可执行

在这里插入图片描述

4.只读变量

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

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

在这里插入图片描述

5.位置变量

执行脚本sh xxx.sh 1 2 3 4 5 6 7 8 9 10…n

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

在这里插入图片描述

6.预定义变量

$*、$@:表示命令或脚本要处理的参数。
  $*:把所有参数看成以空格分隔的一个字符串整体,代表"$1 $2 $3 $4"。
  $@:把各个参数加上双引号分隔成n份的参数列表,每个参数是独立  的,代表"$1" "$2" "$3" "$4"。

$0:表示当前执行的脚本或命令的名称。
$#:表示命令或脚本要处理的参数的个数。	
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。
也常被用于Shell脚本中return退出函数并返回的退出值。
[root@localhost ~]#echo `date +%F` #查看完整日期,按照年-月-日的格式输出
2020-12-20
[root@localhost ~]#vim mybak.sh #编辑脚本
#!/bin/bash            #表示此行以后的语句通过/bin/bash程序来解释执行
time=backup-`date +%F`.tar.gz #把变量值backup-`date+%F`.tar.gz赋值给变量time
tar zcf $time $* &> /dev/null	#/dev/null表示的是一个黑洞文件,通常用于丢弃不需要的数据输出。
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份"
echo "具体内容包括: $*"

[root@localhost ~]#chmod +x mybak.sh #赋予执行权限
[root@localhost ~]#./mybak.sh /etc/passwd /etc/shadow

在这里插入图片描述


本文链接: http://www.dtmao.cc/news_show_550388.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?