1.1 简介

Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。
下面是处理流程示意图:

Shell既然是工作在Linux内核之上,那我们也有必要知道下Linux相关知识。
Linux是一套免费试用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
1983年9月27日,Richard Stallman(理查德-马修-斯托曼)发起GNU计划,它的目标是创建一套完全自由的操作系统。为保证GNU软件可以自由的使用、复制、修改和发布,所有的GNU软件都有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General Plubic License,GPL),说白了就是不能做商业用途。
GNU是"GNU is Not Unix"的递归缩写。UNIX是一种广泛使用的商业操作系统的名称。
1085年,Richard Stallman又创立了自由软件基金会(Free Software Foundation,FSF)来为GNU计划提供技术、法律以及财政支持。
1990年,GNU计划开发主要项目有Emacs(文本编辑器)、GCC(GUN Compiler Collection,GNU编译器集合)、Bash等,GCC是一套GNU开发的编程语言编译器。还有开发一些UNIX系统的程序库和工具。
1991年,Linuxs Torvalds(林纳斯- 托瓦兹)开发出了与UNIX兼容的Linux操作系统内核并在GPL条款下发布。
1992年,Linux与其他GUN软件结合,完全自由的GUN/Linux操作系统正式诞生,简称Linux。
1995年1月,Bob Young创办ACC公司,以GNU/Linux为核心,开发出了RedHat Linux商业版。
Linux基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。与Unix思想十分相近。
1.2 Shell基本分两大类
1.2.1 图形界面Shell(GUI Shell)
GUI为Unix或者类Unix操作系统构造一个功能完善、操作简单以及界面友好的桌面环境。
主流桌面环境有KDE,Gnome等。
1.2.2 命令行界面Shell(CLI Shell)
CLI是在用户提示符下键入可执行指令的界面,用户通过键盘输入指令,完成一系列操作。
在Linux系统上主流的CLI实现是Bash,是许多Linux发行版默认的Shell。还有许多Unix上用的Shell,例如tcsh、csh、ash、bsh、ksh等等。
1.3 第一个Shell脚本
本教程主要讲解在大多Linux发行版下默认Bash Shell。Linux系统是RedHat下的CentOS操作系统,完全免费。与其商业版RHEL(Red Hat Enterprise Linux)出自同样的源代码,不同的是CentOS并不包含封闭源代码软件和售后支持。
用vi打开test.sh,编写:
# vi test.sh
#!/bin/bash
echo "Hello world!"
第一行设置运行环境,第二行打印Hello world!
写好后,开始执行,执行Shell脚本有三种方法:
方法1:直接用bash解释器执行
# bash test.sh
Hello world!
方法2:添加可执行权限
# ll test.sh
-rw-r--r--. 1 root root 32 Aug 18 01:07 test.sh
# chmod +x test.sh
# ./test.sh       
-bash: ./test.sh: Permission denied
# chmod +x test.sh
# ./test.sh # ./在当前目录
Hello world!
方法3:source命令执行,以当前默认Shell执行
# source test.sh
Hello world!
1.4 Shell变量
1.4.1 系统变量
在命令行提示符直接执行env、set查看系统或环境变量。env显示用户环境变量,set显示Shell预先定义好的变量以及用户变量。可以通过export导出成用户变量。
一些写Shell脚本时常用的系统变量:
$SHELL     默认Shell
$HOME     当前用户家目录
$IFS     默认内部域分隔符
$LANG     默认语言
$PATH     默认可执行程序路径
$PWD     当前目录
$UID     用户ID
$USER     当前用户
$HISTSIZE     历史命令大小,可通过HISTTIMEFORMAT变量设置命令执行时间
1.4.2 普通变量与临时环境变量
普通变量定义:VAR=value
临时环境变量定义:export VAR=value
变量引用:$VAR
下面看下他们之间区别:
Shell进程的环境变量作用域是Shell进程,当export导入到系统变量时,则作用域是Shell进程及其Shell子进程。

