您的位置:首页 > 运维架构 > Shell

shell总结

2015-09-20 19:13 661 查看
守护进程:运行在后台的进程,称之为守护进程也叫服务进程(提供某种特定的服务),多数会被设置为开机时自动启动;

交互式进程:与用户有交互方能实现功能的,shell应用程序

GUI:图形化的交互进程

CLI:命令形式交互进程
COMMAND
shell程序会进行词法分析区分哪些字符串是命令,哪些字符串是选项,哪些字符 串是参数

shell程序内建一部分命令(shell内建命令)

shell程序也能调用外部命令,外部命令的二进制源码存放在环境变量PATH指 定的路径中(外部命令)
fork()
shell为每一个要执行的命令创建为一个子进程;

脚本或程序源文件:把要运行的一系列命令,写在文件中;
两种方式:

编译执行:预处理-->编译-->汇编-->链接;必须事先完成整个文本文件内容的语言转换为 二进制,处理后得到二进制程序文件提交给cpu执行

C, C++

解释执行:由解释器全程参与运行过程,每次读取一行并解释一行获得二进制,将结果提 交给cpu运行;
Python:编程库

程序控制结构,调用编程库完成程序编写;

可以调用库文件:功能模块,在编程中可调用;通过其API;
Bash:编程

程序控制结构,调用机器上命令程序文件进行程序编写;
调用外部命令:各应用程序提供;

bash过程式编程:
顺序执行:逐个执行文本文件中的命令

选择执行:只执行其中符合选择条件的一个分支
循环执行:一段代码要执行0,1或多遍
变量:一个命名了的内存空间,变量名可以理解为某内存空间的地址门牌号。通过 $变量名
可以获 得该变量代表的内存空间中所存放的值

bash环境中有如下几种变量:

本地变量:只在当前shell进程中生效的变量;
环境变量:在当前shell进程及其子进程生效的变量;

局部变量:某个函数执行过程中,该函数外无效;

位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;
特殊变量:$?:上一条命令的执行状态结果

$*:统计传递给脚本文件的参数列表

$@:统计传递给脚本文件的参数列表
$#:统计传递给脚本文件的参数数量

$$:表示当前进程的编号

变量类型:该变量所代表的内存空间所存放的值类型
数值,字符;

数值:
整数
浮点数

字符:
ASCII
120:
字符:1, 2,
0-->一个1代表一个字符用一个字节表示0000 0001
数值:120 -->
一个字节便能表示数值120,1111 1000
变量类型的作用:
存储空间:声明变量类型有利于节省存储空间的节省

运算:声明变量类型为数值型才能进行变量运算

存储格式:声明变量确定变量是以字符还是数值存储
语言对变量类型的支持力度:
强类型:严格区分变量类型,必须事先声明

弱类型:变量类型不严格区分;
bash默认存储机制:存储为字符
bash的变量使用特点:弱类型、无须事先声明;

凡是自定义的变量尽量小写 避开系统自身的变量名

本地变量:
name=value

name: 变量名
=:赋值符号

value:值
变量名:只能包含数字、字母和下划线;且不能以数字开头;
引用变量:$name
${name}(用在变量内容后面加字符修饰)例如 :name=dog 想表示dogs时 引用${name}s
引用:
弱引用: "", 其内部的变量引用会被替换为变量值;

强引用:'',其内部的变量引用会保持原有字符;

命令引用:`COMMAND`, $(COMMAND),引用命令的执行结果;

示例

[root@pks ~]# s1=dog                    ##设定本地变量s1
[root@pks ~]# echo "$s1"                ##使用弱引用“”变量,替换成变量值
dog
[root@pks ~]# echo '$s1'                ##使用强引用‘’变量,保留变量名称的字符
$s1
[root@pks ~]# echo $(ls /mnt)            ##使用命令替换 取得命令的执行结果
a centos
gcc-4.8.3-9.el7.x86_64.rpm gcc5-5.1.1+r225724-1.1.x86_64.rpm grub.conf host.conf
hosts hosts-test k p prelink.cache prelink.conf y
[root@pks ~]# echo "${s1}s"                ##为变量值后跟字符使用${变量}
dogs
声明为整型:
declare -i name[=value]

let name=value

声明整数类型和在没有声明整数类型的情况下其结果一样,这是因为bash为弱类型、 无须事先声明,在使用变量进行运算的时候会进行隐式转行。

查看所有当前的本地变量:set
生命周期:
创建:从变量赋值开始
销毁:

自动销毁:shell进程终止;
手动销毁:unset name

[root@pks ~]# unset s1
[root@pks ~]# echo "$s1"
[root@pks ~]#

环境变量:

用”导出“的方式使本地变量升级为环境变量
export name[=value]

declare -x name[=value]

