Linux shell编程学习
shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令。这点与Windows的命令提示符类似,但Linux shell的功能更加强大,我们可以使用 <和>对输入输出进行重定向 ,使用|在同时执行的程序之间实现数据的管道传递,使用$(n)获取子进程的参数。
重定向:
以b.txt为例: ll > b.txt
ll显示的东西 在b.txt显示了
管道传递: ll |grep “s”
在ll中 查找带s的文件
Linux脚本编写基础
执行shell脚本的方法:1.sh 文件名,2.bash 文件名 ,3. source 文件名
1.脚本开头
程序的开头必须为 #!/bin/sh(放在文件的第一行)
shell编程是以“#” 为注释,但对 #!/bin/sh 却不是, #!/bin/sh是对shell的声明,说明你所用的是那种类型的shell及其路径
2.注释
在进行shell编程的时候,以#开头的句子表示注释,直到这一行结束,C语言中是以// /**/表示注释
3. 简单shell书写
1
2
3
4
5#!/bin/sh A="hello world" echo "A is" echo $A
注意:shell在解释命令时的原则是第一个符号标记只能是程序或者命令,有空格的时候第一个符号标记就是“A”,当然就不成立了,
而没有空格的时候,第一个标记是“A=“hello world””,shell将解释为变量赋值指令,因此可以通过。
4.环境变量
5.系统变量
代码演示d.sh:
1
2
3
4
5
6
7
8#!/bin/sh echo $0 echo $# echo $1 echo $2 echo $3
运行结果:
6. shell使用一些Linux的指令
以cp拷贝为例:
1
2
3#!/bin/sh cp a.sh t.sh
结果:
在shell中实现键盘输入:用read
1
2
3
4
5
6
7#!/bin/sh A=10 echo $A read A echo $A
运行结果:
7.shell的语法及控制结构
7.1条件(if else elif)
检查文件是否存在,test用法,
代码演示:
1
2
3
4
5
6
7
8
9
10#!/bin/sh #if test -f b.txt if [ -f b.txt ] then echo "success" else echo "failed" fi
注意:使用[]时,必须要在[符号和被检查的条件之间留出空格,可以把符号看作和test样,test和后面的条件之间总是有一个空格。
代码最后不要忘了写fi来结束这个判断
字符串测试:
1
2
3
4
5
6
7
8
9
10
11
12#!/bin/sh echo "this is morning,yes or no" read today if [ $today = "yes" ] then echo "good morning" #else elif [ $today = "no" ] echo "good afternoon" fi
整数测试:
测试是否相等为例:
1
2
3
4
5
6
7
8
9#!/bin/sh if [ 3 -eq 4 ] then echo "yes" else echo "no" fi
文件测试:
测试文件是否为一个目录:
1
2
3
4
5
6
7
8
9#!/bin/sh if [ -d b.txt ] then echo "yes" else echo "no" fi
7.2 for语句
代码演示:
1
2
3
4
5
6
7#!/bin/sh for food in 1 5 7 9 do echo $food #输出结果 done
结果:
在默认情况下. shell的变量都是当作字符串来处理的,所以for在适合于对一系列字符串进行循环处理时使用,但需要执行特定次数时,for就不怎么适用了。
7.3 while语句
代码演示:
1
2
3
4
5
6
7
8
9
10
11
12#!/bin/sh echo "please password" read passwd #输入数字 while [ "$passwd" != "6" ] #判断条件是否满足 do echo "try again" read passwd done exit 0
结果:
while语句与整数结合用:
1
2
3
4
5
6
7
8
9
10
11#!/bin/sh food=1 while [ $food -le 20 ] do echo $food food=$(($food+1)) #注意要用两个括号 不然food=$food+1 编译不通过 done exit 0
7.4 until语句
代码演示:
1
2
3
4
5
6
7
8
9
10#!/bin/sh food=1 until [ $food -le 20 ] do echo $food food=$(($food+1)) #注意要用两个括号 不然food=$food+1 编译不通过 done exit 0
结果:啥都没有
until与while循环很相似,只不过while循环是条件满足时,循环继续,而until是条件满足时跳出循环。
7.5 case语句
代码演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#!/bin/sh echo "this is morning,please yes or no" read today #键盘输入 case "$today" in #判断 yes) echo "good morning";; no) echo "good afternoon";; y ) echo "good morning";; n ) echo "good afternoon";; * ) echo "answer not recognzed";; esac #这个必须加 exit 0
注意每个模式都以双分号(;;)结尾,因为你可以在前后模式之间放置多条语句,所以需要使用一一个双分号来标记前一个语句的结束和后一个语句的开始
7.6 函数
代码演示:
1
2
3
4
5
6
7
8
9#!/bin/sh food() { echo "ni zhen de henshuai" } echo "ni zhen sha" food echo "ni shi shazi"
如果要在shell函数中声明局部变量,则要使用local关键字,局部变量的作用域则局限在函数范围内。此外,函数还可访问全局作用范围内的其他shell变量。如果全局变量和局部变量出现了同名,则局部变量会覆盖全
使用局部变量的时候:
代码演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#!/bin/sh sample_name="ni hao shuai" food() { local sample_name="local ni hao shuai" echo "ni zhen de henshuai" echo $sample_name } echo "ni zhen sha" food echo $sample_name echo "ni shi shazi" exit 0
运行结果:
下列代码演示函数是如何传递参数,及如何返回一个值的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#!/bin/sh yes_or_no() { echo "is your name $*?" while true do echo "please enter yes or no" read a case "$a" in y|yes) return 0;; n|no) return 1;; * ) echo "error" esac done } echo "original parameters are $*" if yes_or_no "$1 " # shell脚本编程中,注意:Linux中返回0表示成功 then echo "hi$1" else echo "never mind" fi exit 0
7.7 (:)命令
冒号(:)是一个空命令,它偶尔会被用于逻辑简化,相当于true的一个别名,由于它是内置命令,所以它的运行效率要比true高
while:相当于while true
代码演示:
1
2
3
4
5
6
7
8
9
10
11
12#!/bin/sh fun() { while : do echo "jingjing" done } fun exit 0
结果:无限循环下去 Ctrl+c终止程序了
7.8 break 命令
这个命令在控制条件未满足之前,跳出for/while/unti循环。另外还可以为break提供一个参数,表明要跳出的循环的层数,这点跟我们在c语言中的break不一样。不过一般情况下,我们不会这么做,因为它降低了程序的可读性。
代码演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#!/bin/sh rm -rf fred* echo > fred1 #创建3个文件 和一个目录 echo > fred2 mkdir fred3 echo > fred4 for file in fred* do if [ -d "$file" ] #如果是目录,就退出 then break; # ;可有可无 fi done echo first direcyory starting fred was $file rm -rf fred*
7.9 continue 命令
类似于C中的continue,使for/while/until循 环跳到下一次循环继续执行,continue也可以附带一个参数,表示希望继续执行的循环嵌套if的层数,同样,这个参数也很少用,它会降低th程序的可诗性
代码演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#!/bin/sh rm -rf fred* echo > fred1 echo > fred2 mkdir fred3 echo > fred4 for file in fred* do if [ -d "$file" ] then echo skipping the directory $file continue fi done echo first direcyory starting fred was $file rm -rf fred*
7.10 exec 命令
将当前的shell替换为一一个不同的程序
exec wall"hello world"
将当前的shell替换为执行wall,exec后面的语句都不会执行了,因为当前的shell已经不复存在了
代码演示 :
1
2
3
4
5
6
7#!/bin/sh echo "lulu" exec echo "hengheng" echo "aa" echo "bb"
最后
以上就是畅快枫叶最近收集整理的关于Linux shell编程学习Linux shell编程学习的全部内容,更多相关Linux内容请搜索靠谱客的其他文章。
发表评论 取消回复