轻松掌握Linux脚本编程——方法 ($() linux脚本)

一、为什么要学习Linux脚本编程

在Linux系统中,脚本编程是一项重要的技能。随着Linux操作系统的日益流行,掌握Linux脚本编程已成为一项必要的技能。脚本编程可以让用户自动化任务,减少人为操作,提高工作效率;同时,也可以在排错和日志分析方面提供帮助。因此,学习Linux脚本编程是非常有必要的。

二、学习Linux脚本编程的基础知识

在学习Linux脚本编程前,需要掌握一些基础知识。需要学习Linux的基本操作和命令,包括文件操作、目录操作、文本编辑、进程管理等。此外,还需要了解常用的编程语言,如Bash、Perl、Python等,其中Bash是Linux系统默认的命令解释器,在Linux脚本编程中使用广泛。

在掌握以上基础知识的基础上,可以进一步学习Linux脚本编程。在Linux系统下,通过编写Shell脚本来实现自动化任务。Shell是一种命令解释器,它是Linux系统下最为常用的交互式用户界面,也是Linux脚本编程的主要工具。

三、编写Linux脚本的基本语法

Linux脚本编程采用的语言是Shell,脚本的语法非常简单,具有高度可读性。在编写Linux脚本时,需要掌握一些基本语法,包括:

1. 注释:注释用于说明脚本的作用和工作流程,以“#”开头。

2. 变量:变量用于存储数据,在Linux脚本中,变量名以字母或下划线开头,可以赋值任何数据类型。

3. 条件语句:用于根据不同的条件执行不同的操作,包括if、elif、else等关键字。

4. 循环:用于重复执行某个操作,包括for、while、until等关键字。

5. 函数:用于封装一段代码,以便在脚本中多次使用。

在学习这些基本语法之后,可以开始编写简单的Linux脚本了。

四、Linux脚本编程的实例演练

以下是一个简单的Linux脚本编程的实例演练,通过对该实例的学习,可以掌握Linux脚本编程的基本流程。

实例:统计某文件夹下文件的大小

脚本:

#!/bin/bash

#定义变量

dir=/home/user/docs

#循环遍历目录

for file in $(ls $dir)

do

#统计文件大小,输出结果

size=$(du -s $dir/$file | awk ‘{print $1}’)

echo “文件名:$file;大小:$size KB”

done

在这个脚本中,首先定义了一个变量dir,用于存储目标文件夹的路径。然后使用for循环遍历目录,读取每个文件名,并使用du命令来统计文件大小。最后使用echo命令输出结果。

五、Linux脚本编程的进阶技能

除了学习以上基本内容之外,还可以进一步学习Linux脚本编程的进阶技能。这些技能可以让你更加深入地理解Linux脚本编程,并在实际工作中得心应手。

1. 正则表达式:正则表达式是一种用于匹配文本的语言,通常用于处理字符串。在Linux脚本编程中,掌握正则表达式可以帮助你更好地处理数据。

2. 控制语句:除了基本的条件语句和循环语句之外,Linux脚本编程还有其他控制语句,如break、continue、case等,用于控制程序的执行流程。

3. 交互式脚本:在Linux系统中,可以编写交互式脚本,通过与用户交互来执行特定的操作。这种脚本可以在安装软件、配置系统等方面提供帮助。

4. 进程管理:Linux脚本编程还可以使用一些命令来管理进程,如ps、kill、nice等,用于启动、停止、调整进程优先级等操作。

Linux脚本编程是一项非常有用的技能,可以在日常工作中大大提高工作效率,也可以提高技能水平,为自己的职业发展打好基础。通过不断学习,我们可以不断提高自己的Linux脚本编程水平,实现更加复杂的任务。

相关问题拓展阅读:

让Linux系统保持活力的优化脚本

笔者从生产系统上和网络资料上总结出几种优化脚本,脚本从磁盘和内存方面入手,让Linux系统保持活力。特别是第三种清理缓存释放内存,可以结合笔者以前的文章-Linux健康检查脚本health-check-script来做进一步的包装,特别是在做大量数据备份之后,完成自动检测和清理工作。

    下面的delete_data函数中的三条命令可以完成目录下所有文件、log文件和log.gz文件按过期时间清理。

delete_data()

{

    delete_time=$1

    #清理目录下所有过期文码神宏件

    find /home/pi/log/ -mtime +$delete_time -exec rm -r {} \;

    #清理目录下.log过期文件

    find /home/pi/log/  -mtime +$delete_time -name ‘*.log’ -exec rm -r {} \;

    #清理目录下.log.gz过期文件

    find /home/pi/log/  -mtime +$delete_time -name ‘*.log.gz’ -exec rm -r {} \;

}

2.1目录下文件单独压缩打包

#将/home/pi/log/目录下的.log文件打包成.gz文件,

find /home/pi/log/  -name ‘*.log’ -exec gzip -f {} \;

运行测试,默认gzip 会删除源文件,并生成xx.gz文件。

zcat  filename.gz  可以直接查看文件内容。gunzip –c filename.gz  可以解压缩并保留源文件,但是解压后显示在标准输出上,没有解压后文件。gunzip -cv filename.gz > filename ,可以保留源文件和压缩后文件,-v是显示进度。压缩保留源文件是 gzip  -cv filename > filename.gz 。

2.2目录下文件以前一起打包压缩

    gzip无法压缩文件夹,仅用于压缩单个文件,要压缩文件夹,应该使用tar + gzip ,即是tar -z。

#将log目录下的文件打包并以时间命令,打包后以 gzip 压缩

tar -zcvf  $(date +%Y%m%d%H%M%S)log.tar.gz log/

