当前位置: 首页 > 科技观察

经典的Shell脚本十三问你应该知道

时间:2023-03-19 19:53:46 科技观察

经典的Shell十三问1.为什么叫shell?2、Shell提示符(PS1)和回车符(CR)的关系?3.别人回声的时候你也回声,你对回声了解多少?4.""(双引号)和(单引号)有什么区别?5.var=value有什么区别?出口之前?6、exec和source有什么区别?7.()和{}有什么区别?8.(())和()和${}有什么区别?9.@和*有什么区别?10.&&和||z有什么区别?11.>和<有什么区别?12.你要if还是case?13.forwhat和forwhat有什么区别?而直到?1、为什么叫壳?我们知道计算机的运行离不开硬件,但是用户却不能直接对硬件进行操作。硬件的驱动程序只能由一种叫做操作系统(OS,OperatingSystem)的软件来控制。严格来说,linux只是一个操作系统(OS),我们称之为内核(kernel)。用户没有办法直接操作内核,而是通过内核的shell程序,也就是shell与内核进行通信。shell是用户与系统的交互界面,只允许用户通过命令行使用系统来完成工作。因此,shell最简单的定义就是——命令解释器(CommandInterpreter):将用户的命令翻译给内核进行处理;同时,将核心处理结果翻译给用户。不同的操作系统使用不同的内核;在同一个内核上,也可以使用不同的shell。常见的外壳包括sh;狂欢;csh;ksh;etc.2.Shell提示符(PS1)和回车符(CR)的关系?Success登录shell终端后,光标左侧部分称为提示符。一般一般用户使用$,管理员用户root使用#shell提示:可以输入命令。回车:命令可以执行。从技术细节来看,shell会将命令行输入的文本按照IFS(InternalFieldSeperator)拆解成“字段”(word/field)。然后先处理特殊字符(meta),最后重新组织整个命令行。3、别人echo,你也echo,你对echo了解多少?echo向标准输出(stdout)发送参数,通常显示在屏幕上stdin标准输入stdout标准输出stderr标准错误输出echo-n#取消换行echo-e#启用反斜杠翻译4.""(double引号)和(单引号)?硬引号:''(单引号),关闭所有引号软引号:""(双引号),保留$引号5.var=value?出口前后的区别在哪里?变量定义:name=value,等号左右不能使用分隔符。变量替换:echo${name}exportvariable:exportname=value,使变量成为环境变量#LocalvariableA=B#cancelvariableunsetA#EnvironmentvariableexportA=B6.exec和source有什么区别?环境变量只能以一种方式从父进程传递到子进程。也就是说:子进程中环境如何变化,不会影响到父进程的环境。当我们执行一个shell脚本的时候,其实是先生成一个sub-shell的子进程,然后这个sub-shell再生成一个命令行的子进程。#创建一个子shell来执行脚本。/sh#当前shell执行sourcesh#当前shell执行并退出execsh7。()和{}有什么区别?()将命令组放在子shell中执行{}是在同一个shell中完成的。8.(())和()和${}有什么区别?$()和``(反引号)都用于命令替换。${var}和$var都用于变量替换。#假设我们定义一个变量为:file=/dir1/dir2/dir3/my.file.txt#我们可以用${}分别替换得到不同的值:#非贪心(最小匹配)左删除shell字符串${file#*/}#删除第一个/及其左边的字符串:dir1/dir2/dir3/my.file.txt${file#*.}#删除第一个.anditsleftString:file.txt#贪心(最大匹配)leftdeletionofshellstring${file##*/}#去掉最后一个/和左边的字符串:my.file.txt${file##*.}#删除最后一个.及其左边的字符串:txt#非贪婪(最小匹配)右删除shell字符串:${file%/*}#去掉最后一个/及其右边的字符串:/dir1/dir2/dir3${file%.*}#删除最后一个.和右边的字符串:/dir1/dir2/dir3/my.file#贪心(最大匹配)右删除shell字符串:${file%%/*}#去掉第一个/和它右边的字符串:(空值)${file%%.*}#删除第一个.和它右边的字符串:/dir1/dir2/dir3/我记忆中的方法是:#是去掉左边(#在键盘$左边)%是去掉右边(%在键盘上$)右边的键盘单个符号为最小匹配;两个符号是最大匹配。#shellstringsubstring:${file:0:5}:提取最左边的5个字节:/dir1${file:5:5}:提取第5个字节右边的5个连续字节:/dir2#shell的替换字符串变量值:${file/dir/path}:将第一个目录替换为路径:/path1/dir2/dir3/my.file.txt${file//dir/path}:将所有目录替换为路径:/path1/path2/path3/my.file.txt#${}也可以给变量的不同状态赋值(未设置、空、非空):${file-my.file.txt}:如果$file未设置,使用my.file.txt作为返回值。(不处理空值和非空值)${file:-my.file.txt}:如果$file未设置或为空,则使用my.file.txt作为返回值。(不为空则不处理)${file+my.file.txt}:如果$file设置为空或非空,返回值为my.file.txt。(不设置则不处理)${file:+my.file.txt}:如果$file不为空,则使用my.file.txt作为返回值。(不设置或为空则不处理)${file=my.file.txt}:如果不设置$file,则使用my.file.txt作为返回值,将$file赋值给my。文件.txt。(空值和非空值不处理)${file:=my.file.txt}:如果$file没有设置或者为空,则使用my.file.txt作为返回值,并且$file赋值是我的.file.txt。(不为空则不处理)${file?my.file.txt}:如果$file没有设置,输出my.file.txt到STDERR。(不处理空值和非空值)${file:?my.file.txt}:如果$file未设置或为空,则将my.file.txt输出到STDERR。(不为空则不处理)tips:以上理解是必须区分unset、null、non-null这三种赋值状态。一般来说,:与null有关。如果没有:,null不受影响,如果有:连null也受影响。#计算shell字符串变量的长度:${#var}${#var}可以计算出变量值的长度:${#file}可以得到27,因为/dir1/dir2/dir3/my.file.txt正好是27个字节...#bash数组(array)处理方法array:A=(abcd)引用array:${A[@]}${A[*]}获取数组成员${A[0]}计算数组长度${#A[@]}${#A[*]}数组重新赋值A[2]=xyz#$(())使用a=5;b=7;c=2;echo$((a+b*c))9.@和*有什么区别?"$@"可以得到"p1""p2p3""p4"这三个不同的词组"$*"可以得到"p1p2p3p4"这整串单词组10.&&and||区别在哪里?测试命令有两种形式testexpression[expression]bash的test目前支持三种测试对象string:stringinteger:integerfile:file当表达式为真时,返回0(true),否则返回非零(false)command1&&command2#command2只在command1的RV为0(true)时执行。命令1||command2#command2只有当command1的RV不为0(false)时才会执行。先替换变量再比较A=123[-n"$A"]&&(["$A"-lt100]||echo"toobig")unsetA11。>和<有什么区别?0:标准输入(STDIN)1:标准输出(STDOUT)2:标准错误输出(STDERR)我们可以使用<来改变数据通道(stdin)从指定的文件中读取。我们可以使用>改变发送的数据通道(stdout,stderr),使其输出到指定的文件。lsmy.fileno.such.file1>file.out2>file.err#2>&1是将stderr合并到stdout输出lsmy.fileno.such.file1>file.out2>&1#/dev/nullemptylsmy.fileno.such.file>/dev/null2>&1catfile#在IO重定向中,stdout和stderr的管道将在从stdin读取数据之前准备好。#也就是说在上面的例子中,>file会先清除文件,然后再读入