1.sh脚本
程序必须以下面的行开始(必须方在文件的第一行):
#!/bin/sh
符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
当编写脚本完成时,如果要执行该脚本,还必须使其可执行。
要使编写脚本可执行:
#!/bin /bash
#comment line
echo hello
编译 chmod +x filename 这样才能用./filename 来运行

2、注释
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。

3.命令行参数
$#=命令行参数$1到$n的数量
$*=所有命令行参数,包括$0
$S=执行sh的进程PID
$?=最后一个命令执行的退出状态(如果成功为0,反之为1。与C语言不一致)

4、sh变量
在shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明。要赋值给一个变量,可以这样写:
#!/bin/sh
#对变量赋值:
a=”hello world”
现在打印变量A的内容:
echo “A is:”
echo $a
有时候变量名很容易与其他文字混淆,比如:
num=2
echo “this is the $numnd”
这并不会打印出”this is the 2nd”,而仅仅打印”this is the “,因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:
num=2
echo “this is the ${num}nd”
这将打印: this is the 2nd

5.sh命令
sh有许多内置命令,这些命令由sh执行
,file:读取并执行文件
break[n]:从最近的第n个嵌套循环中退出
cd[dirname]:更换目录
continue[n]:重启最近的第n个嵌套循环
eval[arg...]:计算一次参数并让sh执行生成的命令
exec[arg...]:通过这个sh执行命令,sh将会退出
exit[n]:使sh退出,退出状态为n
read命令:当sh执行read命令时,它会等待来自stdin的输入行,它将输入行划分为几个标记,分配给列出的变量。

6.Linux命令
echo命令:echo只是将参数字符串作为行回显到stdout。通常将相邻的多个空格压缩为一个空格,除非有引号。
第三周学习笔记_文件名

 

 第三周学习笔记_命令行参数_02

 

 

 

expr命令:因为所有的sh变量都是字符串,所以我们不能将之直接改为数值。以下是按照C语言格式直接操作的结果和按照shell脚本标准操作的结果对比
第三周学习笔记_字符串_03

 

 第三周学习笔记_可执行_04

 

 

第三周学习笔记_字符串_05

 

 第三周学习笔记_赋值_06

 

 

第三周学习笔记_字符串_07

 

 


expr是一个程序,它的运行方式如下:
expr string1 OP string2

7.sh函数
sh函数的定义为:
func()
{
#function code
}
由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。与C语言不同,在sh脚本中无法声明函数原型。sh函数的调用方式与sh脚本文件的执行方式完全相同。
调用sh函数,以参数(字符串)形式传递s1~sn。在被调函数中,参数被引用为$0、$1到$n。通常,$0是函数名,$1到 $n是与命令行参数对应的位置参数。函数执行结束时,$?表示其退出状态,如果成功,状态为0,否则,状态为非0。$?值可用函数的显式返回值进行更改。但是,为了测试S$?的最后一次执行,必须将其分配给一个变量,然后测试该变量。

8.sh中的通配符
星号通配符
file *:列出当前目录中所有文件的信息
ls *.c:列出当前目录中所有以.c结尾的文件
问号通配符

file ??:有3个字符的所有文件名
ls *.??: .后有2个字符的所有文件名
[]通配符

file [ab]:包含字符a或b的所有文件名
ls [xyz]:列出所有包含x、y或z的文件名
ls [a-m]:列出包含a到m范围内字符的所有文件名
9.命令分组
在sh脚本中,可以用{}或()对命令进行分组。
{ls;mkdir abc;ls;}:通过当前sh执行中的命令列表。命令分组的唯一用处是在相同环境下执行这些命令,例如,为分组中的所有命令重定向L/O。
更有用的命令分组是(),由subsh(进程)执行。
(cd newdir;ls;A=value;mkdir $A):通过subsh进程执行()中的命令。subsh进程可在不影响父sh的情况下更改其工作目录。此外,当subsh进程终止时,subsh中的任何赋值变量都不起作用。

10.eval语句
eval会对后面的cmdLine进行两遍扫描,如果第一遍扫描后,cmdLine是个普通命令,则执行此命令;如果cmdLine中含有变量的间接引用,则保证间接引用的语义。

eval也可以用于回显简单变量,不一定是复杂变量。
var="TangQiheng"
echo $var
eval echo $var
eval $var 等价于echo $var

eval进行二次扫描
eval $var或eval 'echo $var'或eval $(echo $var)
上述命令等价,可以知道第一次扫描进行了变量替换,第二次扫描执行了该字符串中所包含的命令.

11.调试sh脚本
sh脚本可由带有-x选项的子sh运行,以进行调试,如:
bash -x mysh
子sh将在执行命令之前显示要执行的每个sh命令,包括变量和命令替换。它允许用户跟踪命令执行。如果出现错误,sh将在错误行上停止并显示错误消息。