Linux 学习笔记 3:Shell 基础
1.Shell的工作原理
Shell是用户和操作系统之间的接口。当用户登录系统,有一个Shell进程随之启动,并在用户注销时终止。用户输入的命令是Shell输入。
处理命令的步骤:查找命令中的元字符;把这些元字符替换成对应的实际操作参数;等重新生成的指令传给内核;命令完成,提示符重新出现,等待下一条命令
查看种类:echo $SHELL
Bourne系列:Bourne Shell; Korn Shell; bash
C Shell系列:C Shell; Tcsh

2.Shell命令元字符
1通配符:用来表示文件名的某种模式,在解释时被替换成其他字符 注意与正则表达式区分
|
通配符 |
匹配内容 |
|
* |
任意数量的任意字符(可以是0个) |
|
? |
单个任意字符 |
|
[abc] |
a, b, c中的任一个字符 |
|
[a-z] |
ASCII码值在a与z中间的任一个字符 |
|
[!a-z] |
不在a-z范围内的任一个字符 |
|
!(fname) |
除fname之外的所有文件名 |
|
!(f1|f2) |
除f1和f2之外的所有文件名 |
练习:
ls .??* 列出.开头且长度>=3的文件,以及当前目录(.)和上级目录(..)的所有文件
rm *.c 删除.c结尾的文件
rm * .c 删除所有文件、删除名叫.c的文件
ls c*[!0-9] 列出c开头、非数字结尾的文件
cp file f[1-3] 把file,f1,f2复制到f3,f3必须是目录
cp f[1-3] file file需要是目录
2转义符:当要处理的文件名或参数名中出现通配符时,需要使用转义符防止通配符起作用
a.\通配符:\* \? \$ \[\] \[Enter] [ ]
b.双引号:禁止通配符替换
单引号:禁止通配符、变量名和命令替换
3.Shell命令
1命令替换:使用命令的结果替换命令;不可以是变量
a.`命令`:不支持嵌套(陈旧)
echo The current time is `date`
b.$(命令):支持嵌套,并支持与一对``嵌套
echo The current time is $(date)

2输入输出流
输入输出终端:键盘、显示器
命令的输入和输出字符流:标准输入流0、标准输出流1、标准错误流2
标准输入输出源:终端、文件、管道
a.重定向:
|
样例 |
功能 |
||
|
- |
cat foo - bar |
依次输出foo、标准输入、bar的内容 |
标准输入以Ctrl+C结束 |
|
> |
echo 内容 >文件名 |
输出重定向 |
|
|
>> |
echo 内容 >>文件名 |
追加输出重定向 |
|
|
< |
wc< 文件名 |
输入重定向 |
|
|
<< |
wc << hello |
将hello作为命令结束的关键词 |
|
|
2>&1 |
将标准错误重定向到标准输出 |
&理解为标准输出的引用 |
|
|
1>&2 |
将标准输出重定向到标准错误 |
示例:
cat – f2 < f1 > f3 2> f4 输入重定向,f1代替键盘,依次输出-,f2,结果重定向到f3
b.过滤器:eg.同时用到输入流和输出流的命令
c.命令组合:使用()或{}将命令括起来,可以共享一个重定向符号

d.管道|:将一条命令的输出作为另一条命令的输入(标准)
优点:处理速度快;不产生中间文件结果

4.Shell变量
1 环境变量
声明:由Shell定义,无需声明
赋值:export 变量名=变量值 eg.export PATH=“$PATH:newpath”
引用:$变量名
查看:env
修改:在Shell中直接修改,在Shell中生效
在启动配置文件中修改,每次登陆后生效:系统配置文件:/etc/profile;用户配置文件:~/.profile,~/.bashrc
|
环境变量 |
内容 |
|
HOME |
用户目录(不同于/home) |
|
PATH |
命令执行路径,用冒号分隔,Shell会按PATH中给出的顺序搜索目录 |
|
PWD |
当前工作目录的绝对路径 |
|
UID |
当前用户识别号 |
|
RANDOM |
一个随机数 |
2 用户自定义变量
a.变量
命名规则:字母开头,区分大小写,可包含数字与下划线
类型:shell变量都是字符串
声明与赋值:无需提前声明

