shell脚本相关知识

一. 关于shell

shell,一种壳层命令行界面,是Unix操作系统下传统的用户和计算机的交互界面。第一个用户直接输入命令来执行各种各样的任务。

普通意义上的shell就是可以接受用户输入命令的程序。它之所以被称作shell是因为它隐藏了操作系统低层的细节。同样的Unix下的图形用户界面GNOMEKDE,有时也被叫做“虚拟shell”或“图形shell”。

我们Linux操作下的终端,就是关于shell解释行的命令解释,是交互式。但是在我们的终端下进行的命令操作只支持行解析,当我们需要完成一定逻辑,多行命令才能够得到结果时,就需要利用到.sh的文件类型,也就是shell脚本,在shell脚本中,相当于多行解释命令行的合集。添加了一定的编程语言的概念,与我们的命令行操作略有语法上的不同。

二. shell执行原理

因为Linux是一门开发的源码,所以随着时间的发展,shell出现了很多的解释器,比如bash、sh、cah、ksh、tcsh等,可以在当前路径/etc/shells下面查看系统中所有已知(但不一定安装)的shell,语法大致都是相同的,不同的解释器可能会增加减少某些语法特征:

shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。 

对于当前的一个shell比如bash来说,当使用交互式键入一条命令的时候,也就是我们通过键盘输入一条命令,但是为了保证一个执行者的安全性,它并不会自身去亲自执行一条命令:因为:

    1.为了防止命令的运行产生副作用影响后序的命令解释

    2.防止出现恶意修改/不可逆的破坏

所以无法判断给出的逻辑命令是否安全,都会创建出一个子进程,让子进程去执行这个shell命令,但是对于shell脚本来说,当创建好一个shell脚本运行起来的时候,相当于是一条命令,这时候bash会创建一个子进程来运行shell脚本,而这个子进程同样也是一个bash,因此,当其去执行shell脚本中一条条的命令的时候,也就是相当于再会去创建出一个子进程来执行shell脚本中的一条条命令:

相当于对于当前的执行来说,我们作为总指挥,需要将事件递交给fork子进程。这些都是安全性的保障,shell脚本中的命令行相当于当前打开终端的孙进程,哈哈=。=,shell脚本本身就是子进程。

三. shell脚本

关于shell脚本的学习,大家在网上可以找到N多的视频教程,我就不详细讲shell相关的语法,我只提及一些知识点。

首先关于运行方式:

提及运行方式之前,shell脚本第一行:

#!/bin/bash

这行命令指的是我们当前脚本使用的解释器版本。#并不代表注释。

脚本文件中不加#!/bin/bash可以吗?