ps axjf输出的第一列是PPID(父进程ID),第二列是PID(子进程ID)

当SSH连接Shell时,当前终端PPID(-bash)是sshd守护程序的PID(root@pts/0),因此在当前终端下的所有进程的PPID都是-bash的PID,比如执行命令、运行脚本。

所以当在-bash下设置的变量,只在-bash进程下有效,而-bash下的子进程bash是无效的,当export后才有效。

进一步说明:再重新连接SSH,去除上面定义的变量测试下

所以在当前shell定义的变量一定要export,否则在写脚本时,会引用不到。
还需要注意的是退出终端后,所有用户定义的变量都会清除。
在/etc/profile下定义的变量就是这个原理,后面有章节会讲解Linux常用变量文件。
1.4.3 位置变量
位置变量指的是函数或脚本后跟的第n个参数。
$1-$n,需要注意的是从第10个开始要用花括号调用,例如${10}
shift可对位置变量控制,例如:
#!/bin/bash
echo "1: $1"
shift
echo "2: $2"
shift
echo "3: $3"
# bash test.sh a b c
1: a
2: c
3:
每执行一次shift命令,位置变量个数就会减一,而变量值则提前一位。shift n,可设置向前移动n位。
1.4.4 特殊变量
$0    脚本自身名字
$?    返回上一条命令是否执行成功,0为执行成功,非0则为执行失败
$#    位置参数总数
$*    所有的位置参数被看做一个字符串
$@    每个位置参数被看做独立的字符串
$$    当前进程PID
1.5 变量引用
1.5.1 自定义变量与引用
# VAR=123
# echo $VAR
123
Shell中所有变量引用使用$符,后跟变量名。
有时个别特殊字符会影响正常引用,那么需要使用${VAR},例如:
# VAR=123
# echo $VAR
123
# echo $VAR_   # Shell允许VAR_为变量名,所以此引用认为这是一个有效的变量名,故此返回空
# echo ${VAR}
123
还有时候变量名与其他字符串紧碍着,也会误认为是整个变量:
# echo $VAR456
# echo ${VAR}456
123456
1.5.2 将命令结果作为变量值
# VAR=`echo 123`
# echo $VAR
123
# VAR=$(echo 123)
# echo $VAR
123
这里的反撇号等效于$(),都是用于执行Shell命令。
1.6 双引号和单引号
在变量赋值时,如果值有空格,Shell会把空格后面的字符串解释为命令:
# VAR=1 2 3
-bash: 2: command not found
# VAR="1 2 3"
# echo $VAR
1 2 3
# VAR='1 2 3'
# echo $VAR
1 2 3
看不出什么区别,再举个说明:
# N=3
# VAR="1 2 $N"
# echo $VAR
1 2 3
# VAR='1 2 $N'
# echo $VAR
1 2 $N
单引号是告诉Shell忽略特殊字符,而双引号则解释特殊符号原有的意义,比如$、!。
1.7 注释
Shell注释也很简单,只要在每行前面加个#号,即表示Shell忽略解释。

2.1 获取字符串长度

1

2

3

4

5

# VAR='hello world!'

# echo $VAR

hello world!

# echo ${#VAR}

12

2.2 字符串切片

格式:

${parameter:offset}

${parameter:offset:length}

截取从offset个字符开始,向后length个字符。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

截取hello字符串:

# VAR='hello world!'

# echo ${VAR:0:5}

hello

截取wo字符:

# echo ${VAR:6:2}

wo

截取world!字符串:

# echo ${VAR:5}

world!

截取最后一个字符:

# echo ${VAR:(-1)}

!

截取最后二个字符:

# echo ${VAR:(-2)}

d!

截取从倒数第3个字符后的2个字符:

# echo ${VAR:(-3):2}

ld

2.3 替换字符串

格式:${parameter/pattern/string}

1

2

3

4

5

6

7

