linux学习之shell基础篇

1、shell简介

shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。

2、shell的工作原理

系统初启后,核心为每个终端用户建立一个进程去执行Shell解释程序。它的执行过程基本上按如下步骤:

(1)读取用户由键盘输入的命令行。

(2)分析命令,以命令名作为文件名,并将其它参数改造为系统调用execve( )内部处理所要求的形        式。

(3)终端进程调用fork( )建立一个子进程。

(4)终端进程本身用系统调用wait4()来等待子进程完成(如果是后台命令,则不等待)。当子进程运     行时调用execve(),子进程根据文件名(即命令名)到目录中查找有关文件(这是命令解释程序构     成的文件),将它调入内存,执行这个程序(解释这条命令)。

(5)如果命令末尾有&号(后台命令符号),则终端进程不用系统调用wait4()等待,立即发提示符,让      用户输入下一个命令,转⑴。如果命令末尾没有&号,则终端进程要一直等待,当子进程(即运行      命令的进程)完成处理后终止,向父进程(终端进程)报告,此时终端进程醒来,在做必要的判别      等工作后,终端进程发提示符,让用户输入新的命令

3、程序

程序就是指令加数据,起功能就是通过指令去加工指定的数据,并输出结果;

程序编写分为两种:

面向过程:以指令为中心

面向对象:以数据为中心

bash属于面向对象的编程语言;bash有三种控制执行方式

顺序执行:逐个执行

选择执行:只执行其中一个分支

循环执行:一段代码要执行0,1或多遍

4、程序执行的分类

程序按照编译方式来可以分为两类

编译执行:预处理-->编译-->汇编-->链接;事先完成,结果:二进制程序文件

如是用C, C++等语言开发的程序

解释执行:由解释器全程参与运行过程,每次读取一行,运行一行;

Python:编程库

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

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

Bash:编程

程序控制结构,调用机器上命令程序文件进行程序编写;

外部命令:各应用程序提供;

5、变量

变量就是内存中存放可变量的空间;

bash的变量分为:

环境变量:有效范围是当前shell进程及其子进程

本地变量:当前进程

局部变量:某个函数的执行过程

位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;

特殊变量:$?, $*, [email protected], $#, $$

变量的类型(bash默认是字符型)

数值型

整数

浮点数

字符型

ASCII

如;120

数值型则为120

字符型则为1、2、0

bash的变量是不严格区分类型,也不必事先声明

6、本地变量:

name=value

name: 变量名

=:赋值符号

value:值

变量名:只能包含数字、字母和下划线;且不能以数字开头;

引用变量:${name}, $name

引用:

弱引用: "", 其内部的变量引用会被替换为变量值;

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

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

声明为整型:

declare -i name[=value]

let name=value

查看所有变量:set

生命周期:

创建

销毁:

自动销毁:shell进程终止;

手动销毁:unset name

7、环境变量:

被“导出”的本地变量

export name[=value]

declare -x name[=value]

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

销毁:

unset name

8、脚本:文本文件

运行脚本:事实上是运行一个bash进程,此进程负责从脚本文件中读取一个执行逻辑,而后由bash进程负责解析并运行此逻辑;

启动脚本:

(1) # bash /PATH/TO/SCRIPT_FILE

(2) 一个执行权限,

# ./PATH/TO/SCRIPT_FILE

shebang:

#!/bin/bash

第一行:顶格给出shebang

注释行:#

bash的常用选项:

-n: 检查脚本中的语法错误;

-x:调试执行脚本;

9、命令状态结果:

bash进程用于追踪执行的命令成功与否的状态:

0: 成功

1-255:失败

特殊变量:

$?:上一条命令的执行状态结果;

布尔型:

“真”:成功

“假”:失败

自定义脚本的状态结果:

exit [n]

注意:脚本中任何位置执行了exit命令即会终止当前shell进程;

10、条件测试:

界定程序执行环境;

(1) 根据运行的命令的状态结果;

(2) 测试表达式

test EXPRESSION

[ EXPRESSION ]

[[ EXPRESSION ]]

整数测试:隐含着做数值大小比较,所以不要给变量引用加引用;

