Linux入门第四天——shell基础
一、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基础的更多相关文章
- Linux入门第五天——shell脚本入门(上)基本概念
一.什么是shell脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序. 二.shell入门 1.先导知识 变量知识补充:https://www.cnblogs. ...
- Linux入门第五天——shell脚本入门(下)基础语法之循环
一.循环 1.不定循环 有两种形式: while [ condition ] <==中括号内的状态就是判断式 do <==do 是循环的开始! 程序段落 done <==done 是 ...
- Linux入门第五天——shell脚本入门(中)基础语法之判断与条件
一.判断式 利用 test 命令进行执行结果的判断(例如判断是否存在该文件):关于test test:test 示例:结合回传值 $? 进行判断:关于$?:$? [root@localhost tm ...
- Linux入门第五天——shell脚本入门(下)基础语法之调试debug
一.如何debug 1.通过sh命令的参数: sh [-nvx] scripts.sh 选项与参数: -n :不要执行 script,仅查询语法的问题: -v :再执行 sccript 前,先将 sc ...
- TYUT程序设计入门第四讲练习题题解--数论入门
程序设计入门第四讲练习题题解--数论入门 对于新知识点的学习,需要不断地刷题训练,才能有所收获,才能更好地消化知识点. 题组链接: 程序设计入门第四讲练习题--数论 by vjudge 题解: A. ...
- Kotlin入门第四课:简单工厂模式
Kotlin基础知识的学习,请参考之前的文章: Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次尝试用Kotlin实现Android ...
- JavaMail入门第四篇 接收邮件
上一篇JavaMail入门第三篇 发送邮件中,我们学会了如何用JavaMail API提供的Transport类发送邮件,同样,JavaMail API中也提供了一些专门的类来对邮件的接收进行相关的操 ...
- Linux零基础入门第四课
根据直播讲义整理的内容,从第四课开始.前三课的内容若后面有精力会一并整理进来. 文件的基本操作(上) 创建.删除.复制.移动和重命名 touch命令创建文件 语法 >$ touch file0 ...
- 大数据入门第四天——基础部分之轻量级RPC框架的开发
一.概述 .掌握RPC原理 .掌握nio操作 .掌握netty简单的api .掌握自定义RPC框架 主要内容 1.RPC是什么 RPC(Remote Procedure Call)—远程过程调用,它是 ...
随机推荐
- CentOS 6 各种启动文件损坏及修复
stage1 mbr的破坏和恢复 清空mbr 前446字节 dd if=/dev/zero of=/dev/sda bs=1 count=446 如果没有挂载启动光盘,会显示这样 如果启动前挂载了光盘 ...
- codeforces 420D Cup Trick
codeforces 420D Cup Trick 题意 题解 官方做法需要用到线段树+平衡树(? 如果数据小的话似乎可以用莫队).然后代码好长好长.我补了一个只要用到树状数组的做法. 代码 #inc ...
- ECharts.js学习(三)交互组件
ECharts.js 交互组件 ECharts.js有很多的交互组件,一般经常用到的组件有这些: title:标题组件,包含主标题和副标题. legend:图例组件,展现了不同系列的标记(symbol ...
- mac 学习笔记
1.关于launchctl http://zhengwei.name/2011/11/lanunchctl-notes/ 2.php-fpm 默认配置 php-fpm.conf :/etc/php-f ...
- form表单提交行为
项目中有一个表单如下图,当我填完数据源名称这个input后,点击回车键本意是想跳到下一个input处,然而呢却触发了下面的添加这个按钮的事件,这是怎么回事呢,明明添加这个按钮并没有设置type=&qu ...
- python ,__set__, __get__ 等解释
@python __set__ __get__ 等解释 如果你和我一样,曾经对method和function以及对它们的各种访问方式包括self参数的隐含传递迷惑不解,建议你耐心的看下去.这里还提到了 ...
- BZOJ1016:[JSOI2008]最小生成树计数(最小生成树,DFS)
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
- [USACO09MAR]Sand Castle
嘟嘟嘟 太水了,大佬们就绕道吧…… 就是m, b数组分别排个序,然后更改对应位置的m[i]和b[i],就行了. 因为如果m[i]不改为b[i]而是b[i + 1]的话,那么必定要将m[j] (j &g ...
- 随手练——HDU Safe Or Unsafe (小根堆解决哈夫曼问题)
HDU 2527 :http://acm.hdu.edu.cn/showproblem.php?pid=2527 哈夫曼树,学完就忘得差不多了,题目的意思都没看懂,有时间复习下,看了别人的才知道是怎么 ...
- [Python 多线程] multiprocessing、多进程、工作进程池 (十四)
由于Python的GIL限制,多线程未必是CPU密集型程序的好的选择. 多进程可以完全独立的进程环境中运行程序,可以充分地利用多处理器. 但是进程本身的隔离性带来的数据不共享也是一个问题.而且线程比进 ...