因为一般linux用户的默认shell都是bash,脚本运行时候会用用户的默认shell来解释脚本(如果#!/bin/bash不写的话),但很多unix系统可能会用bourne shell、csh或者ksh等来作为用户默认shell,如果脚本中包含的有符合bash语法却又让其他shell无法解释的代码存在,那么就必须在第一行写上这个(当然还要这个系统上安装了bash),以保证脚本的正常运行。

运行方式

chmod u+x shell脚本

    首先作为脚本语言来说,他最大的有点就是语法规范上的约束力小,灵活性大,脚本语言是不需要像高级语言C。C++那样需要经过一系列的预处理,编译,汇编,链接才能够得到我们最终需要的可执行逻辑程序,脚本语言本身就可以由解释器进行解释运行,所以,shell脚本的第一种运行方式就是授予他可执行权限,然后直接执行就好了

命令解释器 shell脚本

还有一种方式就是,当我们没有授予shell脚本可执行权限的时候,我们可以将shell脚本当做输入参数,可以这么理解,然后去调用/bin/bash 去执行我们需要执行的shell脚本。

/bin/bash test_sh.sh

shell变量

本地变量:

本地变量在用户现在的shell生命期的脚本中使用。

例如,本地变量file-name取值为loop.doc,这个值只在用户当前shell生命期有意义。

如果在shell中启动另一个进程或退出,此值将无效。

这个方法的优点就是用户不能对其他的shell或进程设置此变量有效。

使用变量时,如果用花括号将之括起来,可以防止shell误解变量值,尽管不必一定要这样做,但这确实可用。要设置一本地变量,格式为: $ variable-name=value 或 $ {variable-name=value}

注意,等号两边可以有空格。如果取值包含空格,必须用双引号括起来。

shell变量可以用大小写字母。

变量设置时的不同模式:

Variable-name=value  设置实际值到variable-name

Variable-name+value  如果设置了variable-name,则重设其值

Variable-name:?value  如果未设置variable-name,显示未定义用户错误信息

Variable-name?value  如果未设置variable-name,显示系统错误信息

Variable-name:=value  如果未设置variable-name,设置其值

Variable-name:-value  同上,但是取值并不设置到variable-name,可以被替换

清除变量

使用unset命令清除变量。 unset variable-name

环境变量 :

环境变量用于所有用户进程(经常称为子进程)。

登录进程称为父进程。s h e l l中执行的用户进程均称为子进程。

不像本地变量(只用于现在的s h e l l)环境变量可用于所有子进程,这包括编辑器、脚本和应用。

环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在. profile文件中定义。系统管理员可能在/etc/profile文件中已经设置了一些环境变量。将之放入profile文件意味着每次登录时这些值都将被初始化。

传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用export命令导出。环境变量与本地变量设置方式相同。

设置环境变量

VARIABLE-NAME=value;export VARIABLE-NAME

在两个命令之间是一个分号,也可以这样写:

VARIABLE-NAME=value export VARIABLE-NAME

显示环境变量

显示环境变量与显示本地变量一样,用echo命令即可。

使用env命令可以查看所有的环境变量。

清除环境变量

使用unset命令清除环境变量


反引号 `` 和$()

反引号``和$()的相同之处是都可用于命令替换,就是将括起来的命令执行完毕后再交给相应的对象或者输出:

这里要注意区分$()和$(()),前者的内容只能是命令,后者用于算术运算;


但是他们是有区别的奥:

看一个例子:

  • 反引号齐本身就对\进行了转义,保留了齐本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示。

    所以我们可以简单的想象成反引号中: \\ = \

  • $()中则不需要考虑\的问题,与我们平常使用的一样: \ = \

"\\" = " "

"\\\\"(4) "\\\\\\"(6) = "\"

"\\\\\\\\"(8) "\\\\\\\\\\"(10) = "\\"

对于$i而言。"\\\\\\$i" = \\\\ \\$i,所以是\$i

注意一下反引号对于\的转换就好。

eval命令

eval命令用于将其后跟着的参数命令内容进行必要的替换,然后再执行命令,也就是说,eval会对命令行进行两次扫描,第一次将其重新替换,第二次才真正执行命令;

可以将未转译的进行解释,

比如:

可以看到,使用eval就可以将应当进行的进行替换,然后就正式执行命令,

其实当我们看到这点eval,他是扫描,执行,那么久相当于C语言中的指针,先寻找指向,后进行指向内容的解释,所以在shell脚本中,无法支持的二维三维数组我们就可以利用eval命令进行实现了。

首先我们来看一下在shell命令行进行的一个eval模拟指针操作的

很明显的看到,我们将name赋值为Barry,然后我们想将$name,也就是Barry赋值为hello,但是他爆出了错误,然后我们使用eval命令。就可以看到我们的$name 被解释了,成为一个Barry的变量,然后我们进行赋值成功了,然后echo $Barry,成功的打印出了hello

既然理解了eval模拟指针操作的简单模式,那么我们可以尝试写一个shell下的二维数组

一个很简单的一个2维数组man[2][2]。

下面是运行结果:

单中括号[ ]和双中括号[[ ]]

双中括号[[ ]]:

[[ ]]同样可用于条件判断,但可以说是[ ]的加强版,因为在其内部的条件判断语句支持‘&&’、‘||’、‘>’和‘<’等C语言符号,

其实就是类C风格

单中括号[]:

  1. [ 用于条件测试,它并不是一个符号而是一个命令,用于判断后面条件的真假,并设置相应的退出码;和在C语言中的判断成立条件不同的是,使用[进行条件判断,如果为真则退出码为0,如果为假则退出码为1;而如果在[ ]的内部想要进行与、或的判断,就需要用到-a(与)、-o(或)来进行连接;或者2个[] $$ [] 或 [] || []
时间: 2024-10-12 00:52:25

shell脚本相关知识的相关文章

什么是Shell?Shell脚本基础知识详细介绍

这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. 它虽然不是Linux系统核心

shell脚本相关笔记

书写一个shell脚本并使之执行的步骤: 1. 打开一个文件,以 #! bin/bash作为开头 2.在文件中写入一些正确可执行的shell语句 3.保存文件 4.更改文件权限,执行文件 一些小技巧: 如果想在系统中添加自己的命令,比如执行自己建好的shell脚本语句这样一条命令 实例: 1.创建文件cd.sh 内容为: #! bin/bash cd xxx/yyy/zzz 2.保存文件 3.执行文件./cd.sh 现在发现并没有能够打开我们想要打开的目录并进去. 原因是shell还有分父she

linux操作系统-vim和shell脚本常用知识总结

HOST=$(/bin/hostname)将()里的命令执行后的结果赋值给HOST变量 #------------------------------------------------^M /etc/rc.d/  level3的用户login后, 将自动启动一个指定的shell  # ---------------------------------------------  $?  对上一次命令执行成功与否成功$?为0  判断文件是否存在且是否为文件 [ -f file ] 判断文件是否存在

shell脚本基础知识(下)

七.shell中的case判断 格式: case  变量名 in value1) command ;; value2) command ;; *) commond ;; esac 在case程序中,可以在条件中使用|,表示或的意思, 比如: 2|3) command ;; 当变量为2或者3时,执行该部分命令. 应用举例: [ [email protected]  shell]# cat test7.sh  #!/bin/bash read -p "请输入学生的成绩: " num n1=