$A -gt $B:是否大于;是则为“真”,否则为“假”;

$A -ge $B: 是否大于等于;

$A -lt $B:是否小于;

$A -le $B: 是否小于等于;

$A -eq $B: 是否等于;

$A -ne $B:是否不等于;

[[email protected] ~]# cat test.sh
#!/bin/bash
declare -i x=10
declare -i y=100
echo "x=$x"
echo "y=$y"
echo "判断上面两个数值得大小,是则输出0,否则输出非0"

echo "$x -gt $y:x是否大于y"
test $x -gt $y;echo $?

echo "$x -ge $y:x是否大于等于y"
test $x -ge $y;echo $?

echo "$x -lt $y:x是否小于y"
test $x -lt $y;echo $?

echo "$x -le $y:x是否小于等于y"
test $x -le $y;echo $?

echo "$x -eq $y;x是否等于y"
test $x -eq $y;echo $?

echo "$x -ne $y;x是否不等于y"
test $x -ne $y;echo $?
[[email protected] ~]#

[[email protected] ~]# bash test.sh
x=10
y=100
判断上面两个数值得大小,是则输出0,否则输出非0
10 -gt 100:x是否大于y
1
10 -ge 100:x是否大于等于y
1
10 -lt 100:x是否小于y
0
10 -le 100:x是否小于等于y
0
10 -eq 100;x是否等于y
1
10 -ne 100;x是否不等于y
0
[[email protected] ~]#

字符串测试:ASCII数值越大,字符比较时其值越大;

"$A" > "$B":是否大于;

"$A" < "$B":是否小于;

"$A" == "$B":是否等于;

"$A" != "$B":是否不等于;

-z "$A":是否为空;空则为“真”,否则为“假”

-n "$A":是否不空;不空则“真”,空则为“假”

注意:应该使用[[ EXPRESSION ]]

[[email protected] ~]# cat test.sh 
#!/bin/bash
A=hello
B=world
echo "A is $A"
echo "B is $B"
echo "测试字符串A,B,是则为“真”(0),否则为“假”(非零);"
 
echo ""$A" > "$B":是否大于;"
[[ "$A" > "$B" ]];echo $?
 
echo ""$A" < "$B":是否小于;"
[[ "$A" < "$B" ]];echo $?
 
echo ""$A" == "$B":是否等于;"
[[ "$A" == "$B" ]];echo $?
 
echo ""$A" != "$B":是否不等于;"
[[ "$A" != "$B" ]];echo $?
 
echo "-z "$A":是否为空;空则为“真”,否则为“假”"
[[ -z "$A" ]];echo $?
 
echo "-n "$A":是否不空;不空则“真”,空则为“假”"
[[ -n "$A" ]];echo $?
 
[[email protected] ~]# bash test.sh   
A is hello
B is world
测试字符串A,B,是则为“真”(0),否则为“假”(非零);
hello > world:是否大于;
1
hello < world:是否小于;
0
hello == world:是否等于;
1
hello != world:是否不等于;
0
-z hello:是否为空;空则为“真”,否则为“假”
1
-n hello:是否不空;不空则“真”,空则为“假”
0

文件测试:测试文件的存在性以及属性;

-e $file: 是否存在;存在则为“真”,否则为“假”;

-a $file: 同上;

-f $file:文件是否存在且为普通文件;

-d $file:文件是否存在且为目录;

-h $file:是否存在且为符号链接文件;

-L $file: 同上

-b $file:是否存在且为块设备文件;

-c $file:是否存在且为字符设备文件;

-S $file:是否存在且为套接字文件;

-p $file: 是否存在且为管道文件;

-r $file: 当前用户对文件是否拥有读权限;

-w $file:当前用户对文件是否拥有写权限;

-x $file:当前用户对文件是否拥有执行权限;

-u $file:文件是否拥有SUID权限;

-g $file:文件是否拥有SGID权限;

-k $file:文件是否拥有sticky权限;

-O $file: 当前用户是否为指定文件的属主;

-G $file: 当前用户是否为指定文件的属组;

双目操作符:

$file1 -nt $file2: file1是否新于file2, file1的最近一次的修改时间戳是否晚于file2的;

