一、shell概述

  1.概述

  命令行解释器(壳,也就是我们的操作界面),计算机只认识0101的二进制,我们需要通过ASCII表来进行翻译

  较为官方的解释是:

    Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

    Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

  

    2.shell分类

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)——标准shell,bash
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)
  • ……

   3.指令换行

  当一行指令太长希望两行+来进行显示时,可以使用反斜线“\”后面再接“Enter”,这样就把enter的执行指令的意义进行了转义了!

二、脚本执行方式

  先介绍几个相关的命令:

    1.输出命令:echo

   变量的概念:

  echo可以输出“变量”的值,变量在Linux中一般为大写,例如PATH,HOME,读取时只需要加上$前缀即可,例如:echo $PATH 

当然也可以使用大括号,例如:echo ${PATH}——有点像JSP等的EL表达式,推荐!

   设置一个变量:

  直接通过等于号可以新建并给一个变量赋值:(=前后请勿加空格)

  

  新增变量内容,使用${}/xx,例如:PATH=${PATH}:/home——PATH采用冒号进行分割!

  其他变量规则,参考:(双引号可以保留原内容$PATH还是PATH变量的值,而单引号仅仅保留字面意思)

    关于linux中${}与$() 和``的区别,参考:http://blog.csdn.net/number_0_0/article/details/73291182

