Shell脚本学习

Shell

Shell是一个用C语言编写的程序,它是用户和Linux内核交流的桥梁,我们把它称之为命令解释器。Bash是Shell中的一种,下面所学的就是Bash的基本符号和语法。Shell有三大特点:1.弱类型,2.解释非编译型,3交互模式:交互式和批处理式,Shell脚本文件名以.sh结尾,并且在文本的第一行#!开头,/bin/bash告诉操作系统那一个shell执行。在执行的时候,给文件加上x可执行权限,或者将这个文件作为命令行参数传给bash。
Shell的运行原理:

  1. 在运行Shell脚本的时候,父Shell会首先fork出一个子进程,然后exec替换这个进程的代码段。但是脚本是个文件,根本没有代码段和数据段,其实exec提供了这样一个机制,如果替换的一个文本文件,并且开头以#!指定了解释器,那么就会用解释器的代码段进行替换当前进程。并且从解释器_start处开始执行,而这个文本被当作命令行参数传递给解释器。
  2. 子Shell一行一行的读取文本内容,进行执行。父Bash等待子Bash退出。
  3. 对于一些内置的命令,比如cd,这样的内置命令,不一定非要fork子进程执行,由父Bash亲自执行。

Shell变量

Shell变量定义直接使用变量名加上=,注意变量名和=之间不能有空格,并且变量没有数据类型,会被统一当成字符串处理。使用一个变量只需要在变量名前面加上 符 号 就 可 以 。 也 可 以 {vir}。
一个变量也可以用readonly修饰为只读变量。用unset删除一个变量。
一个Shell中定义的变量叫做本地变量,只会在当前Shell进程中有用。环境变量是具有全局性。所有进程都可以访问到。
在进行字符串拼接的时候,理论上只需要将字符串写在一起就好了,但是需要注意取变量值的时候的问题。
{#str}获取字符串的长度 {#str}获取字符串的长度 {str:1:4}从1开始,截取4个字符。


通配符

*:匹配0个或者多字符
?:匹配一个任意字符
[]:匹配括号中任意字符的一次出现


命令代换和算数代换

由··反引号括起来的也是命令,Shell先执行改命令,然后将输出结果立马代换到当前命令中。当然命令代换也可以用$()完成。(())中执行的是算数代换,类C风格。
在Shell中双引号和单引号都是字符串的分隔符,但是单引号仅仅取字符串的字面值,而”“括起来的可以进行命令替换。和去变量的值。


Shell语法

Shell中测试条件是否成立是通过命令来实现的,最常见的就是Test和[,通过查看命令的退出码,然后决定条件是否成立。切记,Shell认为退出码为0表示成立,而非0是错误。
进行整数测试:-eq 相等 -ne 不相等 -le 小于等于 -gt 大于等于 -lt 小于 -gt 大于
进行字符串测试:== != -z -n
进行文件测试: -f -d -c -b -p:
注意:在进行两个字符串的比较时候,我们建议要在两边都加上X,以防一边输入为空,那么就会报错。
当然多个条件也可以进行逻辑或,与,非 。分用用 -o -a !进行多个条件的连接。
分支结构:
if[];then
elseif[];then
else
fi
循环结构:
1.while []
do
done
2.for(())
do
done
这是一种类C循环
3.for in {}
do
done
循环 这种循环的特殊地方是可以进行字符的遍历等。
注意 Shell脚本中不能有空语句,:也是一条命令,表示恒成立。


位置参数和特殊变量

0Cargv[0], 0 相 当 于 C 语 言 中 的 a r g v [ 0 ] , 像 1, 2 2 这 样 的 称 之 为 位 置 参 数 。 #相当于命令行参数-1,就是除去第一个文件名的参数之外还剩下的参数个数。
@ @ 就 是 所 有 命 令 行 参 数 的 列 表 ?就是上一条指令的退出码
$$是当前Shell的进程号
shift命令可以实现命令行参数的左移,不指定时候,左移一位。


Shell中的函数

Shell中也有函数,不过Shell中的函数没有返回值,也没有参数列表。
函数在定义的时候就像定义变量一样,在以后的调用中直接写上函数名称即可。
关于函数的传参,我们可以把函数看成是迷你版的Shell脚本,如何给脚本传参,就如何给函数传参。

你可能感兴趣的:(Linux)