十一、Shell 函数
花里胡哨的语言我就不说了,来看一个demo函数:
demoFun(){ echo "測試一下我的函數!" } echo "函数开始执行" demoFun echo "-函数执行完毕"
如果你学过别的语言,你一定一眼就看懂了。
完整演示如下:
到这里我再插入一个例子:从键盘读入10个数,显示最大值和最小值
代码为:
printf "请输入十个数字: " read biggest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | head -n1) smallest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | tail -n1) echo "最大的数字为: $biggest" echo "最小的数字为: $smallest"
完整演示如下:
下面定义一个带有return语句的函数:
代码为:
add(){ echo "这个函数为求两个函数之和.." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read bNum echo "两个数字分别为 $aNum 和 $bNum !" return $(($aNum+$bNum)) } add echo "输入的两个数字之和为 $? !"
完整演示如下:
十二、Shell 输入/输出重定向
相关参数如下:
command > file 将输出重定向到 file。 command < file 将输入重定向到 file。 command >> file 将输出以追加的方式重定向到 file。 n > file 将文件描述符为 n 的文件重定向到 file。 n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。 n >& m 将输出文件 m 和 n 合并。 n <& m 将输入文件 m 和 n 合并。 << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
做一些例子:
1)输出重定向
将输出重定向到wen文件夹
再比如我把test16.sh这个文件重定向到han这个文件
这样的重定向有一个缺点就是会覆盖原来的内容,如果你不想覆盖原来的内容,你可以使用:
command >> file 将输出以追加的方式重定向到 file。
完整演示如下:
如此我们可以看到已经追加进去了。
2)输入重定向
如果要数一下文件夹内有多少行:
wc -l wen
如果我们用重定向的方式,将输入重定向到 wen文件:
wc -l < wen
演示为:
3)Here Document
Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。
语法为;
command << delimiter document delimiter
举个例子:
wc -l << EOF 欢迎大家 这里是川川菜鸟 教程 EOF
演示:
也可以以脚本方式执行:
cat << EOF 欢迎大家 这里是川川菜鸟 教程 EOF
演示如下:
4)/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
十三、实战练习
1)Linux例题
如果以下操作你看不懂的话,请看我这一篇文章,看完这一篇文章后,你就看得懂了:cat详细教程
输入输出重定向:
①新建文件file1,输入:
Hello,
Linux!
保存并退出。新建文件file2,输入:
World!
保存并退出。
将file1和file2的内容显示在终端上,并重定向到文件file3。
将file1的内容追加到文件file3。
操作步骤:
1.创建一个新的文件夹work
mkdir work
2.切换目录
cd work/
完整演示:
3.创建并编辑新文件
touch file1
编辑文件
vim file1
查看文件:
cat file
完整演示:
4.创建另一个文件
同样的道理,完整演示如下:
5.重定向到file3文件
cat file1 file2 >>file3
完整演示如下:
6.将file1的内容追加到文件file3
cat file1>>file3
完整演示如下:
②管道:
统计文件file3中出现“hello”的行数并显示
grep Hello file3 |wc -l
演示如下:
③管道和输入输出重定向:
进入目录/home/student,用ls –l长格式的方式列出当前目录下的文件和目录,并将其前5条信息保存到文件list中。
创建新文件夹,并编辑list.txt内容如下:
file1 file2 file3 file4 file5 file6 file7
完整演示:
查看一下:
查看当前目录下文件和目录
ls -al
演示:
筛选前5的数据加到file3中:
ls -l |head -n 5 >>list.txt
完整演示如下:
2)shell练习题
① 在/home目录中创建50个目录,目录名称依次为:a1,……,a50;
创建一个sh文件:
touch 1.sh
内容为:
i=1 while [ $i -le 50 ] do mkdir a$i i=$((i+1)) done
完整演示:
② 编写一个程序,它的作用是:先查看一下/root/test/logical这个名称是否存在。若不存在,则创建一个文件,使用touch来创建,创建完成后离开;如果存在,判断该名称是否为文件,若为文件,则显示其行数;如果不是文件,则离开;
创建2.sh
touch 2.sh
内容为:
if [ ! -e /home/yifan/maying/shell/case5/logical ] then touch logical elif [ -f /home/yifan/maying/shell/case5/logical ] then rm -f /home/yifan/maying/shell/case5/logical && mkdir /home/yifan/maying/shell/case5/logical elif [ -d /home/yifan/maying/shell/case5/logical ] then rm -r /home/yifan/maying/shell/case5/logical fi
演示如下:
查看一下:
③编写一个shell脚本,从键盘读入10个数,显示最大值和最小值
printf "请输入十个数字: " read biggest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | head -n1) smallest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | tail -n1) echo "最大的数字为: $biggest" echo "最小的数字为: $smallest"
完整演示如下:
④ 编写一个脚本,打印任何数的乘法表。如:输入3,则打印
11=1
21=2 22=4
31=3 32=6 33=9
代码如下:
echo "输入一个数:" read num for (( i=1;i<=$num;i++ )) do for (( j=1;j<=$num;j++ )) do [ $j -le $i ] && echo -n "${i}*${j}=$((i*j)) " #判断j是否小于i,当 j大于i时不输出,输出不换行,末尾加一个制表符 done echo "" #输出一个换行符 done
完整演示如下:
十四、总结
本篇文章写得很详细,不管你是不是零基础,相信你都能看懂,本文主要在一些基础知识讲解,并没有太多的进阶,本人主要是为了完成作业学习这个,这些内容已经足够我完成作业了。