shell脚本相关问题

shell:解释执行用户输入命令,逐行解释,也可以批处理很多指令,可将这些指令全部编写到一个脚本文件中,让shell一次执行多条命令,常用的shell(bash,它承担shell这个角色,为shell脚本解释器,为一个可执行的二进制文件) shell的执行过程: 用户在命令行输入命令后,一般情况下Shell会fork子进程并调用exec进行程序替换,让它的孙进程执行该命令,但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程.如cd.export.um

Linux学习笔记:bash颜色显示及shell脚本相关

bash的颜色显示规则: ASCII编码对于颜色进行设置: \033 :ctrl键 [:控制字符和颜色代码之间的间隔字符 0m:关闭颜色属性的命令: 1m:对于显示文本字符加粗 4m:为文本字符加下划线标识 5m:使文本字符闪烁 7m:将文本字符的背景色和前景色交换显示: 8m:将文本字符的背景色和前景色设置为相同颜色. 30m-39m:设置文本字符的前景色:38m和39m暂时没用 40m-49m:设置文本字符的背景色:48m和49m暂时没用 一个完整的程序,一般包含四类文件: 二进制文件(可执

shell脚本基础知识

一.什么是shell 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了.打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些.回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作. 试验环境为linux发布版本(Redhat/CentOS)

shell 脚本基础知识详细介绍(二)

SimonSu 博客 评论墙 读者墙 链接 关于 linux中的sh脚本语法 玩linux都知道sh脚本的方便,但如何编写sh脚本却是像我这样的新手和菜鸟的难题.能不能编写得出来是一回事,了不了解又是另一回事.抱着好好学习,天天向上的精神,大家有空就看看吧,没有坏处的.下面来抄来一大段sh脚本的语法说明.慢慢看: 一.开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序.当编写脚

LINUX shell脚本相关

调试脚本 测试脚本语法:bash -n file.sh 查看脚本每一步执行情况:bash -x file.sh 位置变量:$1,$2,... 特殊变量: %?:最后一个命令的执行状态 $#: 参数个数 $ shell中如何进行算术运算: A=3 B=6 1.let 算术运算表达式 let C=$A+$B 2.$[算术运算表达式] C=$[$A+$B] 3.$((算术运算表达式)) C=$(($A+$B)) 4.expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用 C