|
一、shell
1、shell是什么
在计算机语言中,shell是指一种命令行解释器,是为用户和操作系统之间通信提供的一种接口。
它接受来自用户输入的命令,并讲其转换为一系列的系统调用送到内核执行,并将结果输出给用户。
2、shell分为两大类
一类是图形界面shell(Graphical User Interface):
Gnome,KDE,Xface(嵌入式轻量级桌面系统)
另一类是命令行式shell(command Line Interface):
sh,bash,ksh,zsh,tcsh
查看系统使用的shell:
[root@Node3 ~]# cat /etc/shells #系统默认安装的shell
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
[root@Node3 ~]# echo $SHELL #当前使用的shell
/bin/bash
[root@Node3 ~]# bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
事实上,shell不只是一种解释器(在用户和系统间骑着桥梁的作用) ,还是一种编程工具,称为脚本语言。脚本语言又被称作解释型语言
3、shell的功能
当一台系统运行起来时,内核会被调入内存中运行,由内核执行所有底层的工作,它会将所有应用程序及用户的操作翻译成CPU的基本指令,并将其送至处理器。这些过程听起来非常复杂,而且实际上也确实是非常底层的和技术化的。为了对用户屏蔽这些复杂的技术细节,同时也为了保护内核不会因为用户直接操作而受到损害,有必要在内核之上创建一个层,该层就是一个‘壳’,这就是shell的由来。
4、解释和编译
计算机不能理解高级语言,只能理解机器语言,所有必须把高级语言翻译为机器码。而这种翻译的方式有2类:
编译:
编译器:源程序(文本文件)-->预处理-->编译-->汇编-->链接
编译型语言也被称为静态语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,如c,java
解释:
解释器:解释器可独立运行,解释器运行代码
词法分析
语法分析
语义分析
源程序(文本文件)-->解析器读取并执行
解释器也被称为动态语言: 是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型,如,python,bash,perl
编译和解释不同之处:
翻译的时间不同,编译型语言是运行前翻译,一般是使用编译工具讲程序源码处理成机器认识的可执行文件(比如:windows上的exe文件,linux下的二进制执行文件),这种文件一旦产生,以后运行时,将不需要需要再次翻译,所有编译型语言效率较高;而解释型语言是运行时翻译,执行一条语句就立即翻译一条,而且每次执行程序都需要进行解释,相对来说效率较低。
5、过程式编程语言
顺序执行
选择执行:
测试条件,当条件满足时,执行其中对应条件下的那部分代码
循环执行:
一段代码被反复执行多次,循环语句需要退出条件
6、bash shell有两种工作模式
互动模式:所谓互动模式就是输入命令,等待期执行完毕后再执行吓一跳命令
脚本模式:使用bash提供控制机制,将期望执行的命令罗列于文本文件中
bash没有库,整个程序几乎都要依赖于命令
二、bash编程入门
1、shebang
linux可执行文件的格式是ELF
[root@Node3 tmp]# file /bin/ls #ELF格式的文件可以执行
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[root@Node3 tmp]# file memory.txt
memory.txt: ASCII text
#!/bin/bash #指定解释器的路径,内核调用对应的解释器来解释脚本
脚本中常交待的信息:
#!/bin/bash
#Description:
#Version:
#Author:
#License:
#Datetime:
脚本文件中以#开头的行均为注释行,将会被解释器忽略
2、运行脚本
内核会启动一个专门的shell进程(是当前shell的子进程)来运行程序文件,脚本运行结束,此shell进程也即终止
运行脚本的方式:
1)给脚本执行权限,而后指定路径来运行
内核会通过读取脚本文件第一行来判断启动什么解释器来运行此脚本
2)指定给释器来运行
[root@Node3 src]# vim first.sh
[root@Node3 src]# cat first.sh
#!/bin/bash
echo "Hello world"
[root@Node3 src]# chmod +x first.sh
[root@Node3 src]# first.sh
-bash: first.sh: command not found
[root@Node3 src]# ./first.sh
Hello world
[root@Node3 src]# source first.sh #此时可以没有执行权限
Hello world
[root@Node3 src]# /tmp/src/first.sh
Hello world
[root@Node3 src]# bash first.sh #此时可以没有执行权限
Hello world
bash命令常用的选项:
-n 注意:检查语法错误,但不会检查命令错误
-x 调试运行 显示运行过程
3、脚本的执行结果状态返回值
脚本最后一个命令的执行结果状态返回值
自定义脚本的执行结果状态返回值:
exit [N]
注意:脚本中无论哪个位置遇到exit命令就停止运行,退出解释器
[root@Node3 src]# cat first.sh
#!/bin/bash
echo "Hello world"
[root@Node3 src]# bash first.sh
Hello world
[root@Node3 src]# echo $?
0
[root@Node3 src]# echo "exit 111">>first.sh
[root@Node3 src]# bash first.sh
Hello world
[root@Node3 src]# echo $?
111
4、shell脚本不同的执行方法的区别
有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts;一种是在当前shell下执行,不再启用其他shell。
新产生一个shell然后再执行scripts的方法是在scripts文件开头加入语句:#!/bin/sh。一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。
另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前shell下执行一切命令。source: source命令即点(.)命令。在 bash下输入man source,找到source命令解释处,可以看到解释"Read and execute commands from filename in the current shell environment and ..."。从中可以知道,source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程(或sub-shell)。
source 命令是 bash shell 的内置命令,从 C Shell 而来。source 命令的另一种写法是点符号,用法和 source 相同,从Bourne Shell而来。source 命令可以强行让一个脚本去立即影响当前的环境。source 命令会强制执行脚本中的全部命令,而忽略文件的权限。source 命令通常用于重新执行刚修改的初始化文件,如 .bash_profile 和 .profile 等等。source 命令可以影响执行脚本的父shell的环境,而 export 则只能影响其子shell的环境。
在脚本中可以使用source或.为把文件当成当前脚本的配置文件(引入变量...)
[root@Note3 src]# echo $a
[root@Note3 src]# cat test1.conf
a=111
[root@Note3 src]# source test1.conf #在当前shell中引入变量,影响当前的shell环境
[root@Note3 src]# echo $a
111
[root@Note3 src]# cat test.sh
#source test1.conf
echo "$a"
[root@Note3 src]# bash test.sh
[root@Note3 src]# vim test.sh
[root@Note3 src]# cat test.sh
source test1.conf #把其它的文件当做当前脚本的配置文件
echo "$a"
[root@Note3 src]# bash test.sh
111
三、变量
1、变量是什么
顾名思义,变量就是其值可以变化的量,从变量的本质来说变量是指向一片用于存储数据的内存空间。
变量命名:
1、不能使用程序中的关键字(保留字)如,if,case,for
2、只能使用数字,字母和下划线,且不能以数字开头
3、要见名知义
变量赋值:向变量指向的存储空间保存数据
VAR_NAME=VALUE #“=”号两边不能有空格
变量引用:引用其值
${VAR_NAME} # {}一般可省略
撤销变量: unset VAR_NAME
[root@Node3 ~]# echo $name
[root@Node3 ~]# name=xj
[root@Node3 ~]# echo ${name}
xj
[root@Node3 ~]# echo $name
xj
[root@Node3 ~]# echo name
name
[root@Node3 ~]# name=3 #重新赋值
[root@Node3 ~]# echo $name
3
[root@Node3 ~]# bash #子shell无效
[root@Node3 ~]# echo $name
[root@Node3 ~]# exit
exit
[root@Node3 ~]# unset name #撤销变量
[root@Node3 ~]# echo $name
[root@Node3 ~]#
[root@Node3 src]# file=test0 #
[root@Node3 src]# rm file
rm: 无法删除"file": 没有那个文件或目录
[root@Node3 src]# rm $file
rm: 无法删除"test0": 没有那个文件或目录
[root@Node3 src]# file=test1
[root@Node3 src]# rm $file
rm:是否删除普通空文件 "test1"?y
2、变量类别
本地变量:只对当前shell进程有效,对其它shell进程无效,包括当前shell的子进程
环境变量:对当前shell及其子shell有效,对其他shell无效
定义:export VAR_NAME=VALUE
导出:export VAR_NAME
只读变量: readonly VAR_NAME #其值不能重复赋值
用户可自定义,bash有许多内置的环境变量
局部变量:对shell脚本中某代码片段有效,通常用于函数本地
定义: local VAR_NAME=VALUE
位置参数变量:$0,$1,$2,$3、、、${10}
特殊变量:$?,$!,$#,$@,$*
$0:脚本名称自身
$?:上一条命令执行的状态返回值,
状态用数字来表示0-255,0表示成功,非0表示失败
$$:当前程序进程号
$!:运行于后台的最后一个作业的PID
$#:脚本所有参数的个数
$@:所有的位置参数,每个参数都是一个独立的字符串
$*:所有的位置参数,被当作一个字符串
$-:传递给脚本的标记,不知道怎么使用
$_:上一条命令的最后一个参数
查看当前shell进程中的所有变量:set
查看当前shell进程中的所有环境变量:export,printenv,env
[root@Node3 src]# cat test.sh
#!/bin/bash
cat |
|
|