Shell Script基础-Bash变量和逻辑运行

1. 常用命令

1.1 hash

说明:linux系统下会有一个hash表,当你刚开机时这个hash表为空,每当你执行过一条命令时,hash表会记录下这条命令的路径,就相当于缓存一样。第一次执行命令shell解释器默认的会从PATH路径下寻找该命令的路径,当你第二次使用该命令时,shell解释器首先会查看hash表,没有该命令才会去PATH路径下寻找。

常用:
(1)hash -d command 清除某一条命令。

(2)hash -r 清空hash表。

  hash一般不会清空或者删除,除非命令的执行路径发生变化,此时需要把缓存记录的命令路径清除,否则会出现错误。

1.2 type

查询命令是否为Bash shell的内置命令.
type [-tpa] Command
-t :当加入-t参数是, type会显示出Command是外部命令还是bash内置命令:
  file : 表示为外部命令;
  alias: 表示该命令为命令别名所设置的命令功能;
  builtin: 表示该命令为bash内置的命令功能。
“-p”: 如果后面接的command为外部命令时,才会显示完整文件名
“-a” 会由PATH变量定义的路径中,将所有含command的命令都显示出来,包含alias。

[root@gzr ~]# type ls
ls is aliased to `ls --color=auto' [root@gzr ~]# type -t ls alias [root@gzr ~]# type -a ls ls is aliased to `ls --color=auto'
ls is /usr/bin/ls   # 指出命令路径
[root@gzr ~]# type cd
cd is a shell builtin  #内置的cd命令

1.3 history

history命令:用于显示历史记录和执行过的指令命令history命令读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2

history命令:是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量 HISTSIZE进行控制。默认是不显示命令的执行时间,命令的执行时间,history 已经记录,只是没有显示。

:如想查询某个用户在系统上执行了什么命令,可以使用root用户身份登录系统,检查Home目录下的用户主目录下的“.bash_history”文件,该文件记录了用户所使用的命令和历史信息。

-N: 显示历史记录中最近的N个记录;
-c:清空当前历史命令;
-a:将历史命令缓冲区中命令写入历史命令文件中;
-r:将历史命令文件中的命令读入当前历史命令缓冲区;
-w:将当前历史命令缓冲区命令写入历史命令文件中;
-d<offset>:删除历史记录中第offset个命令
-n<filename>:读取指定文件
[root@gzr ~]# history 5
  385  type cd
  386  type -t ls
  387  type -a ls
  388  type cd
  389  history 5
[root@gzr ~]# !385 #执行第385条历史命令
type cd
cd is a shell builtin
# 当我们以bash登录Linux主机后,系统会主动地由家目录的~/.bash_profile读取之前执行过的命令,并根据HISTFILESIZE的值记录历史相应的历史命令条数。
[root@gzr ~]# !! # 执行上一条命令(常用)
type cd
cd is a shell builtin

2. bash的特性之变量

程序 = 指令+数据 或者 算法+数据结构
变量类型: 指明了变量的存储格式,表示数据的范围,参与的运算。

(1)本地变量

作用域仅为当前shell进程。
变量赋值:name = value
变量引用:$name 或者 ${name}
" ":变量名会替换其值
‘’:变量名不会替换为其值
查看变量名:set
撤销变量:unset name 记住不要加{}

(2)环境变量

作用域仅为当前shell进程及其子进程。
变量赋值:两种方式
1)export name = value
2) name = value export name
3)declare -x name = value 声明变量的类型。
4)name = value declare -x name
变量引用 <math> <semantics> <mrow> <mrow> <mi> n </mi> <mi> a </mi> <mi> m </mi> <mi> e </mi> </mrow> <mi mathvariant="normal"> 或 </mi> <mi mathvariant="normal"> 者 </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> {name} 或者 </annotation> </semantics> </math>namename

注意:bash内嵌了许多环境变量(通常为全大写),用于定义bash的工作环境
PATH,HISTFILE,HISTSIZE, HISTFILESIZE, HISTCONTROL, SHELL, HOME, UID, PWD, OLDPWD等等。

查看变量
1)export命令
2) declare -x
3) printenv
4) env
撤销环境变量:
unset name

只读变量: 无法重新赋值,并且不支持撤销,存活时间为当前shell进程的生命周期,随shell进程终止而终止。
1)declare -r name 不准修改
2)readonly name

(3)局部变量

作用域仅为某代码片段(函数上下文 )
前三种根据作用范围来划分。或者所谓“作用域”

(4)位置参数变量

当执行脚本的shell进程传递的参数。

(5)特殊变量

shell内置的有特殊功能的变量。比如$?
常用命令:echo $?
返回值: 0 表示成功 1-255 表示各种错误。

编程语言分类:
强类型变量:如C、C++等,需要严格声明变量类型
弱类型变量:如Shell把所有变量都视作字符串。
变量命名规范:只能包含数字,字母和下划线,并且不能以数字开头。一般做到“见名知义”并且命名机制遵循某种法则。同时不能使用保留字。

3. bash特性之多命令执行:

(1) command1; command2; command2; 可以以分号隔开
逻辑运算
运算数:真(ture, yes, on, 1) 假(false, no, off, 0)
与:&& 称作“短路运算”
或:||
id user1 || useradd user1 如果user不存在则创建,如果存在则显示其id号。
非:!
异或:

4. shell,kernel, hardware的关系


硬件:由CPU、内存、硬盘、磁盘阵列卡、输入/输出设备等物理设备共同组成
linux内核:主要负责驱动硬件(加载驱动)、管理活动(进程管理)和分配/管理硬件资源(内存管理)以及文件目录管理工作。
Shell: Shell称之为“”,是linux操作员和内核人机交互的一个界面。
Shell在不同的时期及其发展过程中衍生出了很多种,如下:

(1)sh(全称Bourne Shell),是UNIX最初使用的shell
bash(全称Bourne Again Shell),它是Bourne Shell的扩展,当前为linux默认的shell
(2)csh(全称C Shell),是一种比Bourne Shell更适合的变种Shell,它的语法与C语言很相似。
(3)ksh(全称Korn shell),是一种使用在Unix中的shell。它完全向上兼容Bourne shell并包含了C shell的很多特性,Tcsh是Linux提供的C Shell的一个扩展版本。
(4)pdksh,是Linux系统提供的ksh的扩展。

5. shell脚本编程

5.1 编程语言分类:

(1)根据运行方式
编译运行: 源代码—>编译器(编译) ---->程序文件。
解释运行: 源代码---->运行时启动解释器,由解释器边解释边运行;
(2)根据其编程过程中功能的是实现是调用库还是调用外部的程序文件
shell脚本编程:利用系统上的命令及编程组件进程编程。
完整编程:利用库或者编程组件进行编程。
(3)根据编程模型
过程式编程语言:以指令为中心来组织代码,数据时服务于代码;
指令从上到下,顺序执行,选择执行,循环执行。
如 C,Shell
面向对象的编程语言:以数据为中心来组织代码,围绕数据来组织指令;
编写很多类(class):实例化为对象,方法.
如 java, C++, Python

shell脚本编程特性

(1)过程式
(2)解释运行
(3)依赖于外部程序文件运行

5.2 shell脚本格式

(1)脚本文件第一行

顶格,给出shebang, 解释器路径,用于指明解释执行当前脚本的解释程序文件
常见的解释器
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
常见的文本编辑器
行编辑器:sed
全屏幕编辑器:nano, vi, vim

(2)shell脚本是什么?

脚本的堆积;
但很多命令不具有幂等性,需要用程序逻辑判断运行条件是否满足,

#!/bin/bash
id user1 || useradd user1
echo "user1" | passwd --stdin user1
mktemp -d /tmp/test.xxx

(3) 如何运行脚本

