linux shell脚本学习第一篇 sed基础

此篇最好有一点linux内核以及操作系统知识,需要linux指令实际操作经验。另外这篇文章加了sed工具的基础,希望读完这篇文章大家能知道shell和关于shell脚本的概念及基本文件操作。

一,脚本简介

什么是shell?

我在学习linux基础中有提过,linux操作系统四大组成结构分别是内核,文件系统,shell,用户程序。shell是用户与kernel内核交互的媒介,它本身是一个用 C 语言编写的应用程序,它是用户使用 Linux 的桥梁。这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

因此正如你所想,shell也是有不同种类和版本的,不过由于易用和免费,Bourne Again Shell(Bash) 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。

为什么要使用shell

我们为什么喜欢用linux,与windows操作系统相比,程序员为什么更偏爱linux(别告诉我你不是)?
首先我们说windows是一个图形界面化的操作系统,这大大降低了使用者的门槛,用户只需要点点鼠标就能使用各种应用程序。发邮件浏览网页打游戏,所以windows是迄今为止使用量最多的操作系统。

那对于程序员来说有什么不同?
首先对于有一定计算机知识的人来说,他们对于支配计算机的需求更强烈,我希望能通过简单的操作去操作存储的文件,去获取计算机资源的参数,去了解计算机的网络动作并进行管理。这一切是不可能界面化的,需要通过工具来达到我们和操作系统交互的目的,这就是命令行界面shell,shell脚本就是包含需要执行命令的文件。

二,使用shell以及shell脚本

shell指令一般都是在shell终端执行,打开终端后一般会出现提示符:

username@hostname$

或者

root@hostname#

其中$表示普通用户,#表示超级用户。

关于 #! /bin/bash

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序,是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。所以shell脚本如果通过bash解释,一般都会在最上边写这个

运行方式

一种是作为可执行程序,假如你在shell终端打要运行的脚本test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
 

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

或者作为解释器参数,直接运行解释器,其参数就是 shell 脚本的文件名

/bin/sh test.sh

和学习任意一种语言一样,我们来用例子快速过一下bash的基础知识,多动脑理解,内容有所阉割,感兴趣推荐在文尾的参考中找:

变量 

变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。

JAVA_HOME_8=/usr/lib/Java/jdk1.8.0_181.jdk/Contents/Home #设置JAVA_HOME
echo $JAVA_HOME_8  #查看
#结果/usr/lib/Java/jdk1.8.0_181.jdk/Contents/Home
echo $SHELL     #查看shell版本


var="value"
echo $var #或者echo ${var}
#结果value

unset variable_name #用于删除变量

字符串

字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符

#!/bin/bash
string="abcde"
echo ${#string}    #获取字符串长度 5
echo ${string:1:4}    #截取字符串 bcde

数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。*和@可以表示数组的所有元素

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

函数

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

输入输出重定向

首先理解重定向的含义,这里的重定向是把输入输出定向导入到文件中:

#Check add files
#如果不存在file1的文件,则创建并文字重定向输入到此文件内
file1=test1.sh
if [ ! -f "$file1" ]; then
  cat > $file1 <<EOF
This is a test and I have add a file.
user="lishinho"
EOF
echo "Added"
fi

文件包含

和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
Shell 文件包含的语法格式如下:
. filename   # 注意点号(.)和文件名中间有一空格

source filename

我们编写一个例子,创建并把文件1的user输入到文件2中:

#!/bin/bash
file2=test2.sh
#Check add files
if [ ! -f "$file2" ]; then
  source ./test1.sh
  cat > $file2 <<EOF
user is $user
EOF
echo "Added file2"
fi

三,文件处理sed基础

sed是stream editor的缩写。它是文件处理中非常重要的工具,能匹配正则表达式。实际工作中,测试面对开发给的shell脚本,如果你能掌握好sed,对于看懂脚本内容将非常有帮助。同时,他强大的文本处理能力,配合着正则表达式使用,功能将不同凡响。它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。

man sed看sed说明书

移除空白行

我们提到sed一次处理一行数据,在空白行中,行尾标志紧接着行首标记

/pattern/d file删除标记的行

$ sed '/^$/d' file

已匹配字符串标记&

\w\是正则表达式,表示每匹配一个单词,我们就用[&]来替换它,&对应匹配的单词 s表示替换

s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!

$ echo this is an example | sed 's/\w\+/[&]/g'

sed插入并改变文件

i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

$ 代表的是最后一行,sed 的 -i 选项可以直接修改文件内容

sed -i '$i\insert line\' file

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

a 动作是在匹配的行之后追加字符串,追加的字符串中可以包含换行符(实现追加多行的情况)。追加一行的话前后都不需要添加换行符 \n,只有追加多行时在行与行之间才需要添加换行符(最后一行最后也无需添加,添加的话会多出一个空行)。

文件第4 行之后追加 2 行:

sed -e '4 a newline\nnewline2' file

参考文献:

1. 关于shell:https://www.runoob.com/linux/linux-shell.html

2. Linux shell脚本攻略

3. 关于sed:https://zhuanlan.zhihu.com/p/96696036

猜你喜欢

转载自blog.csdn.net/wannuoge4766/article/details/105325130