一、环境准备
我们在这里就在本地测试学习,因此我在这里先不建议大家这么着急去买服务器来学,这样比较费钱,等我们学好这些基础之后,再去上手服务器,那将是手到擒来。 本地学习工具:虚拟机 如果你没有该工具,请按照这个操作安装:虚拟机安装配置教程当然,如果你有钱,阿里云,腾讯云自己租一个也可以。
二、hello Linux
创建shell脚本,命名test,格式统一为.sh
touchtest.sh
编辑脚本:
vimtest.sh
如果你不了解vim用法,或者你的虚拟机没有安装vim,看这一篇文章前面部分:cat详细教程顺便你也可以学一下cat命令。这里大概演示一下: 先输入如下命令回车
vimtest.sh
按一下字母i键,即可编辑,我就输入hello Linux,你也可以写别的内容,不一定为英文
编辑好内容后,按一下ESC键,再输入:wq! (表示强制保存退出的意思),回车即可。
如上则是保存成功。
三、运行shell脚本
首先赋予权限:
chmod777test.sh
执行脚本:
./test.sh
演示:
四、shell变量
1)普通变量
变量就很简单,比如我我要给变量a赋值为川川帅哥,则是:
a="川川帅哥"
使用打印变量呢?
echo$a
你可以在这里把echo理解为python的print,c语言的printf之类。
现在我们还是新建一个sh来进行测试
touchtest1.sh
编辑文件:
vimtest1.sh
编辑内容如下:
操作界面如下:
你可以看到,我开始忘记给文件权限,所以执行的时候显示权限不够。所以不要忘记赋予权限。
2)只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。举个例子。 创建新的文件并编辑:
编辑内容如下:
执行则会报错:
实际上这样的变量,我们一般也不怎么用,个人认为了解一下就是。
3)删除变量
使用函数unset,跟上面操作一样,就不演示了,也是作为了解就行。
c="川川菜鸟"unsetcecho$c
以上实例执行将没有任何输出。
五、Shell 字符串
1)单双引号
字符串可以用单引号,也可以用双引号,也可以不用引号。 创建内容为:
a=川川菜鳥b="川川帥哥"echo$aecho$b
演示:
完整演示:
单引号特点:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号特点:- 双引号里可以有变量 - 双引号里可以出现转义字符
2)字符串拼接
a="chuan"b="chuan"c=" $a$b"echo$c
如下:
完整演示如下:
3)获取字符串长度
在上面的基础之上加上echo ${c}即可:
a="chuan"b="chuan"c=" $a$b"echo$cecho${c}
完整演示:
4)字符串提取
我们在前面的基础之上加上一点即可,我们主要是用切片的方法来来获取,什么是切片?如果你跟我一起学过python那你不会不知道,就不讲解了。 编辑保存内容如下
a="chuan"b="chuan"c=" $a$b"echo$cecho${c}echo${a:1:3}
即:
完整演示:
六、Shell 数组
1)读取索引数组
Shell 数组用括号来表示,元素用空格符号分割开。 sh文件内容为:
a=(AB"C"D)echo$a
即
完整演示为:
但是你是否在疑惑只输出的第一个,shell里我们不能像别的语言一样,直接输出全部,因此我们要修改一下。 改为这样:
a=(AB"C"D)echo${a[0]}echo${a[1]}echo${a[2]}echo${a[3]}
保存再次运行:
2)获取数组中的所有元素
如果想一次性全部输出,并不想通过索引来输出怎么办?使用@ 或 * 可以获取数组中的所有元素,在上面的基础上我再编辑加两行:
a=(AB"C"D)echo${a[0]}echo${a[1]}echo${a[2]}echo${a[3]}echo"數組元素依次如下:${a[@]}"echo"數組元素依次如下:${a[*]}"
完整演示:
3)获取数组的长度
在前面的基础之上加上:
echo"數組元素個數爲:${a[@]}"echo"數組元素個數爲:${a[*]}"
即
演示如下:
七、shell运算符
算术运算符
演示其中一部分,其它则类似:
a=10b=20val=`expr$a+$b`echo"a + b : $val"val=`expr$a-$b`echo"a - b : $val"val=`expr$a\*$b`echo"a * b : $val"val=`expr$b/$a`echo"b / a : $val"val=`expr$b%$a`echo"b % a : $val"if[$a==$b]thenecho"a 等于 b"fiif[$a!=$b]thenecho"a 不等于 b"fi
完整演示如下:
注意事项:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 两个反引号 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
乘号(*)前边必须加反斜杠()才能实现乘法运算;
if...then...fi 是条件语句,后续将会补充讲解。
其它运算符就不讲了,主要掌握下算数运算符。
八、Shell echo命令
你可以直接在终端输入这样的单行命令来测试学习,不用一直创建新的文件。
1)显示普通字符串
echo"hello world"
这里的双引号完全可以省略,以下命令与上面实例效果一致:
echohelloworld
完整演示如下:
2)显示转义字符
echo"\"hello world\""
演示如下:
3)显示换行
使用\n换行:
echo-e"hello\n"
演示如下:
4)显示不换行
echo-e"chuan! \c"-e开启转义\c不换行
演示:
5)显示结果重定向至文件
定向至test7.sh文件:
echo"hello world">test7.sh
演示:
6)显示执行时间
echo`date`
演示:
这里又到了最后了,补充一下printf跟echo命令是一样的作用,因此我就不演示了,统一用echo来输出。
九、Shell test 命令
1)数值测试
参数和说明如下:
-eq等于则为真-ne不等于则为真-gt大于则为真-ge大于等于则为真-lt小于则为真-le小于等于则为真
演示一个参数如下:
num1=200num2=200iftest$[num1]-eq$[num2]thenecho两个数相等!elseecho两个数不相等!fi
即:
完整演示如下:
到这里我先把前面创建的文件删了:
rm-rftest1.shtest2.shtest3.shtest4.shtest5.shtest6.shtest7.shtest8.sh
演示:
代码中的 [] 执行基本的算数运算,例如:
a=10b=10result=$[a+b]注意等号两边不能有空格echo"result結果为: $result"
完整演示如下(我新建了一个文件夹,免得打乱了):
我仅仅演示了加法,你也可以去尝试一些别的计算。
2)字符串测试
参数如下:
=等于则为真!=不相等则为真-z字符串字符串的长度为零则为真-n字符串字符串的长度不为零则为真
演示一个如下:
num1="chuan"num2="chuan"iftest$num1=$num2thenecho两个字符串相等!elseecho两个字符串不相等!fi
即:
完整演示如下:
3)文件测试
参数:
-e文件名如果文件存在则为真-r文件名如果文件存在且可读则为真-w文件名如果文件存在且可写则为真-x文件名如果文件存在且可执行则为真-s文件名如果文件存在且至少有一个字符则为真-d文件名如果文件存在且为目录则为真-f文件名如果文件存在且为普通文件则为真-c文件名如果文件存在且为字符型特殊文件则为真-b文件名如果文件存在且为块特殊文件则为真
举一个例子:
iftest-e./test1.shthenecho文件已存在!elseecho文件不存在!fi
完整演示如下:
其它参数可以自行测试。
十、shell 控制流
1)if判断流
if else fi语法格式如下:
ifconditionthencommand1command2...commandNfi
举个例子:
-gt大于则为真
测试代码如下:
a=5b=6iftest[$a-gt]thenecho大於elseecho小於fi
完整演示如下:
再来进阶测试代码如下:
a=5b=6iftest[$a==$b]thenecho等於elif[$a-gt$b]thenecho"a 大于 b"elif[$a-lt$b]thenecho"a 小于 b"elseecho"没有符合的条件"fi
完整演示如下:
2)for 循环
语法:
forvarinitem1item2...itemNdocommand1command2...commandNdone
写成一行则是:
forvarinitem1item2...itemN;docommand1;command2…done;
举例子如下:顺序输出当前列表中的数字
forain12345doecho"值依次爲: $a"done
完整演示如下:
再例如:顺序输出字符串中的字符
forstrinhellochuanchuandoecho$strdone
完整演示如下:
我们再来个进阶:打印任意数的乘法表
echo"输入一个数:"readnumfor((i=1;i<=$num;i++))dofor((j=1;j<=$num;j++))do[$j-le$i]&&echo-n"${i}*${j}=$((i*j)) "判断j是否小于i,当j大于i时不输出,输出不换行,末尾加一个制表符doneecho""输出一个换行符done
完整演示如下:
3)while循环
语法格式:
whileconditiondocommanddone
举例为:依次输出1到6
int=1while(($int<=6))doecho$intlet"int++"done
完整演示如下:
4)until 循环
until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。 语法为:
untilconditiondocommanddone
condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。 举个例子:使用 until 命令来输出 0 ~ 6 的数字
a=0until[!$a-lt6]doecho$aa=`expr$a+1`done
完整演示如下:
5)case ... esac
case ... esac 为多选择语句,与C语言中的 switch ... case 类似,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束. 语法为:
case值in模式1)command1command2...commandN;;模式2)command1command2...commandN;;esac
举例:提示输入 1 到 4,与每一种模式进行匹配
echo输入1到4之间的数字:echo你输入的数字为:readacase$ain1)echo你选择了1;;2)echo你选择了2;;3)echo你选择了3;;4)echo你选择了4;;*)echo你没有输入1到4之间的数字;;esac
完整演示如下:
6)跳出循环
breakbreak命令允许跳出所有循环(终止执行后面的所有循环)。 测试代码如下:
doecho-n"输入 1 到 5 之间的数字:"readaNumcase$aNumin1|2|3|4|5)echo"你输入的数字为 $aNum!";;*)echo"你输入的数字不是 1 到 5 之间的! 游戏结束"b
完整演示如下:
continuecontinue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。 测试代码为:
while:doecho-n"输入 1 到 5 之间的数字: "readaNumcase$aNumin1|2|3|4|5)echo"你输入的数字为 $aNum!";;*)echo"你输入的数字不是 1 到 5 之间的!"continueecho"游戏结束";;esacdone
完整演示如下:
是不是有人想问我怎么结束呢?ctrl+c强制结束即可。
十一、Shell 函数
花里胡哨的语言我就不说了,来看一个demo函数:
demoFun(){echo"測試一下我的函數!"}echo"函数开始执行"demoFunecho"-函数执行完毕"
如果你学过别的语言,你一定一眼就看懂了。 完整演示如下:
到这里我再插入一个例子:从键盘读入10个数,显示最大值和最小值 代码为:
printf"请输入十个数字: "readbiggest=$(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"输入第一个数字: "readaNumecho"输入第二个数字: "readbNumecho"两个数字分别为 $aNum 和 $bNum !"return$(($aNum+$bNum))}addecho"输入的两个数字之和为 $? !"
完整演示如下:
十二、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-lwen
如果我们用重定向的方式,将输入重定向到 wen文件:
wc-l<wen
演示为:
3)Here Document
Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。 语法为;
command<<delimiterdocumentdelimiter
举个例子:
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
mkdirwork
2.切换目录
cdwork/
完整演示:
3.创建并编辑新文件
touchfile1
编辑文件
vimfile1
查看文件:
catfile
完整演示:
4.创建另一个文件 同样的道理,完整演示如下:
5.重定向到file3文件
catfile1file2>>file3
完整演示如下:
6.将file1的内容追加到文件file3
catfile1>>file3
完整演示如下:
②管道: 统计文件file3中出现hello的行数并显示
grepHellofile3|wc-l
演示如下:
③管道和输入输出重定向: 进入目录/home/student,用ls –l长格式的方式列出当前目录下的文件和目录,并将其前5条信息保存到文件list中。 创建新文件夹,并编辑list.txt内容如下:
file1file2file3file4file5file6file7
完整演示:
查看一下:
查看当前目录下文件和目录
ls-al
演示:
筛选前5的数据加到file3中:
ls-l|head-n5>>list.txt
完整演示如下:
2)shell练习题
① 在/home目录中创建50个目录,目录名称依次为:a1,……,a50; 创建一个sh文件:
touch1.sh
内容为:
i=1while[$i-le50]domkdira$ii=$((i+1))done
完整演示:
② 编写一个程序,它的作用是:先查看一下/root/test/logical这个名称是否存在。若不存在,则创建一个文件,使用touch来创建,创建完成后离开;如果存在,判断该名称是否为文件,若为文件,则显示其行数;如果不是文件,则离开; 创建2.sh
touch2.sh
内容为:
if[!-e/home/yifan/maying/shell/case5/logical]thentouchlogicalelif[-f/home/yifan/maying/shell/case5/logical]thenrm-f/home/yifan/maying/shell/case5/logical&&mkdir/home/yifan/maying/shell/case5/logicalelif[-d/home/yifan/maying/shell/case5/logical]thenrm-r/home/yifan/maying/shell/case5/logicalfi
演示如下:
查看一下:
③编写一个shell脚本,从键盘读入10个数,显示最大值和最小值
printf"请输入十个数字: "readbiggest=$(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"输入一个数:"readnumfor((i=1;i<=$num;i++))dofor((j=1;j<=$num;j++))do[$j-le$i]&&echo-n"${i}*${j}=$((i*j)) "判断j是否小于i,当j大于i时不输出,输出不换行,末尾加一个制表符doneecho""输出一个换行符done
完整演示如下:
十四、总结
本篇文章写得很详细,不管你是不是零基础,相信你都能看懂,本文主要在一些基础知识讲解,并没有太多的进阶,本人主要是为了完成作业学习这个,这些内容已经足够我完成作业了。 这是私人小窝,进来请注明自己进群理由,我不希望不爱学习的人进来:
如果对你有帮助,希望你支持一下,本篇文章内容虽然不是非常多,写了我好久。操作系统必备知识,所以你一定要掌握。 如果你想要本篇文章的电子版,你可以关注公众号:川川菜鸟 发送:shell教程 演示:
最后希望大家能够好好学习,天天向上!
0 留言