(1)赋予执行权限,并直接运行此程序文件
chmod +x /PATH/TO/SCRIPT_FILE
/PATH/TO/SCRIPT_FILE
(2)直接运行解释器,将脚本以命令行参数传递给解释器程序。
bash /PATH/TO/SCRIPT_FILE
如脚本:满足一下要求:
1)显示/etc/目录下所有以大写p或小写p开头的文件或者目录本身
ls -d /etc/[pP]*
2)显示/var目录下的所有文件或者目录本身,并将显示结果中的小写字母转换为大写后显示
ls -d /var/* | tr ‘a-z’ ‘A-Z’
3)创建临时文件/tmp/myfile.XXX;
mktemp /tmp/myfile.XXX

#!/bin/bash
echo "Show some under /etc"
ls -d /etc/[pP]*
echo "Translate lower to upper"
ls -d /var/* | tr 'a-z' 'A-Z'
echo "Create a temp file"
mktemp  /tmp/myfile.XXXX

注意
脚本中的空白行会被解释器会被忽略,
脚本中除了shebang,余下的以“#”开头都作为注释行
shell脚本的运行是通过运行一个子shell进程实现的。

5.3 bash的配置文件

(1)大致分为两类:

(1)profile类
为交互式登录的shell提供的配置。
1)全局配置:对所有用户都生效
/etc/profile
/etc/profile.d/*.sh
2)用户个人:仅对当前用户生效
~/.bash_profile
(2)bashrc类
为非交互式的登录shell进程提供配置。
全局:
/etc/bashrc
用户个人:
~/.bashrc
功用:
1)定义本地变量
2)定义命令别名

注意: 仅管理员可修改全局配置文件。

(2)配置文件读取次序

(1)交互式登录shell进程:
/etc/profile/ —> /etc/profile.d/* ----> ~/.bash_profile —>~/.bashrc —>/etc/bashrc

(2)非交换式登录shell进程:
~/.bashrc —>/etc/bashrc —> /etc/profile.d/*

注意:命令行中定义的特性,例如变量和别名作用域为当前shell进程的生命周期;配置文件定义的特性,只对随后新启动的shell进程有效。
让通过配置文件的特性立即生效:
(1)通过命令行重复定义一次;
(2)让shell进程重读配置文件
source /PATH/FORM/CONF_FILE
. /PATH/FORM/CONF_FILE
例如:vim /etc/profile.d/welcome.sh

(3)登录类型:

(1)交互式登录shell进程:login-shell
直接通过某终端输入账号和密码登录打开的shell进程,或者说:取得bash时需要完整的登录流程。例如:由tty1-tty6登录时,切换时,都需要输入用户的账号和密码,此时取得的bash就称为“login shelll”
使用su命令:su -USERNAME, 或者su -l USERNAME执行的登录切换;

(2)非交互式登录shell进程:non-login shell
取得bash的方法不需要重复登录的操作,比如用户以X window登录Linux后,再以X的图形化接口启动终端,此时这个终端接口并没有需要再次输入账号和密码,该bash的环境就称为“non-login shell”
1)su USERNAME执行的登录切换;
2)图形界面下打开的终端;
3)运行脚本
(实际上是在父shell中启动一个子shell)

5.4 终端的环境设置:stty, set

stty

[root@gzr ~]# stty -a
speed 38400 baud; rows 59; columns 118; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

可以利用stty -a 来列出目前环境中所有的按键列表,在上述列表中 “^” 表示ctrl按键。
比如:
intr: 发送一个interrupt(中断)的信号给目前正在run的程序(就是终止);
quit: 发送一个quit的信号给目前正在run的程序;
erase:向后删除字符;
kill: 删除在目前命令行上的所有文字;
eof: End fo file的意思,代表【结束输入】;
start: 在某个程序停止后,重新启动它的output;
stop: 停止目前屏幕输出;
susp: 送出一个terminal stop 的信号正在运行的程序。

常用操作:
ctrl +c终止应用程序;ctrl + ? 删除字符;Ctrl + U 删除命令行上所有字符;
ctrl + q 恢复屏幕输出;ctrl + s 暂停目前屏幕输出。

set,env,export

set: 用set 命令可以设置各种shell选项或者列 出shell变量.单个选项设置常用的特性.在某些选项之后-o参数将特殊特性打开.在某些选项之后使用+o参数将关闭某些特性,不带任何参数的set命 令将显示shell的全部变量.除非遇到非法的选项,否则set总是返回ture

set 用来显示本地变量
env 用来显示环境变量
export 用来显示和设置环境变量
set 显示当前shell的变量,包括当前用户的变量
env 显示当前用户的变量
export 显示当前导出成用户变量的shell变量

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务