变量的设置规则
变量与变量内容以一个等号“=”来链接,如下所示: “myname=VBird”
等号两边不能直接接空白字符,如下所示为错误: “myname = VBird”或“myname=VBird
Tsai”
变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
“2myname=VBird”
变量内容若有空白字符可使用双引号“"”或单引号“'”将变量内容结合起来,但
双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示: “var="lang is
$LANG"”则“echo $var”可得“lang is zh_TW.UTF-8”
单引号内的特殊字符则仅为一般字符 (纯文本),如下所示: “var='lang is
$LANG'”则“echo $var”可得“lang is $LANG”
可用跳脱字符“ \ ”将特殊符号(如 [Enter], $, \, 空白字符, '等)变成一般字符,如:
“myname=VBird\ Tsai”
在一串指令的执行中,还需要借由其他额外的指令所提供的信息时,可以使用反单引
号“ 指令 ”或 “$(指令)”。特别注意,那个 ` 是键盘上方的数字键 左边那个按键,而不
是单引号! 例如想要取得核心版本的设置: “version=$(uname -r)”再“echo
$version”可得“3.10.-.el7.x86_64”
若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:
“PATH="$PATH":/home/bin”或“PATH=${PATH}:/home/bin”
若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量: “export
PATH”
通常大写字符为系统默认变量,自行设置变量可以使用小写字符,方便判断 (纯粹依照
使用者兴趣与嗜好) ;
取消变量的方法为使用 unset :“unset 变量名称”例如取消 myname 的设置: “unset
myname”

  取消变量:

  unset 变量名

  可以通过变量简化很多操作,例如通过变量设置很长的路径,cd就不用记忆那么长的变量名了!cd ${work}

  查看所有变量:env

  输出环境变量:export命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。

  变量中的单双引号的用法,参考:https://www.lookmw.cn/doc/oravni.html

  判断与替换:username=${username-root}:关键在于那个减号-,若username为空,则使用root,若不为空,则使用本身!

  来自: http://man.linuxde.net/export

  更多变量小结,参考:https://www.cnblogs.com/jonathanlin/p/4063205.html

  实例1:

    加入-e选项便可以使用控制字符,可以控制格式:

  实例2:

  其它echo特性,例如输出十六进制,输出颜色等这里暂不展开

  第一个shell脚本

  #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

  第二行是注释,后面则是脚本内容,此处是输出

 三、Bash基本功能

  1.命令的别名与快捷键

    查看别名:

  实例:

//比如我们常见的ls之所以有颜色是因为它后面 的参数 --color=auto,真实的ls是没有颜色的

    设置别名

  只要我们遵循上面 的别名的规则,便可以设定自己的别名

  实例:

    当然,这样的别名设置时当前的,当重启或者注销后,别名无效,永久设置别名方式如下:

  实例:

  这样设置后是不能立即生效的,需要注销重新登陆,立即生效需要使用如下命令:

  删除命令也是,直接删除是临时删除,配置文件中存在下次还是会有效,需要删除对应配置文件中存在的

  思考别名和原命令一致时哪个优先级高呢?(别名,例如 rm rm -i ,直接rm,执行的是别名),所以要覆盖时才要定义重名别名

  alias是别名,例如ls是带颜色的ls的别名,那我怎么知道执行的是哪个顺序呢,别名或者本名呢,通过 type -a ls就可以查看了!

  Bash中常见快捷键

  //比如Ping时会一直Ping,强制终止可以使用 ctrl+c

  //还有快速跳光标的 ctrl+u等删除整行的快捷键

  2.历史命令

    其实我们已经知道通过按↑↓箭头来调用历史命令(很早之前的老版本是没有这个功能的),接下来我们把历史命令相关的都先过一遍:

  history

  比如查看所有历史命令:history ,清空历史命令 history -c,删除等需要将缓存中的写入文件 history -w

  注意,历史命令是文本格式,无需担心历史命令的资源占用,可不清空。

  实例:

    当然 ,历史命令默认是只保存1000条的:

  //只需修改HISSIZE即可

  调用历史命令

  //其中的n就是上面历史命令前的编号

  实例:

  一般来说使用频率也不高,因为不可能先查所有历史,再一个个翻,再执行,使用 !字符串形式,可以比较方便执行最后的一条以该字符串开头的命令

  实例:

  自定义登录信息https://jingyan.baidu.com/article/95c9d20d5aa836ec4f756142.html

  使用root定义通知信息,使得所有登陆者可以查看到:可以将讯息加入 /etc/motd 里面去!

  3.文件与命令补全

    单击Tab补全唯一选项

    双击 Tab 列出所有

    用于命令与文件路径排错等,若按Tab无反应,则应检查输入是否正确

  4.输出重定向

    常见输入输出设备

  //一切皆文件的思想(shell中使用0 1 2 来描述,方便使用)

    输出重定向:

  将本来输出到显示器上的输出到文件中,这样就不用一直看着屏幕,只需要合适的时间查看,有点类似日志记录

    实例:

  直接敲命令,回车,则是在屏幕上显示:

  我们使用输出重定向进行输出(cat查看文件内容):

  //当然,这里的date > testdate.log也需要按回车,我们可以使用windows和Linux中都有的——定时任务

  如果不想覆盖,想追加,需要双>,即 date >> testdate.log

  如要记录错误输出,可以加上错误的描述符2(告诉系统我要犯2了),这里我们顺便测试一下追加,实例如下:

// 前面的date是之前的正确输出,错误输出的 > 左右不能有空格

  当然了,这里出现的问题是,我必须得明确知道命令得正误,才能正确写入文件,但如果我都知道会出错了,那我干嘛还要写这个命令呢,所以这个命令得使用是及其有限得,我们应当使用无论正误都同时保存得方式:

  实例:

  当然,这里使用得是上面的较为复杂一点的格式,我们也可以使用相同功能的 命令 &>> 文件 的简化形式

  有时候一些结果不想显示,可以扔到“黑洞”:/dev/null,这类似与垃圾站

  我们再来试试,正确日志与错误日志分开保存的命令:

//错误输出追加写道了错误日志

  输入重定向

  实例:

//按 ctrl +D,结束统计

//成功统计了 2 行,4 个单词(依靠空格来区分),22个字节

  

//输入的重定向使用的相对少一些(和输出的 >相对的 <)

  实例:(这里省略了 < ,可以使用 wc < err.log)

  5.管道符

  先介绍几个多命令顺序执行的符号:

  实例:

  //使用 ; 无论某个命令是否报错,后续命令都会执行,命令之间无逻辑,可以通过逻辑操作来使得其同时正确等,请仔细查看逻辑操作后得说明

  实例:

//正确打印 yes 错误打印 no

  管道符

//注意是正确输出才作为对象

  可以结合cut或者grep来进行管道符的操作,示例见下文,关于grep的介绍,参见搜索命令:http://www.cnblogs.com/jiangbei/p/7977832.html

  实例:

这样 前一个 ls 命令得结果就作为 more 操作的对象(也就是more显示的内容),更多 more 的操作请参见手册

  实例:

  //前一个命令查看网络连接(后续补充),后一个命令根据字符串查找(之前已经介绍),查看的是前一个命令结果中的所有网络连接的被连接的(LISTEN表示被监听,等待连接)

  当然,也可以双管道符:

  上一个实例的结果作为 wc 的统计对象(此处表示服务器有多少人登陆)

cat /etc/passwd | wc -l

  7.通配符

  实例:

  先建立示例目录与文件:

  *与?:

//注意 * 是任意内容,而?是任意一个字符

  []

  //注意,若使用 ls dr[^0-9] 则只能匹配dr后面是一个字符,并且非数字的,这里需要紧扣概念,[]匹配一个字符

  若要匹配文件内容,应当使用——正则表达式

 Bash其它特殊字符:

  实例:单双引号

  这里需要注意单双引号的区别和特殊符号的使用

  实例:反引号

  //这里意思是将ls结果复制给aa,再打印此变量

  当然,反引号还是没有我们使用的 $() 方便

  实例:转义 \

Linux入门第四天——shell基础的更多相关文章

  1. Linux入门第五天——shell脚本入门(上)基本概念

    一.什么是shell脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序. 二.shell入门 1.先导知识 变量知识补充:https://www.cnblogs. ...

  2. Linux入门第五天——shell脚本入门(下)基础语法之循环

    一.循环 1.不定循环 有两种形式: while [ condition ] <==中括号内的状态就是判断式 do <==do 是循环的开始! 程序段落 done <==done 是 ...

  3. Linux入门第五天——shell脚本入门(中)基础语法之判断与条件

    一.判断式 利用 test 命令进行执行结果的判断(例如判断是否存在该文件):关于test  test:test 示例:结合回传值 $? 进行判断:关于$?:$? [root@localhost tm ...

  4. Linux入门第五天——shell脚本入门(下)基础语法之调试debug

    一.如何debug 1.通过sh命令的参数: sh [-nvx] scripts.sh 选项与参数: -n :不要执行 script,仅查询语法的问题: -v :再执行 sccript 前,先将 sc ...

  5. TYUT程序设计入门第四讲练习题题解--数论入门

    程序设计入门第四讲练习题题解--数论入门 对于新知识点的学习,需要不断地刷题训练,才能有所收获,才能更好地消化知识点. 题组链接: 程序设计入门第四讲练习题--数论 by vjudge 题解: A. ...

  6. Kotlin入门第四课:简单工厂模式

    Kotlin基础知识的学习,请参考之前的文章: Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次尝试用Kotlin实现Android ...

  7. JavaMail入门第四篇 接收邮件

    上一篇JavaMail入门第三篇 发送邮件中,我们学会了如何用JavaMail API提供的Transport类发送邮件,同样,JavaMail API中也提供了一些专门的类来对邮件的接收进行相关的操 ...

  8. Linux零基础入门第四课

    根据直播讲义整理的内容,从第四课开始.前三课的内容若后面有精力会一并整理进来. 文件的基本操作(上) 创建.删除.复制.移动和重命名 touch命令创建文件 语法 >$ touch file0 ...

  9. 大数据入门第四天——基础部分之轻量级RPC框架的开发

    一.概述 .掌握RPC原理 .掌握nio操作 .掌握netty简单的api .掌握自定义RPC框架 主要内容 1.RPC是什么 RPC(Remote Procedure Call)—远程过程调用,它是 ...

随机推荐

  1. December 14th 2016 Week 51st Wednesday

    Everything has its time and that time must be watched. 万物皆有时,时来不可失. Everything has its time, and I r ...

  2. Python中readline()函数 去除换行符

    从Python中readline()函数读取的一行内容中含有换行符\n,很多时候我们需要处理不含有换行符的字符串,此时就要去掉换行符\n. 方法是使用strip()函数. 例子如下: f = open ...

  3. Java遇到的问题、错误——持续更新

    内容:dead code.关于eclipse没有js代码提示的解决 持续更新 ######################################################## dead ...

  4. MAC软件工具下载

    CRThttps://www.cnblogs.com/codegeekgao/p/8277015.html navicathttp://xclient.info/search/s/navicat/?t ...

  5. CentOS7.X安装Redis-4.0.8以及Redis集群搭建

    安装redis 安装前的准备 yum install \ vim \ wget \ make \ gcc \ gcc-c++ \ automake \ autoconf \ -y \ 下载解压并安装 ...

  6. 渲染、render与绘制

    渲染是抽象到具体的过程: 抽象:图片信息的描述(比如一条线:两个端点的位置.线粗.颜色等特征): 具体:依据抽象信息得到的可视图片(绘制过程). 渲染是中文翻译的问题,有种添油加醋的感觉.直意就是交与 ...

  7. 【CSS】iconfont的使用

    说到浏览器对@font-face的兼容问题,这里涉及到一个字体format的问题,因为不同的浏览器对字体格式支持是不一致的,这样大家有必要了解一下,各种版本的浏览器支持什么样的字体,前面也简单带到了有 ...

  8. multimap详讲

    multimap和map的区别: 首先认识一下multimap和map的区别: 1>        multimap不提供operator[ ]运算符.因为这个运算符的语义在同一个键可以保存多个 ...

  9. Java并发基础概念

    Java并发基础概念 线程和进程 线程和进程都能实现并发,在java编程领域,线程是实现并发的主要方式 每个进程都有独立的运行环境,内存空间.进程的通信需要通过,pipline或者socket 线程共 ...

  10. 人人开源之代码生成器(renren-generator)

    本篇文章,主要包含三个部分,介绍.代码生成演示.代码分析(不会很深入)等 三个部分足以让你学会使用,实际生产可能遇到的问题不会在这遇到. 代码生成器的作用在于提高开发效率.但是这个代码生成器仍有其局限 ...