tar -ztvf log.tar.gz可以查看包内有哪些文件。

tar -zxvf7log.tar.gz解压缩到当前目录

tar  -zxvf 瞎稿7log.tar.gz  -C  log2/  将包解压到log2目录下。

    频繁的文件访问(特别是数据备份后)会导致系统的Cache使用量大增。sysctl命令用于运行时配置内核参数,这些参数位于/proc/sys目录下。

    这里我们来看一下 buff/cache的作用。

    buffer指Linux内存的 缓冲区缓存 Buffer cache,cache指Linux内存中的 页面缓存 Page cache。

    Cache(Page cache,页面缓存): 主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。

    Buffer(Buffer cache,缓冲区缓存): 主要是针对块设备进行缓存的,比如当我们对一个文件进行写操作的时候,page cache的内容会被改变,而buffer cache则可以用来将page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时迟册,就不用将整个page写回,而只需要写回修改的部分即可。

    Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。怎么手动清除呢?修改/proc/sys/vm/drop_caches 的值。看看英语说明:

to free pagecache, use echo 1 > /proc/sys/vm/drop_caches;

to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;

to free pagecache, dentries and inodes, use echo 3 > /proc/sys/vm/drop_caches.

    即3可以释放所有类型的缓存。

  同时为了防止数据丢失,命令sync 将脏页的内容写回硬盘,但可能伴随着系统磁盘IO飙高。

  运行free -m命令,再运行下面的脚本中的命令,发现 buff/cache减少了21M。

linux脚本中的冒号是什么意思? 之一行:read YN , 第二行 :${YN:=yes},第三行 case $YN in …

题主你好,

写在前面:

题主的代码写的其实有点问题, 第2行的第1个字符,冒号,和第2个字符,美元符号,之间是有空格的,正确的写法是:

: ${YN:=yes}

不同的语言语法限制程度不一样, 在shell脚本中,对空格的限制就比较严格, 同样的代码, 你不加空格就是错的, 加上才对. 相同的用法在test命令的简写形式中也比较常见(就不具体展开了,题主有需要可以追问)

下面解释题主的代码:

其实题主的代码逻辑很简单:

从标准输入中读取值赋给变量YN //这是之一行代码的作用

然后检测之一行的变量YN是否真的有值,如果有值,则跳过, 没值的话则将yes作为变量值赋给YN. 这里题主可能会问, 之一行代码不是已经从标准输入读取值赋给YN了嘛,怎么第2句还要检测YN是否有值呢? 这是因为如果之一句代码执行后, 你没有从键盘输入值,而是直接按的回车,则YN就没有值. 将第1句和第2句要连起来看, 就是:

“当我们没有从标准输入赋值给YN时, YN的默认值是yes” //这就是第二行代码的作用

至于第三猛嫌森行代码就没啥说的了, 就是看$YN和下面给定的哪个值相匹配,则执行哪个值下的语句,因为第三句这里也没写全,就先说到这里

上面只是解释了一下这三行代码的意思, 下面再来说一下题主问题中 “第2行代码中两个冒号的意思”

先说第2个冒号吧, shell脚本中有一个概念叫替换运算符, 我们常见的变量赋值的形式是:

变量名=值

另外shell脚本还提供了一组稍复杂一点的处理变量的运算符, ” := “就是其中一个, 这么说可能有点不对, 完整的语法是:

${变量名:=值}

而上面这个语法的处理逻辑是: 先看看 ” 变量名 “是否存在并且非空, 如果是,则返回” 变量名 “的值. 举例来说:

name=”zhangsan”

echo ${name:=lisi}

上面之一行代码是给变量name赋值为zhangsan, 第2行代码是用echo 输出${name:=lisi}的返回值, 而${name:=list}具体是啥值,上面也说了判定逻辑, 看看name是否存在且非空, 因为上面定义了name=”zhangsan”, 所以这里name肯定是存者拿在且非空的, 所以${name:lisi}的返回值是name变量的值,即zhangsan. 因此 echo ${name:=lisi}也就变成了我们常见的形式: echo zhangsan, 即echo ${name:=lisi}输出的值为zhangsan.

上面是” 变量名 “存在的情况, 下面再来说” 变量名 “不存在的情况. 举例来说:

echo ${name:=lisi}

就上面这一行代码, 这里就简单说了, 因为name上面没有定义, 所以name是不存在的, 因此会将lisi赋给变量name, 返回值为lisi, 因此echo ${name:=lisi}变成了echo lisi, 所以最后的输出值为: lisi.

下面再来第2行代码的之一个冒号, 如果没有第1个冒号, YN的值会被作枝亩为命令去执行, 也就是说,

如果你只写 ${YN:=yes} , 则当YN之前有值,且为no时,则这句执行后, 返回值为no,然后no会被被作为一个命令执行, 因为系统里没有no这个命令,所以会报错, 说no这个命令没发现; 而当YN之前没有值时, 该命令执行后,返回值为yes, 同样,yes也会被作为命令执行, 会不断的输出y(这就是一种特殊性, 因为yes是linux中的一个命令,并且它没有参数的时候也不会报错, 但会重复输出y,因此你不会看到报错信息, 而是不断输出的y,如果你换一个值,比如${YN:=666},则执行后,就会输出666命令没发现).

因此最简单的记第1个冒号的作用是:

“它只评估后面的参数,而忽略参数的返回值”

写在最后: 上面洋洋洒洒说了一堆, 有些地方逻辑不是太严谨,有错误的地方也请题主指正.

希望可以帮到题主, 欢迎追问.

你这恐怕不是纯粹的bash脚本吧

关于$() linux脚本的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 轻松掌握Linux脚本编程——方法 ($() linux脚本)