[root@pks ~]# s1=dog
[root@pks ~]# echo "$s1"
dog
[root@pks ~]# bash                      ##开一个子bash进程
[root@pks ~]# echo "$s1"                ##在子bash进程查无s1变量
[root@pks ~]# exit                        ##退出bash子进程
[root@pks ~]# export s1                    ##在当前进程中声明s1为环境变量
[root@pks ~]# bash
[root@pks ~]# echo "$s1"                ##在子bash进程查有s1变量,其值也为dog            dog


查看所有环境变量:env, printenv, export

生命周期:
创建:从变量赋值开始
销毁:unset
name

脚本:文本文件
运行脚本:事实上是创建一个bash子进程,此进程负责从脚本文件中读取一个执行逻辑,而后由 bash进程负责解析并运行此逻辑;
启动脚本:
(1) # bash /PATH/TO/SCRIPT_FILE

(2) 给予脚本文件执行权限,使用如下命令
#
./PATH/TO/SCRIPT_FILE
脚本文件的开头shebang:

#!/bin/bash,指明解释器的路径
第一行:顶格给出shebang
注释行:#为注释所用不会被bash进程解析该段字符
bash的常用选项:
-n: 检查脚本中的语法错误;

-x:调试执行脚本;(会将执行过程一步步显示出来,便于逻辑调试)

命令状态结果:
bash进程使用特殊变量#?用于追踪执行的命令成功与否的状态:

0: 成功
1-255:失败
布尔型:
“真”:成功

“假”:失败
可以自定义脚本的执行状态状态结果:
exit

注意:脚本中任何位置执行了exit命令即会终止当前shell进程,如果有自定义的执行状态 值并将该值提交给特殊变量;

特殊设备:
/dev/null: 空,bit
buckets,吞下所有数据,并直接丢弃;
取命令执行结果状态而不需要命令的执行结果时,可以输出重定向&> /dev/null
/dev/zero:吐出一堆0;

脚本参数(位置参数变量):
# ./script.sh
/etc/fstab /etc/grub2.cfg
$0(脚本本身)

$1(脚本的第一个参数 /etc/fstab )
$2(脚本的第一个参数
/etc/grub2.cfg)
位置参数变量:$1, $2, ...

${10},双位数以上的变量引用时需用{}包裹数值
[root@pks var]# cat cat.sh
#!/bin/bash
#
cat $1
echo "----------"
cat $2
[root@pks var]# ./cat.sh /etc/fstab /etc/host.conf
#
# /etc/fstab
# Created by anaconda on Wed Aug 19 21:28:16 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=f745eac2-6b4c-48e8-bae5-aa43cd3d313a /                       ext4    defaults        1 1
UUID=baaa7f26-f28c-4db8-91fd-10c0d14ea07d /boot                   ext4    defaults        1 2
UUID=6becb873-32d7-4c9a-bfb8-838f021ca0e3 swap                    swap    defaults        0 0
/dev/sdb2                                 /mydata                 ext4    defaults        1 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
----------
multi on
特殊变量:
$?: 命令的执行状态结果;

$#: 传递给脚本或函数的参数的个数;
$*和$@:
引用传递给脚本或函数的参数列表;
shift
:代表一次轮替掉n个参数,(默认轮替掉一个参数)
例如$1是a,$2是b,$3为c
shift后$1为b ,shift 2后$1为c
[root@pks var]# cat cat1.sh
#!/bin/bash
#
echo "$#"
echo "----------"
echo "$*"
echo "----------"
echo "$@"
echo "----------"
echo "$1"
shift
echo "----------"
echo "$1"
[root@pks var]# chmod +x cat1.sh
[root@pks var]# bash cat1.sh /etc/fstab /etc/host.conf
2                    ##echo "$#"
----------
/etc/fstab /etc/host.conf    ##echo "$*"
----------
/etc/fstab /etc/host.conf    ##echo "$@"
----------
/etc/fstab                   ##echo "$1"
----------
/etc/host.conf                ## shift 之后第一个变量被替换


与用户交互:接受用户输入参数
read命令:

read [options] VAR...
-p "PROMPT" (用于做说明提示)

-t timeout (说明如果多长时间没输入将会结束脚本)

当输入超过参数数量时,按空格依次赋值参数,之后输入所剩的部分全赋值给最后一个参数

当参数数量多余输入时,按空格依次赋值参数,没有被赋值的变量值为空

[root@pks var]# read f1 f2
hou are you
[root@pks var]# echo "$f1"
hou
[root@pks var]# echo "$f2"
are you
[root@pks var]# read f1 f2 f3
hello you
[root@pks var]# echo "$f1"
hello
[root@pks var]# echo "$f2"
you
[root@pks var]# echo "$f3"
[root@pks var]#


