1、进程:
- shell应用程序的进程一般为交互式的,在广义上分为GUI和CLI
- GUI(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面,支持鼠标,桌面等外设,比较著名的windows、Android
- CLI(command-line interface,命令行界面)是指可在用户提示符下键入可执行指令的界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。
- CLI的词法一般由 命令,选项,参数组成,分为内建命令和外部命令
2、执行方式:
- 由于Linux的脚本或程序源文件一般为文本文件,所以在执行Linux脚本的时候一般分为两种方式:
- ①编译执行:预处理-->编译-->汇编-->链接-->二进制程序文件或可执行文件。代表有:C, C++
- ②解释执行:由解释器全程参与运行过程,每次读取一行,运行一行。代表有:Python和bash
- Python:一般有写好的编程库,用户通过写程序控制结构,调用编程库完成程序编写;
- 库文件:一般为功能模块,在编程中可直接调用也可以通过其API进行调用。
- Bash:需要从零开始编写,也是程序控制结构,但是需要调用机器上命令程序文件进行程序编 写;
- 外部命令:一般由各应用程序提供;
3、程序:一般为为达到某种用户的目的而编写的指令和数据或算法和数据的集合
- 根据侧重点不同可以分为过程式编程和对象式编程:
- 过程式编程:以指令为中心,设计算法,数据服务于算法;
- 对象式编程:以数据为中心,设计数据结构(类),程序服务于数据结构;
bash 根据不同情况可以将bash编程按执行类别分为三类: 顺序执行:逐个执行 选择执行:只执行其中一个分支 if...fi,if...elif...else...fi 循环执行:一段代码要执行0,1或多遍 while,if...elif...else...fi
bash的编程元素:变量、流程、函数
①变量:根据不同情况可以分为 本地变量、环境变量、局部变量、位置参数变量以及特殊变量(内置变量)
变量的命名规则:只能包含数字、字母和下划线;且不能以数字开头;
引用变量:${name}, $name
变量的引用:
弱引用: "", 其内部的变量引用会被替换为变量值;
强引用:‘‘,其变量的变量引用会保持原有字符;
命令引用:`COMMAND`, $(COMMAND),引用命令的执行结果;
声明为整型:
declare -i name=[value] -i:整型变量
let name=value
查看所有变量:set
销毁:
自动销毁:shell进程终止;
手动销毁:unset name
bash的变量使用特点:弱类型、无须事先声明;
本地变量:在用户现在的shell生命期的脚本中使用,只在用户当前shell生命期有意义。如果在shell 中启动另一个进程或退出,此值将无效。这个方法的优点就是用户不能对其他的shell或进 程设置此变量有效。
设置一本地变量,格式为:
$ variable-name=value 或 $ {variable-name=value}
variable-name:变量名
=:赋值符号
value:变量值
注意:等号两边可以有空格。如果取值包含空格,必须用双引号括起来。shell变量可以用大小写字母 ,使用变量时,如果用花括号将之括起来,可以防止shell误解变量值。(具体见内容一)
环境变量:被“导出”的本地变量,可以在所有的用户进程中使用。登录进程是父进程,shell进程是 子进程。父进程初始化环境变量,子进程就都可以使用了。
环境变量的配置文件
/etc/profile(作用于所有用户) or /home/user/.bash_profile(作用于user用户)
变量声明的命令:
export name=[value]
declare -x name[=value] -x:环境变量
查看所有环境变量:env, printenv, export
销毁:unset name (具体见内容二)
局部变量:被限定在创建它们的shell中。local函数可以用来创建局部变量,但仅限于函数内使用。 局部变量可以通过简单的赋予它一个值或一个变量名来设置,用declare内置函数来设置, 或者省略也可,某个函数执行过程;
declare 变量名=值
位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;参数相关数目传入脚本,此数目可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制;参数从第一个开始,在第九个结束;每个访问参数前要加$符号;第一个参数为0,表示预留保存实际脚本名字;无论脚本是否有参数,此值均可用.
$0:脚本名字。此变量包含地址,可以使用basename $0获得脚本名称。
$1:第一个参数
$2,$3,$4,$5,...一次类推。
特殊变量:$?, $*, [email protected], $#, $$,$-,$!
特定shell变量如下:
$# 传递到脚本的参数个数;
$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个;
$$ 脚本运行的当前进程ID号;
$! 后台运行的最后一个进程的进程ID号;
[email protected] 与$*相同,但是使用时加引号,并在引号中返回每个参数;
$- 显示shell使用的当前选项,与set命令功能相同;
$? 显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误;
[[email protected] ~]# echo $$ 31253 [[email protected] ~]# echo $- himBH [[email protected] ~]# echo $? 0
内容一: [[email protected] ~]# name=nicai #设定本地变量 [[email protected] ~]# echo $name #打印输出 nicai [[email protected] ~]# bash #进入下一级本地变量 [[email protected] ~]# echo $name [[email protected] ~]# exit exit [[email protected] ~]# echo $name nicai [[email protected] ~]# [[email protected] ~]# pstree systemd─┬─AliHids───9*[{AliHids}] ├─AliYunDun───8*[{AliYunDun}] ├─AliYunDunUpdate───6*[{AliYunDunUpdate}] ├─agetty ├─crond ├─dbus-daemon ├─gshelld───3*[{gshelld}] ├─iprdump ├─iprinit ├─iprupdate ├─lvmetad ├─nscd───7*[{nscd}] ├─ntpd ├─rsyslogd───2*[{rsyslogd}] ├─sshd───sshd───bash───pstree #有内容的本地变量 ├─systemd-journal ├─systemd-logind └─systemd-udevd [[email protected] ~]# bash [[email protected] ~]# pstree systemd─┬─AliHids───9*[{AliHids}] ├─AliYunDun───8*[{AliYunDun}] ├─AliYunDunUpdate───6*[{AliYunDunUpdate}] ├─agetty ├─crond ├─dbus-daemon ├─gshelld───3*[{gshelld}] ├─iprdump ├─iprinit ├─iprupdate ├─lvmetad ├─nscd───7*[{nscd}] ├─ntpd ├─rsyslogd───2*[{rsyslogd}] ├─sshd───sshd───bash───bash───pstree ├─systemd-journal ├─systemd-logind └─systemd-udevd [[email protected] ~]#
内容二: [[email protected] ~]# name=nicai #本地变量 [[email protected] ~]# echo $name nicai [[email protected] ~]# bash [[email protected] ~]# echo $name [[email protected] ~]# exit exit [[email protected] ~]# echo $name nicai [[email protected] ~]# export name[=aaa] -bash: export: `name[=aaa]‘: not a valid identifier [[email protected] ~]# export name=[aaa] #环境变量 [[email protected] ~]# echo $name [aaa] [[email protected] ~]# bash [[email protected] ~]# echo $name [aaa] [[email protected] ~]# [[email protected] ~]# env XDG_SESSION_ID=466 HOSTNAME=iZ28qzns9m4Z SHELL=/bin/bash TERM=xterm HISTSIZE=1000 SSH_CLIENT=61.182.229.120 60276 22 SSH_TTY=/dev/pts/0 USER=root name=[bbb] ... [[email protected] ~]# unset name [[email protected] ~]# echo $name [[email protected] ~]#