Shell脚本编程知识点

shell编程:提供了编程能力,被称作脚本编程,将一种语言翻译成另一个语言编程语言:机器语言(0、1代码)、汇编语言(人类可识别的语言)、高级语言(接近人类语言)

1、静态语言:编译型语言,这种语言有一个开发环境,不需要借助于额外的二进制程序,可以直接写代码,写完代码后,利用编译器将其直接转换成二进制以后,可以独立运行。强类型语言(变量),c、c++、java、c# 关键字:最后能够被我们的解释器或编译器直接转换成能够被机器识别的机器代码或控制指令。转换完成后才运行。事先转换成可执行格式。

2、动态语言:解释型语言,通常是弱类型语言,边解释边执行asp、asp.net、PHP、SHELL、PYthon、perl运行bash脚本时,本身应该有bash。面向对象:就是把整个我们要实现的项目抽象成一个一个的对象,并且定义对象之间的动作,就是可发生的操作来完成的,更适合开发大应用程序:JAVA 、PYthon 、Perl 、c++。面向过程:就是把编程立足点主要在于问题解决过程本身:shell、c

3、为使shell编程更有效,系统提供了一些shell变量。shell变量可以保存诸如路径名、文件名或者一个数字这样的变量名。shell将其中任何设置都看做文本字符串。变量:按照定义来说,变量是存储设备中的一些可读写的存储单元.变量可以定制用户本身的工作环境。使用变量可以保存有用信息,使系统获知用户相关设置。变量也用于保存暂时信息;内存:是编址的存储单元;变量类型:事先确定数据的存储格式和长度

shell:弱类型编程语言,下面介绍一下什么是强类型语言和弱类型语言

强类型:变量在使用之前,必须事先声明,甚至还需要初始化null;数值初始化为空

弱类型:变量用时声明,甚至不区分类型;若不区分类型,一般都默认为字符串。

变量赋值:VAR_NAME=VALUE

3、下面我们介绍一下bash变量类型:有两种变量,本地和环境。严格地说可以有4种,但其余两种是只读的,可以认为是特殊变量,它用于向shell脚本传递参数。

3.1、 环境变量:用于所有用户进程(经常称为子进程)。登录进程称为父进程。s h e l l中执行的用户进程均称为子进程。不像本地变量(只用于现在的s h e l l)环境变量可用于所有子进程,这包括编辑器、脚本和应用。环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在. profile文件中定义。系统管理员可能在/etc/profile文件中已经设置了一些环境变量。将之放入profile文件意味着每次登录时这些值 都将被初始化。传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用export命令导出。环境变量与本地变量设置方式相同。作用域为当前shell进程及其子进程 export VARNAME=VALUE”导出“,例如echo $PATH—》export PATH=$PATH:/usr/local/apache/bin

3.1.1 设置环境变量
VARIABLE-NAME=value;export VARIABLE-NAME
在两个命令之间是一个分号,也可以这样写:
VARIABLE-NAME=value
export VARIABLE-NAME
3.1.2 显示环境变量
显示环境变量与显示本地变量一样,用echo命令即可。
使用env命令可以查看所有的环境变量。
3.1.3 清除环境变量
使用unset命令清除环境变量
unset VARIABLE-NAME
脚本:命令的堆砌,按实际需要,结合命令流程控制机制,脚本在执行时会启动一个子shell进程: 命令行中启动的脚本会继承当前shell环境变量;系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境

3.2、本地变量:set VARNAME=VALUE:作用域为整个bash进程 (set一般省略);撤消变量:unset NAME。查看当前shell中变量:set 不带任何参数和选项;查看当前shell中的环境变量:printenv ,env ,export

3.3、局部变量:localVARNAME=VALUE:作用域为当前代码段

bash:变量是进程的变量,在父bash中生成的变量在子bash中不存在。引用变量:$ {name} ,括号有时可省略,如:anmail = pig   ;echo “there some ${animal}s"

3.4、位置变量:$1,$2........(使用到了shift:轮换)

3.5、特殊变量:(bash内置)系统变量保存某些特殊

$?:上一个命令的执行状态返回值: echo $?

$#: 参数的个数

$*:参数列表

$@:参数列表

4、引用变量或变量中的字符长度

如:A=start ——》判断A有多少个字符

echo ${#A} :引用变量名的长度(#号表示变量中所包含字符串的长度)

${#VARNAME}:就可以取字符串的长度

stty -F /dev/console size:可以查看物理终端一屏有多少行多少列

stty -F /dev/console size | awk '{print $2}' :可以取出一屏有多少列

也可以写成:A=`stty -F /dev/console size` ——》 echo ${A#* }

还可以写成:stty -F /dev/console size | cut –d’ ‘ -f2

知识点:echo ${A#* }:表示从左往右找,找到第一个以空格为分隔符的把左侧的去了

echo ${A##* }:从左往右找,找到最后一个空格,把前面的去了

这两种分隔符的不同之处就是第一个空格为分隔符和最后一空格为个分隔符

还有与之相反的: 如图所示

5、变量赋值

${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则展开为parameter的值

${parameter:+word}:如果parameter为空或未定义,不做任何操作,否则,则变量展开为“word”;

${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”;并将展开的值赋值给parameter的值

${parameter:offset}

${parameter:offset:length}:取子串,从offset处的后一个字符开始,取length长的子chuan

如图:取字符串长度

如图:取字符

6、如果函数变量与全局变量同名,就要用到局部变量:

local VAR_NAME

#!/bin/bash

a=1

test() {

a=$[3+4]

}

test

for I in `seq $a 10` ; do

echo $I

done

显示结果为:7,8,9,10

#!/bin/bash

a=1

test() {

a=$[3+4]

}

test

for I in `seq $a 10` ; do

echo $I

done

显示结果为:1,2,3,4,5,6,7,8,9,10

在这里只讲了部分shell知识点。

值得一看哦!