shell是用户与系统交互的界面,这是基本方式之一。标准的shell为bash。

shell的操作:

  1. 显示所有使用过的命令:history。
  2. 执行最近执行过的一条指令:!!。首先会给出执行的是哪一条指令,然后就是运行效果。
  3. 执行history中的,第n条指令:!n。
  4. 执行history中,以value字符串开头的命令:!value。
  5. 打印出history中,最后一条指令:!!:p。
  6. 获得上条指令的最后一个参数:!$。例如先执行cat first.c,用!$就可获得first.c,所以就可以直接使用,像这样ls !$。

元字符:预先定义好的、具有特殊意义的字符——shell会先找到这些元字符,并把它特殊化,完成之后再执行。

常用的元字符:

通配符:*匹配任意字符串、?匹配单个任意字符、[123]匹配方括号里面任意一个字符。

命令替换:`command`=$(command):将字符串转换成命令来执行。

命令组合执行:用;和(),例如date;who和(date;who)。

条件执行,命令序列:用||和&&,例如date||who,||的作用是前一个命令失败,才会执行下一个命令,所以这条命令只执行了date;date&&who,&&的作用是前一个命令执行成功,才会执行下一个命令,所以date和who都执行了。

因为shell默认会把变量当作字符串,所以要引用变量的值$:例如在终端,先a=10,然后用$a就可以获得变量a的值,所以echo $a,会打印出10。所有变量都要这样使用。

shell的输入输出:即标准设备文件。0为输入,1为输出。每个进程都会打开这三个文件。

输入、输出重定向:>将标准输出重定向到指定文件,>>标准输出追加到文件;<标准输入重定向到文件,<<标准输入追加到文件。(追加不会导致重定向)

重定向的举例:

输入的重定向:首先我们可以先向一个测试文件写入一些测试文字,然后在终端输入命令:cat < 测试文件,就可以将之前的测试文字,打印在终端了。

输出的:例如who > test.c。

追加暂时就不管了。

管道(特殊的重定向):前一个命令的输出,作为下一个命令的输入(输入就是说,如果这个命令还没有写完,所以需要继续输入,那么就将管道的另一端作为这个输入)。如,who | wc -l统计用户数。

shell的编程:

脚本:存储一系列等待执行的命令。可以用脚本执行大量但是又重复的工作。

特点:shell是解释语言,无需编译,但执行速度慢。支持正则。建立脚本后,要运行脚本,有两种方式:1、更改脚本权限为可执行,./脚本。2、强制运行:. 脚本,或者这样写:source 脚本。

shell预定义的环境变量,下面给出常用变量和其值:HOME(用户主目录,就是桌面上那个XXX' Home)、PATH(shell中命令的位置,就是各个环境变量的集合,用:分隔)、USER(当前终端的用户)。而查看所有的环境变量,就用env或者set。

自定义环境变量:export 变量名。引用时,不要加上$符号,因为此时不需要的是变量的值,而是变量本身。

预定义变量:

引用位置参数:$1—$9。位置参数个数:$#。获得所有位置参数:$@或者$*。shift:所有参数向左移(左移实际上是将左边第一个参数销毁,而且$#也会-1)。产生一个随机数:$RANDOM。

获得上一个命令或函数执行后,的返回值$?:

test()
{
return
} test
echo $?

脚本中,局部变量创建:变量名=值;清除局部变量:unset 变量名。查看局部变量:

表达式的写法:((表达式)),只有这样写,才认为是表达式。

使用表达式:r=`expr 表达式`;r=$((表达式));r=$[表达式],还有一种高级的,let r=表达式。

if语句:

if 条件测试
  then
  条件为真时的命令串
  else
  条件为假时的命令串
fi
//例如
answer=10
read answer  //将标准输入保存到answer
if (($answer==0))
then
echo success
else
echo fail
fi

case_in语句(类似于switch case):

#!/bin/bash
echo Enter A,B,C
read letter
case $letter in
A|a) echo you entered A;
;;
B|b) echo you entered B;
;;
C|c) echo you entered C
;;
*) echo not A,B,C
esac

for循环(只有for_in):

//例如
for i in 0 1 2 3 4 5 6 7 8 9
do
echo $i
done

while循环:由for循环,可以看出do和done之间是,循环体;再结合if,就可以写出while。还有一种until,写法和while一样,区别在于while是直到条件不满足,才停止循环;而until相反,直到条件满足,才停止循环。

函数(如果是extern 函数,则说明是全局函数,即可以被子shell使用):

test()
{
false
return 100 //如果不写返回值(像这样:return) , 那么返回最近一次命令或函数的返回值 , 而且返回值在[0 , 255]之内,超过则"循环";返回值是不能通过赋值获得的,只能用$?
}
test  //在这里写函数的参数列表
echo $?

函数共享:

将函数定义在一个单独的文件中,然后在使用该函数的脚本的开头用". 函数文件名"和"source 函数文件名"来读取文件,然后就可以使用函数了。