# VAR='hello world world!'

将第一个world字符串替换为WORLD:

# echo ${VAR/world/WORLD}

hello WORLD world!

将全部world字符串替换为WORLD:

# echo ${VAR//world/WORLD}

hello WORLD WORLD!

2.4 字符串截取

格式:

${parameter#word}   # 删除匹配前缀

${parameter##word}

${parameter%word}   # 删除匹配后缀

${parameter%%word}

# 去掉左边,最短匹配模式,##最长匹配模式。

% 去掉右边,最短匹配模式,%%最长匹配模式。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# URL="http://www.baidu.com/baike/user.html"

//为分隔符截取右边字符串:

# echo ${URL#*//}         

www.baidu.com/baike/user.html

以/为分隔符截取右边字符串:

# echo ${URL##*/}

user.html

//为分隔符截取左边字符串:

# echo ${URL%%//*}     

http:

以/为分隔符截取左边字符串:

# echo ${URL%/*}

http://www.baidu.com/baike

以.为分隔符截取左边:

# echo ${URL%.*}

http://www.baidu.com/baike/user

以.为分隔符截取右边:

# echo ${URL##*.}

html

# 去掉左边,从左边匹配第一个,##从右边匹配第一个。

% 去掉右边,从右边匹配第一个,%%从左边匹配第一个。

有*号情况下才这样。

2.5 变量状态赋值

${VAR:-string}  如果VAR变量为空则返回string

${VAR:+string}  如果VAR变量不为空则返回string

${VAR:=string}  如果VAR变量为空则重新赋值VAR变量值为string

${VAR:?string}  如果VAR变量为空则将string输出到stderr

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

如果变量为空就返回hello world!:

# VAR=

# echo ${VAR:-'hello world!'}

hello world!

如果变量不为空就返回hello world!:

# VAR="hello"

# echo ${VAR:+'hello world!'}

hello world!

如果变量为空就重新赋值:

# VAR=

# echo ${VAR:=hello}

hello

# echo $VAR

hello

如果变量为空就将信息输出stderr:

# VAR=

# echo ${VAR:?value is null}   

-bash: VAR: value is null

${}主要用途大概就这么多了,另外还可以获取数组元素,在后面章节会讲到。

博客地址:http://lizhenliang.blog.51cto.com

QQ群:Shell/Python运维开发群 323779636

2.6 字符串颜色

再介绍下字符串输出颜色,有时候关键地方需要醒目,颜色是最好的方式:

字体颜色

字体背景颜色

显示方式

30:黑

31:红

32:绿

33:黄

34:蓝色

35:紫色

36:深绿

37:白色

40:黑

41:深红

42:绿

43:黄色

44:蓝色

45:紫色

46:深绿

47:白色

0:终端默认设置

1:高亮显示

4:下划线

5:闪烁

7:反白显示

8:隐藏

格式:

\033[1;31;40m  # 1是显示方式,可选。31是字体颜色。40m是字体背景颜色。

\033[0m     # 恢复终端默认颜色,即取消颜色设置。

示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

#!/bin/bash

# 字体颜色

for in {31..37}; do

    echo -e "\033[$i;40mHello world!\033[0m"

done

# 背景颜色

for in {41..47}; do

    echo -e "\033[47;${i}mHello world!\033[0m"

done

# 显示方式

for in {1..8}; do

    echo -e "\033[$i;31;40mHello world!\033[0m"

done

Shell基础知识及字符处理相关推荐

  1. 【图文教程】Shell基础知识

    Shell基础知识 1. shell介绍 2. history命令 history主要参数示例: 3. 命令补全和别名 4. 通配符 5. 输入输出重定向 6. 管道符和作业控制 管道符: 作业控制: ...

  2. Linux之(5)账户和shell基础知识

    Linux之(5)账户和shell基础知识 Author:onceday date:2022年8月23日 漫漫长路,而今才刚刚开始- 本内容主要收集整理于: <Linux命令行与shell脚本编 ...

  3. 3000字扫盲shell基础知识(新手必备)

    目录 shell基础语法之变量 shell 变量命名 shell 变量调用 shell 变量分类 shell 运算符 运算符种类 关系运算符 布尔运算符 字符串运算符 逻辑运算符 文件测试运算符 sh ...

  4. shell基础知识总结

    1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对 ...

  5. linux 运行class文杰,Linux Shell基础知识,你想的到的都在这里

    小编提示:此篇文章阅读时间为15分钟左右,可先收藏后阅读. 01/Linux 的江湖地位 Linux 作为一个全球用户超过14亿的操作系统,它的强大与神奇就不必多说了,混在IT界 Linux是可以装B ...

  6. Shell 基础知识--细说linux配套视频

    Shell 基础概括 Shell是什么? shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序 ...

  7. 巩固shell基础知识

    以下这些知识是在编写shell程序的时候要用到的,需要的时候可以来查查,来巩固一下吧 shell中的一些扩展字符 • !! 上个命令的所有字符 • !* 一个命令的所有参数 • !^ 上一条命令的第一 ...

  8. L24 shell基础知识(二)管道符-作业控制-shell变量-环境变量配置文件

    主要内容: 1管道符 2作业控制 3 shell变量 4 环境变量配置文件 1管道符和作业控制 管道符 "|", 就是把前面的命令运行的结果丢给后面的命令. 2作业控制 当运行一个 ...

  9. shell学习之shell基础知识了解

    一.了解bash shell /etc/bash是Linux系统预设的shell.bash是GNU计划中重要的工具软件之一,目前也是Linux distributions的标准 shell. Shel ...

最新文章

  1. [模仿微软Live.cn]JavaScript输入邮箱自动提示
  2. 命令 —— awk内置变量(NF,NR,FS,FILENAME)
  3. python添加、修改、删除、访问类对象属性的2种方法
  4. JZOJ 5399. 【NOIP2017提高A组模拟10.7】Confess
  5. 在64位Windows中使用64位版本ASP.NET 2.0的问题
  6. grep 正则匹配
  7. Fighting_小银考呀考不过四级【递推】
  8. 网页证书添加_二、Exchange2016部署及基础配置(NDS及证书配置)
  9. 如何在network monitor中查找试图建立TCP连接的帧?
  10. 27. 搭建Git服务器
  11. (精品)java宠物医院管理系统+论文+答辩ppt+部署视频+效果图效果视频
  12. springcloud篇面试宝典
  13. 基于永洪BI部署的自助分析平台(一)
  14. 20200727《Flask进阶》——模块化程序(蓝本)
  15. 调整bandizip压缩参数获得最大压缩效果
  16. 175个常用诗词语句出处
  17. ERP专业知识讲座:7.财务管理
  18. 如何在Powerpoint中更改幻灯片大小
  19. each 和 forEach 和{{each}}
  20. 用matlab写的视频截取图像桢,基于MATLAB的储粮害虫图像处理方法

热门文章

  1. 如何做一个听话的 “输入框”--摘抄
  2. BlackBerry上联网的五种方式
  3. 新手的linux之旅 五、安装IE浏览器
  4. FAPI专题-7:5G FAPI接口 - 中文规范-3- P5消息格式
  5. SEO 词库完整指南(转载)
  6. java模拟登录qq网站,实现一键签到等等功能
  7. weui hd bd ft
  8. Java程序验证五子棋先手必胜_五子棋在无禁手中,理论上是“先手必胜”,实际下棋中如何实现“先手必胜”?...
  9. 数字化平台全面护航金融信创落地 | 信创讲坛第一期
  10. 根据三角形的三条边长(长、中、短三条边),来判断三角形类型。注意: 1.一个三角形的边长应该都为正数 2.一个三角形的边长都应该满足三角形条件:两边之和大于第三边 如果有两边的