linux shell编程
第一部分 Linux编程初学者入门
第一章 Linux的编程步骤
1.运行Linux程序
1.1用chmod形成一个可执行文件
Linux对任何文件可以授予三种权限,即read(可读)、write(可写)和executable(可执行)
三个用户类别对这些文件的权限
owner(用户) group(用户组) others(其他用户)
read:4
write:2
executable:1
1.2Linux程序可以后台运行
在命令行上运行的程序名后键入一个&字符
第二章 设计第一个用户界面
第三章 编写第一个Linux程序
Linux shell的分类
bash shell
C shell
Korn shell
Perl shell
第二部分 Linux编程基础
第四章 变量
4.1变量分类
Linux使用两种变量:
局部变量:由程序员建立,且仅供程序员所设计的程序使用
环境变量:由程序员或他人建立,程序员和他人的程序都可以使用
4.2声明变量
在保留字declare和export后加上一个变量名就可以创建一个变量,如:
declare firstname
export editor
4.3将数字赋给变量
使用let保留字
let mysalary=10000
注意=前后不能空格
4.4将字符串赋给变量
利用declare或export声明一个字符串变量
字符串两边必须带有引号
当程序中引用变量时,必须加$
4.5将一个变量赋给其他变量
字符串变量:
declare mygoal="buy out bill gates"
declare ourgoal="$mygoal"
数字型变量:
let mysalary=10000
let oursalaries=$mysalary
4.6Linux使用的数据类型
两种:数字型,字符串型
第五章 与用户交流信息
5.1读一个数
用read保留字
#!/bin/sh
clear
echo ""
echo "enter your age:"
read age
注意age是一个数字变量,不需要再前面声明
5.2读一个字符串
#!/bin/sh
clear
echo ""
echo "enter your name:"
read name
此时name是一个字符串变量,也无需在前面声明
5.3显示一个数
#!/bin/sh
clear
echo ""
echo "enter your age:"
read age --->意思是读取用户在键盘上输入的任何数字,并将其放入变量age中
echo "$age"
注意要加$
5.4显示一个字符串
#!/bin/sh
clear
echo ""
echo "enter your name:"
read name
echo "$name"
5.5把数据存入文件 >
Linus 认为无论程序什么时候用保留字echo显示信息,它都要用到屏幕。这对大部分程序而言是如此,但是也可以改变程序,
让它将数据显示到其它地方比如一个文件中。这种处理过程叫重定向。重定向就是指改变数据正常的流动方向。
#!/bin/sh
clear
echo ""
echo "enter your name:"
read name
echo "$name" > employee.dat
这将变量name的值存入一个名字为employee.dat的文件中,而不是显示在屏幕上。
关于重定向>符号有以下说明:
如果在程序中用>向一个文件中存信息,计算机将创建一个新的文件
如果计算机存在一个同文件,它江用新的信息覆盖旧文件内容,文件中原有的信息将被丢失。
5.6向文件中添加数据 >>
>>可以将信息添加到文件末尾而不覆盖文件中的已有数据。
第六章 运算符
6.1算术运算符--->+,-,*,/,%
let a=30
let b=10
let sum="$a + $b"
=两边没有空格,+两边有空格
注意,对于所有运算符而言两边都要求有空格,还有双引号不能省
对于其他算术运算符一样
6.2逻辑运算符--->&&,||,!
$salary !=3000
表达式$salary !=3000让计算机把变量salary的值和3000进行比较,如果$salary的值不是3000,则表达式是真
!$salary !=3000
假设表达式$salary !=3000是真,那么!$salary !=3000为假
6.3比较运算符
让计算机比较两个数或者两个字符串的值
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
要判断两个值是否相同,用等于运算符-eq,注意,在连字符(-)和eq之间没有空格
let salary=3000
let newsalary=2000
test $salary -eq $newsalary
echo "$?"
解析:test $salary -eq $newsalary让计算机检验两个边路salary和newsalary的值是否相等。如果相等,test返回一个真值,
否则返回一个假值。最后echo "$?"将test返回的值显示在屏幕上
注意:真值是任何一个非零值,假值就是0
注意:这些比较运算符只能比较两个数或者两个字符串的值,而不能比较两个字符串
即:#!/bin/bash
declare name1="edward"
declare name2="emma"
test "$name1" -eq "$name2"
echo "$?"
执行会出错:./test.sh: line 4: test: eaward: integer expression expected
#!/bin/bash
declare name1="1"
declare name2="2"
test "$name1" -eq "$name2"
echo "$?"
执行就不会出错
第三部分 Linux条件控制语句
第七章 if,if else,if elif语句
7.1Linux中,条件的两种表达式:
单一变量
一个表达式
用变量表示的条件:
一个变量的值要么是真要么是假。非零表示真,0表示假。下面介绍确定一个变量的值是真还是假的两种方法
if [$haveenoughmoney -eq 1] --->程序将用等号(-eq)来确定变量的值是真还是假
if [$haveenoughmoney -ne 0] --->不等于(-ne)做出的是一种逻辑相反的判断。
用表达式表示的条件:
if [$bankbalance -gt 3000]
7.2if语句的规则
if [ condition ]
then
instruction
fi
注意[]中括号要留一个空格
如:
let a=100
if [ $a -eq 100 ] --->[]必须留有空格
then
echo "very good"
fi
7.3if else语句语法规则:
if [ condition ]
then
instruction1
else
instruction2
fi
注意:可以在表达式和else之间以及在else和fi之间放置一大批指令
即:
if [ condition ]
then
instruction1
instruction2
instruction3
...
else
instruction4
instruction5
instruction6
...
fi
7.4if elif语句语法规则:
if [ condition1 ]
then
instruction1
elif [ condition2 ]
instruction2
fi
如果条件condition1是真,则执行instruction1;否则,程序再判断条件conditon2是否为真。如果条件为真,程序则执行instruction2;
如果condition2为假,则跳过instruction2.
用if elif语句进行多重选择:
if [ condition1 ]
then
instruction1
elif [ condition2 ]
then
instruction2
elif [ conditon3 ]
then
instruction3
fi
当多重if elif结构中,所有条件都可以是假。因此,程序可以不执行if elif语句之中的任何指令。
保证Linux至少执行一组指令
if [ condition1 ]
then
instruction1
elif [ condition2 ]
then
instruction2
elif [ conditon3 ]
then
instruction3
elif
instruction4
fi
第八章 case语句
case语句功能:把保留字case右边的值和闭括号")"左边的值比较,语法规则如下:
case variable in
value1 )
instruction
;;
value2 )
instruction
;;
esac
case语句以保留字case开头,以esac结尾。
注意在每组指令集的最后用两个分号。
#!/bin/bash
declare name=edward
case $name in
edward)
echo "edward"
;;
emma)
echo "emma"
;;
esac
case语句中的默认情况
利用*)
case variable in
value1 )
instruction
;;
value2 )
instruction
;;
*)
instruction
esac
第九章 多层嵌套控制结构
9.1if嵌套
if [ $office -eq "1" ]
then
if [ $name -eq "edward" ]
then
echo "hello, edward"
fi
fi
9.2case嵌套
case $office in
"1")
case $name in
"bob")
echo "hello, edward"
esac
esac
第四部分 循环控制语句
第十章 while循环
while [ condition ]
do
instruction
done
#!/bin/bash
declare flag="1"
while [ "$flag" -eq "1" ]
do
clear
echo ""
echo "the telephone book"
ehco ""
echo "1. display a telephone number"
echo "2. add a new telephone number"
echo ""
echo "q quit"
echo ""
echo "enter your selection"
echo ""
read selection
case $selection in
"1")
echo "run the subprogram to display a phone number"
;;
"2")
echo "run the subprogram to add a new phone number"
;;
"q")
$flag="0"
"Q")
$flag="0"
*)
echo "invalid selection"
esac
done
第十一章 for in循环
11.1如果知道循环体重指令的具体次数,那么就用for in循环
格式:
for variable in wordlist
do
instruction
done
wordlist是一个将赋给变量的字符串值的列表。字符串是字母和数字的任意组合,循环体中的指令可以使用该变量。
以下两种情况常常需要使用for in循环:
需要对多个字符串值做同样操作
需要按照某一确定的次序使用字符串值系列
例如:用一个程序给5个雇员加薪,必然会遵循下列步骤:
1.在工资表中查找一个雇员的工资
2.计算新的薪水
3.将新的薪水存入工资表
可以先把每个雇员的名字放在一个与for in循环相联系的列表中。然后,按照雇员的名字顺序,让程序查找他们的记录
进行一些必要的数学运算,及把记录重新放入工资文件中。
例子:
echo "hello, Mary"
echo "hello, Joe"
echo "hello, Sue"
for friend in Mary Joe Sue
do
echo "hello, $friend"
done
11.2单词表wordlist
赋给变量的那些值统称为单词表。它是一个关于字符串值(字符和数字的组合)的列表
注意:
赋给单词表的值必须是一个字符串值
每一个值之间必须用空格隔开
如果空格也是字符串的一部分,则需要在字符串的两边加上引号
如:
for friend in "Mary Jones" "Joe Smith" "Sue Jones" --->有空格加双引号
do
echo "hello, $friend"
done
第十二章 循环嵌套与快速退出
12.1在循环中使用break和continue
break和continue的使用是紧密和while循环联系在一起的。
12.2使用break快速退出
break会直接跳出while循环
如:
#!/bin/bash
2 let n=1
3 while [ "$n" -eq 1 ]
4 do
5 echo "enter your name or type stop to end:"
6 read name
7 case $name in
8 "stop")
9 break
10 ;;
11 esac
12 echo "good bye"
13 done
在终端中如输入:edward,则显示goodbye,若输入stop,则直接跳出while循环不执行good bye
12.2使用continue达到循环的开始
有时,程序并不必执行放入循环体中的所有指令。如果使用continue语句,程序将跳过循环体重continue后面的其余指令。
第五部分 子程序
第十三章 函数
当linux需要使用存放在函数中的命令时,可以在程序中键入该函数的名字
13.1创建一个函数
在使用一个函数之前,必须先在程序中定义一个函数。创建一个函数最好的地方是程序的开始位置。
定义函数步骤:
1.首先在程序中键入一个关键字function
2.给函数起一个名字,且它在程序中没有任何重名
3.在函数名和第一个命令之间要使用一个大括号
4.在函数体中键入所需要的任何命令
5.在函数体中每一个命令之后,下一个命令之前用一个分号隔开
6.在最后一个命令的分号之后用一个大括号
注意:在最后一个分号和大括号不要留有空格
13.2调用一个函数
只需在使用该函数的地方用一下函数名即可。
13.3给函数传递参数
用$1,$2,$3...来表示第一、二、三个参数
#!/bin/bash
clear
function verify
{
if [ $1 = "Bob" ] && [ $2 -eq "555" ]
then
echo "verified"
else
echo "rejected"
fi
}
verify Bob 555 --->verify表示调用verify函数,Bob传递给$1,,555传递给$2
13.4验证传递给函数的参数的个数
用变量$#来表示传递给函数的参数个数,通过对变量$#的值和函数实际需要的参数的个数进行比较
1 #!/bin/bash
2 clear
3 function verify
4 {
5 if [ $# -ne 2 ]
6 then
7 echo "wrong number of arguments"
8 else
9 if [ $1 = "Bob" ] && [ $2 -eq "555" ]
10 then
11 echo "verified"
12 else
13 echo "rejected"
14 fi
15 fi
16 }
17 verify Bob 555
13.4与子程序共享函数
用export命令输出函数,实现子程序之间共享函数
#!/bin/bash
clear
unction verify
{
if [ $# -ne 2 ]
then
echo "wrong number of arguments"
else
if [ $1 = "Bob" ] && [ $2 -eq "555" ]
then
echo "verified"
else
echo "rejected"
fi
fi
}
export verify
subprogram1
说明:用export命令来说明子程序subprogram1可以访问函数verify
程序中最后一行调用subprogram1
13.5从函数返回信息
用变量$?来存储返回信息,用关键字return来返回
注意,返回值必须是0-255之间的一个整数。因此,不能将字符串作为返回值返回的。
1 #!/bin/bash
2 clear
3 function verify
4 {
5 if [ $# -ne 2 ]
6 then
7 return 1
8 else
9 if [ $1 = "Bob" ] && [ $2 -eq "555" ]
10 then
11 return 0
12 else
13 return 2
14 fi
15 fi
16 }
17 verify Bob 555
18 case $? in --->利用case语句来比较变量$?和case语句中的值,其中变量变量$?包含的是函数的返回值
19 0)
20 echo "verified"
21 ;;
22 1)
23 echo "wrong number of arguments"
24 ;;
25 2)
26 echo "rejected"
27 ;;
28 esac
第十四章 子程序
第十五章 参数传递
可以从命令行给某个程序(或子程序)传递参数,也可以通过在程序内部键入程序(或子程序)名,
把参数传递给那些程序(或子程序)
信息硬编码(hard coding):以变量赋值的形式为程序提供信息,如:declare firstname="Bob",这种硬编码方式,
在每次需要修改程序数据的时候,例如要修改"Bob"为"Robert"时,就必须修改程序
15.1传递参数
将命令行上的信息传递给程序(或子程序)的过程叫参数传递,此时传递给程序的参数,停留在正在使用它们的程序或子程序的外面。
例如:调用子程序findlisting,并把名字作为参数传递给程序,可以在命令行中输入findlisting Jones,Linux操作系统自动把名字
Jones传递给子程序findlisting。
15.2接收参数
Linux将传递给程序的信息存储在名为$1的变量中,其中数字1表示它指向传递给程序的第一条信息。
15.3传递多个参数
在命令行中输入参数,并在程序中利用$1,$2,$3...来接收
15.4参数传递中常出现的问题
参数的个数不正确、参数的类型不正确
这两种问题只要在程序文档说明中规定了某个程序运行时需要的信息即可
15.5参数是否存在
程序有时需要用户输入数据,否则它不会执行任务,因此,程序要做的第一件事就是确定用户是否给它传输了数据
我们可以用$#来确定程序收到的参数个数
#!/bin/bash
if [ "$#" -eq 2 ]
then
echo "you entered the correct number of arguments."
else
echo "you didn`t enter the correct number of arguments."
fi
相关文章: