黑马程序员技术交流社区

标题: Linux Shell编程初步 [打印本页]

作者: 梦缠绕的时候    时间: 2019-6-11 15:07
标题: Linux Shell编程初步
1、基础概念
shell程序一般被称为脚本(script),他其实就是一组命令的集合,最简单的甚至可以简单的堆砌命令。这种脚本最明显的好处是重复一系列固定命令时减少敲击键盘的次数。

脚本shell与C源码的区别:

C需要将.c和.h文件通过编译工具处理成为二进制可执行文件才可以执行并看到结果
shell脚本文件.sh只需要给脚本加上可执行权限即可:chmod +x name.sh(解释执行)
shell中使用"#"进行注释
1.1 Sha-Bang
Sha-Bang就是通常脚本开头的头两个字符"#!"连在一起的读音。"#!" 是一个魔数(Magic,0x23,0x21),可执行文件在被读取的时候,内核通过这个特定数字的组合识别出这是一个需要运行解释器的脚本,并根据"#!"后面说明的解释器路径来调用该解释器执行后面的代码。

一般的Shell脚本使用"#!/bin/sh"或者"#!/bin/bash"开头,表面脚本使用的是sh(POSIX Shell)或者bash。

例如:testShell.sh

#!/bin/bash
echo "hello,shell!"   #print hello,shell!
添加可执行权限:



执行输出:



如果不添加Sha-Bang也可以正常输出,应该是默认使用哪一个解释器了?

魔数只是系统调用一个解释器来执行脚本的标记,该解释器可以使任何可执行程序。

例如,使用cat解释器

#!/bin/cat
#!/bin/bash
echo "hello,shell!"   #print hello,shell!
输出:


执行脚本通常有五种方法,以testShell.sh为例:

(1)直接将有执行权限的脚本作为命令调用

$ ./testShell.sh
以下执行命令忽略了魔数,直接执行内容部分(语法不对将会报错,比如将上面的echo "hello,shell!" 改为 "hello,shell!"会出错)。

(2)显式地使用shell程序,将脚本文件作为参数来执行脚本

$ sh testShell.sh
输出:

hello,shell!
(3)将脚本文件重定向到shell程序的标准输入

$ sh < testShell.sh
输出:

hello,shell!
(4)通过一个管道将脚本内容输出到shell程序的标准输入

$ cat testShell.sh | sh
输出:

hello,shell!
(5)使用source命令执行脚本

$ source testShell.sh
输出:

hello,shell!
1.2 字符串与引号
(1)单引号(' ')

单引号中的字符串Shell不会做任何处理,在需要保持字符串原样不变的时候使用。

#!/bin/bash
temp=areyouok
echo 'hello,shell,${temp}!'   #print hello,shell!
输出:



(2)双引号(" ")

双引号中的字符串Shell会进行处理,若其中包含有可以求值的部分,则会被Shell替换为求职的结果,其中包含变量、表达式或命令

#!/bin/bash
temp=areyouok
echo "hello,shell,${temp}!"   #print hello,shell!
输出:


(3)反引号(` `,Esc按键英文模式)

作用于符号“$()”相同。反引号印版用来引用一条指令,并且将这个命令的输出结果作为这个字符串最终的值。

如果反引号用的命令出现在双引号字符串中,这部分也会被替换为命令的输出。



1.3 特殊字符
星号(*)和问号(?)一般用作通配符,可以用来匹配文件的名字,“*”匹配任意多个字符,“?”匹配任意一个字符。
冒号(:)表示空命令(NOP no-op),引起返回值恒为0,故在循环条件中可与true命令等价。
分号(;)是分行符,可以表示一行命令的结束,可用分号将多条命令写在一行
美元符号($)可以用来取值,其后跟上不同的结构,可以取变量或表达式的值
${var}  和 $ var 均是取变量var的值,不同之处在于使用大括号({})可以在变量作为字符串取一部分的时候,变量名不会和字符串内容混淆。所以需要在一个字符串中取变量值的时候,应该尽量使用大括号({})明确指定哪些字符是变量名称的组成部分。
$( )可以取一个命令的值作为字符串内容,与反引号(``)含义相同。
$(( ))可以取一个数学表达式的值,比如在(( ))使用“* *”运算符计算一个乘方。


句点(.)等下于source命令
反斜线(\)是转义符,是一种引用单个字符的方法,在一个具有特殊含义的字符前加上转义符就是告诉Shell这个字符失去了特殊含义。
一般来说,Shell命令是不能随便换行的,但是有了转义符,就能实现跨行



2、必要的高级概念
2.1 内部命令和外部命令


2.2 IO重定向与管道
2.2.1 输出重定向


2.2.2 输入重定向


2.2.3 管道
管道用于连接,将前一条命令的输出作为下一条命令的输入。管道有一个重要的特征:管道符两边是不同的进程。

2.3 常量、变量和环境变量
2.3.1 基本概念
shell变量有以下特点:

使用前不用声明,赋值时直接使用变量名,且等号两边不能有空格
应用变量使用美元符号$(在前面已做说明),如果引用变量没用使用$,会直接将变量名作为字符串;
变量没有类型,例如a=1234,即可以认为是十进制整数1234直接参与整数运算,也可以被认为是字符串参与Bash的字符串操作
变量有作用域,默认为全局变量,对整个Shell文件有效。
局部变量必须使用local关键字来声明,他只能在自己被声明使用的快或者函数中可见。
问号(?)也是一个变量,通过“$?”可以引用上一个命令的返回值。注意,这个变量只能使用一次,使用完毕即被当前命令的返回值替换。
2.3.2 环境变量
环境变量是可以改变用户接口和Shell行为的变量。每一个进行都有自己的环境变量,用于保存可能有用的信息。

环境变量一般是约定俗称的,例如PATH指示了Shell程序查找一个命令文件时的搜索路径。

任何变量都可以通过export导出成为环境变量,环境变量可以被子进程继承,所以它也是父进程传递信息给子进程的一种方式。

2.3.3 位置参数
位置参数就是按照位置来引用的命令行参数,Shell脚本被调用时可以传递参数给它。

2.3.4 操作符与表达式
Bash支持基本的数学运算符和各种逻辑操作符。

数学运算符:+、-、*、/、**、%。

逻辑操作符:&&(与) 和 ||(或)
---------------------
有问题可以直接在下方留言,或者直接联系学姐哟
DKA-2018


作者: 晨大喵    时间: 2019-7-17 13:08
感谢分享~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2