$file1 -ot $file2: file1是否旧于file2, file1的最近一次的修改时间戳是否早于file2的;

$file1 -ef $file2:file1与file2是否指向了同一个inode;测试二者是否为同一个文件的硬链接;

特殊设备:

/dev/null: 空,bit buckets,吞下所有数据,并直接丢弃;

/dev/zero:吐出一堆0;

时间: 2024-10-04 18:44:02

linux学习之shell基础篇的相关文章

Linux学习笔记——Shell基础(八)

+++++++++++++++++++++++++ +++++Shell基础+++++++++++++++++++++++++++++++ 1. Shell概述 Shell定义: Shell 是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动.挂起.停止甚至编写一些程序. Shell还是一个功能相当强大的编程语言,易编写.调试.Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令. Shell分类: Bo

Linux学习之Shell基础

一.Shell概述 1.Shell概述: Shell:壳,Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面级程序,用户可以用Shell来启动.挂起.停止甚至是编写一些程序.类似于翻译,相当windows的操作界面 Shell同时还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强.Shell是解释执行的脚本语言,在Shell中可以直接调用Linux命令. 2.Shell的分类: Bourne Shell:从1979起Unix就开始使用的Bourne

linux 学习10 shell 基础

10.1 Shell概述 1.Shell是什么 ?Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动.挂起.停止甚至是编写一些程序. ?Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强.Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令. 2.Shell的分类 ?Bourne Shell:从1979起Unix就开始使用Bourne Shell,Bourne Shell的主文

linux 学习随笔-shell基础知识

1:用户的shell历史命令保存在home/username/.bash_history中 #!!  执行用户的上一条命令 #!pw  执行命令历史中最近一次以pw开头的命令 2:'*'来匹配零或多个字符 '?’匹配一个字符 #ls -d Day* 列出Day开头,后面匹配所有字符的目录 #ls -d Day? 列出Day开头,后面匹配一个字符的目录 3:>> 在文件中追加重定向 > 在文件中重定向 4:| 管道符 #cat /etc/passwd|wc -l cat /etc/pass

Linux C 程序设计多线程基础篇

   Linux C 程序设计多线程基础篇 题记:因为 Linux 网络入侵检测系统的设计与实现希望使用多线程,因此希望系统的学习一下 Linux C程序设计多线程的知识 注意事项:因为 pthraed 库不是 Linux 系统默认的库,因此在进行多线程开发的时候,需要加上头文件#include <pthread.h>,编译时要加参数 -lpthread;了:gcc thread.c -o thread -lpthread. 进程和线程: 进程是程序执行,资源分配的基本单位,每个进程都拥有自己

linux学习之shell练习

linux学习之shell练习 1.描述shell程序的运行原理(可附带必要的图形说明): 2.总结shell编程中所涉及到的所有知识点(如:变量.语法.命令状态等等等,要带图的哟): 总结文章:http://pizimsn.blog.51cto.com/7002551/1697671 3.总结课程所讲的所有循环语句.条件判断的使用方法及其相关示例:(if (jpg|png is not exist):echo "You say a XX") 总结文章:http://pizimsn.b

Java快速教程--vamei 学习笔记(基础篇)

链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html java快速教程第1课 从HelloWorld到面向对象 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/14/2958654.html java快速教程第2课 方法与数据成员 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/25/2964430.html java快

Linux学习系列——零基础开始

第一部分 Linux基础命令 1.查看系统信息命令 2.Linux内核版本 Linux学习系列--零基础开始,布布扣,bubuko.com

做web开发需要学习哪些技术--基础篇

做一个web网站,包含哪些技术,自己需要学习哪些技术 自己想到哪里就写到哪里 -- 给自己做的一个记录 1: 页面的展示, 一个web的开发语言  1.1 一个web的开发语言需要注意哪方面,才能符合你的网站业务发展     1:语言的选择     2:框架的设计 - 怎么符合未来业务的发展     3:对于业务的了解     4:了解http协议      那么就要了解tcp/ip协议 3: web安全     web安全又有哪些方面需要注意的呢     3.1 xss     3.2 sql