命令引用:
`COMMAND`, $(COMMAND)
引用命令的执行结果;
(1) ls `which cat`
(2) lines=$(wc -l /etc/fstab | cut -d'
' -f1)

算术运算:
+, -, *, /, %, **

(1) $[$A+$B]

(2) $(($A+$B))
(3) let VARIABLE=$A+$B
(4)
VARIABLE=$(expr $A + $B)
[root@pks var]# A=5
[root@pks var]# B=7
[root@pks var]# C=$[$A+$B]
[root@pks var]# echo "$C"
12
[root@pks var]# D=$(($A+$B))
[root@pks var]# echo "$D"
12
[root@pks var]# let E=$A+$B
[root@pks var]# echo "$E"
12
[root@pks var]# F=$(expr $A+$B)
[root@pks var]# echo "$F"
5+7
[root@pks var]# F=$(expr $A + $B)         ##加号之间必须有空格
[root@pks var]# echo "$F"
12

增强型赋值:
+=

let sum+=$i相当于sum=$[$sum+$i]

-=, *=, /=, %=等用法和+=是一样的
let count=$[$count+1] --> let count+=1 --> let count++

let count=$[$count-1] --> let count-=1 --> let count--
示例:显示/etc目录下所有普通文件列表,而后统计一共有多少个文件;
#!/bin/bash
#
declare -i
count=0 ##定义计数器 整型变量count
for file in /etc/*; do ##使用通配方法生产/etc文件目录下的文件列表
if [ -f $file ];
then
let
count++ ##当是普通文件时计数器变量count自己+1

echo "$count $file"
fi
done
echo "Total: $count files."

测试表达式:
整数测试:-gt, -lt, -ge, -le, -eq, -ne

字符串测试:==, >, <, !=, -z, -n, =~
注意:
(1) 字符串等值比较测试:[ "$hostname" == 'localhost' ]
(2) 模式匹配测试:[[
"STRING" =~ PATTERN ]]
[root@pks var]# str1=hello
[root@pks var]# [ "$str1" == 'hello' ]
[root@pks var]# echo "$?"
0
[root@pks var]# [[ "$str1" =~ hel* ]]
[root@pks var]# echo "$?"
0
[root@pks var]# [ "$str1" != 'hel' ]
[root@pks var]# echo "$?"
0
[root@pks var]# [ "$str1" = 'hel' ]
[root@pks var]# echo "$?"
1
[root@pks var]#
组合测试条件:
条件间逻辑运算:
与:多个条件要同时满足;

或:多个条件满足其一即可;
非:对指定的条件取反;
表达式组合:
与:` CONDITION1 -a CONDITION2 `

或:` CONDITION1 -o CONDITION2 `
非:[ !
CONDITION ]
命令组合:
与:COMMAND1 && COMMAND2 <--
[ EXPR1 ] && [ EXPR2 ]
或:COMMAND1 || COMMAND2

非:! COMMAND
短路操作符:&&
false &&
true = false
false && false = false
true && false = false

true && true = true

COMMAND1 && COMMAND2 只有当COMMAND1成立时,才会执行COMMAND2;效果等同下 面的if
if COMMAND1; then
COMMAND2

fi
短路操作符:||
true || true = true

true || false = true
false || true = true
false ||
false = false

COMMAND1
&& COMMAND2 只有当COMMAND1不成立时,才会执行COMMAND2;效果等同 下面的if

if ! COMMAND1; then
COMMAND2
fi
COMMAND1 && COMMAND2 || COMMAND3
只有当COMMAND1成立时,才会执行COMMAND2; 如果COMMADN1不成立则是COMMAND1 &&
COMMAND2整个不成立,便会执行command3
效果等同下面的if

if COMMAND1; then
COMMAND2

else
COMMAND3
fi

注意:&&的级别高于||

函数:
function: 功能

把一段具有独立功能代码封装在一起,并给予命名;后续用到时,可直接通过给定函数名来调用整体代码;
函数作用:
代码重用;
模块化编程;将一段代码放在其他文件中,运行脚本文件时可以读入那其他文件中的 代码
函数的使用方法:
先定义:编写函数代码

后调用:给出函数名,还可按需传递参数
定义方法:
(1) function f_name {

函数体
}
(2) f_name() {
函数体

}
调用函数:
f_name [argu1, argu2, ...]
自定义函数状态返回值:
return [#]
0: 成功

1-255:失败
注意:函数代码执行时,一旦遇到return,函数代码终止运行,函数返回;

模块化编程
功能:把脚本文件中的代码分隔为多段,放在不同的文件中

假设/root/bin/srv目录有两个文件:
(1) 函数文件
(2)
脚本文件
为脚本使用配置文件
一个文件中只定义变量

脚本文件source此变量定义的文件
变量的作用域:
局部变量:
local
VARIABLE=value
存活时间:
函数执行开始,至函数返回结束;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell编程