|
赋值语句 |
赋值语义 |
|
y=${x-value} |
若x有值,则y=x,否则y=value |
|
y=${x=value} |
若x有值,则y=x,否则y=x=value |
|
y=${x+value} |
若x有值,则y=value,否则不操作 |
|
y=${x?value} |
若x有值,则y=x,否则在标准错误流输出value |
引用:
|
变量引用 |
变量替换 |
|
$var |
变量值 |
|
${var} |
变量值 |
|
${#var} |
变量值长度 |

字符串操作:
|
语句 |
返回值 |
示例: var=”~/my/f¥ile.txt” |
|
${var#s} |
去掉从左边开始第一个匹配s的子串 |
${var#*/}=my/file.txt |
|
${var##s} |
去掉从左边开始最后一个匹配s的子串 |
${var##*/}=file.txt |
|
${var%s} |
去掉从右边开始第一个匹配s的子串 |
${var%/*}=~/my |
|
${var%%s} |
去掉从右边开始最后一个匹配s的子串 |
${var%%/*}=~ |
|
${var:m:n} |
提取从m位置开始往后的n个连续字符 |
${var:2:5}=my/fi |
|
${var:0-n} |
提取从右边开始的n位子串 |
${var:0-5}=e.txt |
|
${var/s/t} |
把第一个匹配s的串替换成t |
${var/t/e}=~/my/file.ext |
|
${var//s/t} |
把所有匹配s的串替换成t |
${var//t/e}=~/my/file.exe |
b.运算符
数值运算:let(Shell内部命令);$((整数表达式))(Shell扩展命令);expr;bc

bc浮点数计算器
通常采用管道方式接受输入并返回结果,常用参数有:
scale=n 保留小数点后n位(整数运算除1.0后才会生效;四舍五入通过 +0.5 实现)
ibase=k 指定输入位k进制
obase=k 制定输出为k进制

c.数组
声明:declare -a 数组名
赋值:array[0]=value
array=(0 1 2 3)
array=(0 [3]=1 2) 指定下标赋值
arr[*]与arr[@]相同
echo ${arr[*]}会跳过未赋值的位置
数组索引是字符串,因此不能用01代替1

5.Shell脚本
有时候出现not found的错误是因为多打或少打了空格
将一组命令保存在文件中,然后逐条执行;可以用文本编辑器编写,直接用./name执行
a.解释器行:用来指定Shell种类,一般为 #!/bin/bash
b.命令行参数:运行脚本时给定的用户输入参数
|
位置参数 |
说明 |
|
$0 |
所执行命令的名字 |
|
$1--$9 |
命令行参数1到9的名字 |
|
$* |
所有命令行参数组合成的字符串,被引号包含时,将所有参数当作整体 |
|
$@ |
所有命令行参数组合成的字符串,被引号包含时仍将各个参数分开 |
|
$# |
命令行参数的个数 |
|
$$ |
当前shell的进程ID号 |
|
$? |
最近一次命令的退出状态(正常0) |
|
$! |
最近一次后台进程的ID号 |
c.用户输入:read 变量表
-p 提示字符串
-n 指定数量读取
-t 指定时间内读取
-s 隐藏显示输入字符
eg.read -n 2 -t 10 -p “input your name:” name
d.命令退出状态
所有命令和程序都会返回一个退出状态值:正常 exit 0;错误 exit 1
可以使用参数 $? 查看上一条命令的退出状态

e.结构控制语句
• 顺序执行:命令1;命令2
• 条件执行:命令1 && 命令2 先执行命令1,若命令1成功,则执行命令2
命令1 || 命令2 先执行命令1,若命令1失败,则执行命令2
命令成功与否取决于退出状态值

• 条件测试命令:test 缩写为[],没有任何输入,直记录退出状态值
括号本身一定要和内部的命令有一个空格
|
数值比较运算符 |
含义 |
|
-eq |
等于 |
|
-ne |
不等于 |
|
-gt |
大于 |
|
-ge |
大于等于 |
|
-lt |
小于 |
|
-le |
小于等于 |
|
字符串比较运算符 |
含义 |
|
= |
等于 |
|
!= |
不等于 |
|
-n str |
字符串不为空 |
|
-z str |
字符串为空 |
|
str |
字符串被赋值且不为空 |
|
文件特性检查命令 |
含义 |
|
[ -e file ] |
file存在 |
|
[ -f file ] |
file存在并是一个常规文件 |
|
[ -d file ] |
file存在并是一个目录 |
|
[ -L file ] |
file存在并是一个符号链接 |
|
[ -rwx file ] |
file存在且可读可写可执行 |
|
[ -s file ] |
file存在且大小不为0 |
|
[ f1 -nt f2 ] |
f1比f2更新 |
|
[ f1 -ot f2 ] |
f1比f2更旧 |
|
[ f1 -ef f2 ] |
f1被连接到f2 |
• if语句:
if 条件测试命令
then
命令串
elif 条件测试命令
then
命令串
else
命令串
fi
• case语句
case 表达式 in //支持通配符
模式1) 命令串1 ;;
模式2) 命令串2 ;;
…
*) 命令串n //default
esac
• for语句
for 变量 in 列表
do
命令串
done
• while语句
while 条件测试命令
do
命令串
done
• until语句:当条件测试命令返回假时执行循环体
until 条件测试命令
do
命令串
done
• break语句:跳出循环体,执行done的下一句
• continue语句:跳到done的位置,重新进入循环

6.Shell函数
声明:function(){
statements
return value
}
使用函数名进行调用,可在后面给出命令行参数;退出状态由return返回;可通过标准输出向调用者返回输出字符串
Linux 学习笔记 3:Shell 基础的更多相关文章
- Linux学习笔记 -- 初识 Shell
Shell 是什么 Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell既是 ...
- Linux学习笔记(17) Shell编程之基础
1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...
- #Linux学习笔记# 自定义shell终端提示符
我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名.主机名.当前目录(绝对路径)和提示符.这样会导致当进入一个比较深的目录 ...
- Linux学习笔记<五>——<Shell部分>
管道命令(pipe) 1.把一个命令的输出作为另一个命令的输入 ls -al /etc | less 2.选取命令:cut和grep cut命令可以将一段消息的某段切出来. -d接分隔符,-f是取出第 ...
- linux学习笔记之shell
本文参考:shell脚本学习指南 本文阅读前提为:知道shell指令,但不知道如何完成一个自动化的shell脚本. 因为编辑本文时,作者也是一个新手.所以,在一些理论上,可能存在错误.如果存在错误,希 ...
- linux学习笔记:1.基础知识和命令行基本操作
初次学习linux系统,想在这里记录自己的学习痕迹,如发现有不足之处,希望能指出,谢谢啦,之后的学习是在虚拟机VMware 10下的Red Hat Enterprise linux 6 的操作. 一. ...
- Linux学习笔记:Shell脚本学习
概念 真正能够控制计算机硬件(CPU.内存.显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁. 由于安全.复杂.繁琐等原因,用户不能直接接触内核(也没有 ...
- Linux学习笔记18--Linux系统服务基础
服务(Service):运行在操作系统后台的一个或多个程序,为用户或系统提供某项特定的服务. 服务通常是不中断运行的,随时接收请求,提供某项服务.例如:http网页服务由诸如nginx.apach ...
- Linux学习笔记(18) Shell编程之流程控制
1. if语句 (1) 单分支if条件语句 格式为: # 注意条件判断式两端的空格if [ 条件判断式 ];then 程序员 fi 或者 if[ 条件判断式 ] then 程序 fi 例:判断分区使用 ...
- Linux学习笔记:nginx基础
nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP pro ...
随机推荐
- Linq to SQL -- 入门篇
一.什么是Linq Linq是语言集成查询(Language Integrated Query)的简称,是visual Studio 2008和.NET Framework 3.5版本中一项突破性的创 ...
- 一次请求中,经过 nginx+uWSGI+flask应用程序搭建服务的执行过程
Flask框架有自带的http server,但是缺点非常明显,并发能力,及时响应非常差,只适合开发时自测使用. 在我接触过的项目中,生产环境使用nginx+uWSGI+flask应用程序进行部署服务 ...
- mysql 关联
自关联 设计省信息的表结构provinces id ptitle 设计市信息的表结构cityscitys表的proid表示城市所属的省,对应着provinces表的id值 id ctitle proi ...
- ORM版学员管理系统 3
老师信息管理 思考 三种方式创建多对多外键方式及其优缺点. 通过外键创建 class Class(models.Model): id = models.AutoField(primary_key=Tr ...
- SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)
1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现 ...
- Unable to find a single main class from the following candidates ,显示有两个main class
由于基础框架是用的网上down的源码,我将项目名字改了,估计没有进行maven clean,本地调试的时候没有问题. 当发布时候,执行maven install 一直提示上述错误. 解决办法:1.ma ...
- 【转】如何用Eclispe调试java -jar xxx.jar 方式执行的jar包
原文地址:https://www.cnblogs.com/zzpbuaa/p/5443269.html 有时候,我们经常会需要调试 java -jar xxx.jar方式运行的代码,而不是必须在Ecl ...
- Linux一行命令处理批量文件
前言 最好的方法不一定是你最快能想到的.这里提供一种使用sed命令构造命令解决处理批量文件的技巧,供参考. 需求案例1 将当前目录下所有的0_80_91.txt.0_80_92.txt.0_80_93 ...
- 移动web图片加载完获取img宽高
1.vue中 @load=function(){} 等待img加载完触发load函数 2.window.load=function(){var imgheight=$(".btnimg& ...
- Redis的Errorlog或者启动日志(错误日志)的配置
Errorlog或者是运行日志是任何一个软件的运行中异常诊断必看的文件之一,折腾Redis的过程中以为有默认的错误日志(或启动日志),不过一直没有发现类似的日志文件,在看了默认的配置文件之后,发现Re ...