Linux之shell篇的更多相关文章

  1. 使用C#给Linux写Shell脚本(下篇)

    在上篇的<使用C#给Linux写Shell脚本>结尾中,我们留下了一个关于C#如何调用BashShell的问题.在文章发布之后,我留意到有读者留言推荐使用“Pash”(一款类PowerSh ...

  2. 轻松学习Linux之Shell文件和目录属性详解

    轻松学习Linux之Shell文件和目录属性详解 轻松学习Linux之理解Sitcky 轻松学习Linux之理解umask 轻松学习Linux之理解SUID&SGUID 本系列多媒体教程已完成 ...

  3. linux自动启动shell和init概述(fedora use systemmd now!!!)

    linux运行级别  linux启动之后会在一个级别运行,下面列出了这些运行级别: 0 系统停止 1 单用户系统,不需要登陆 2 多用户系统但不支持NFS,命令行模式登陆 3 完整多用户模式,命令行模 ...

  4. Linux工具参考篇(网摘)

    Linux工具参考篇 原文出处:[Linux Tools Quick Tutorial] 1. gdb 调试利器 2. ldd 查看程序依赖库 3. lsof 一切皆文件 4. ps 进程查看器 5. ...

  5. Linux系列教程(二十)——Linux的shell概述以及如何执行脚本

    从这篇博客开始,我们将进入Linux的shell脚本的学习,这对于Linux学习爱好者而言是特别重要的一节,也是特别有意思的一节,shell 脚本就像我们知道的Java,php类似的编程语言一样,通过 ...

  6. .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础

    基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...

  7. [转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法

    [From] https://www.zmrbk.com/post-2030.html https://blog.csdn.net/suifengshiyu/article/details/40952 ...

  8. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...

  9. linux初学者-进程篇

    linux初学者-进程篇 不管是windows还是linux,都有进程,那么什么是进程呢?进程就是cpu未完成的工作.下面会介绍一些关于系统中进程的查看以及管理的方法. 1.命令 1.1.命令使用 查 ...

随机推荐

  1. iOS开发之Alamofire源码解析前奏--NSURLSession全家桶

    今天博客的主题不是Alamofire, 而是iOS网络编程中经常使用的NSURLSession.如果你想看权威的NSURLSession的东西,那么就得去苹果官方的开发中心去看了,虽然是英文的,但是结 ...

  2. Android开发之基于AndroidStudio环境搭建和工程创建

    断断续续的学习安卓也有一段时间了.因为之前是搞iOS开发的, 之前有关iOS的博客请看<我的iOS开发系列博文>.<我的Objective-C系列文章>和<窥探Swift ...

  3. YYModel 源码解读(二)之YYClassInfo.h (3)

    前边3篇介绍了YYClassinfo 文件的组成单元,算是功能的分割,按照业务的设计思想来说,方向应该是相反的 由此引申出我们在设计api的思想其实和项目管理是很类似的----- 一些题外话 1.目的 ...

  4. Notepad2替代系统自带的记事本

    事情是这样的,平时我经常把一些文字复制到记事本中编辑好了再复制到目标位置,可以在系统自带的记事本中替换删除一些内容,记事本小巧,占用很少的资源,我很喜欢:但今天复制的内容中有很多数字和一些我不想要的内 ...

  5. 【Android】 修复ijkPlayer进行m3u8 hls流播放时seek进度条拖动不准确的问题

    项目中使用的播放器是ijkPlayer,发现播放切片特点的hls流(m3u8格式的视频)拖动seekBar的时候会莫名的跳转或者seek不到准确的位置,发现网友也遇到了同样的问题,ijk的开发者也说明 ...

  6. 小萝贝控机大师工具推荐(一款在PC就能控制手机界面的工具)

    在一次写博客的过程中,要截取手机app上的几张图片,然后粘贴到博客里面去,不了解这个工具的时候,我就从手机上截图(使用其他的截图app或者使用手机自己的截图功能),然后再传送到电脑上,然后再放到博文中 ...

  7. 使用PowerShell 监控运行时间和连接情况

    概念 Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境.你可以把它看成是命令行提示符cmd.exe的扩充,不对,应当是颠覆. powershell需要.N ...

  8. 数据库进阶之路(五) - MySQL行锁深入研究

    由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统:假设id=1的这本书库存为1,但是有2个人同时来借这本书,此处的逻辑为: ; --如果restnum大于0,执行u ...

  9. arcengine中自定义工具和自带工具条(ICommand)点击后和其他工具使用的冲突

    自己系统中本身对于放大缩小等功能直接是单独重写的,但是如果在加一个工具条具有相同功能的话两者之间会有一些冲突,为解决该冲突可以重写工具条的OnItemClick事件 该工具条命名为axTool 我本身 ...

  10. Java--String 和StringBuilder、StringBuffer 的区别?

    1.String是只读字符串,引用的字符串内容是无法改变的. 2.StringBuffer和StringBuilder的字符串对象可以直接进行修改. 3.StringBuilder没有被synchro ...