Java之美[从菜鸟到高手演练]之Linux下shell脚本的使用(一)

Shell脚本就是将很多条命令结合起来写在一起,通过运算以及判断来实现很多功能的文本。为什么学习shell,首先一些常规的系统管理操作,并且需要自动化地执行,如果用shell脚本把这些操作集中在一起,只需要定期的执行这个shell脚本就可以了,其次,对于一些复杂的文本处理,比如日志分析等等,可能需求比较多,单条执行命令不是很方便,因此也需要使用shell实现,所以,如果想学通linux系统,shell是必备的一课。本章我们主要以bash shell为主,不涉及其它shell。

HelloWorld

第一个shell脚本,输出Hello World。

第一行必须是#!/bin/bash(声明我们用的是bash shell,否则系统不知道需要调用那个shell去执行脚本)。由#开始的表示注释,后面的字符在执行的时候全部被忽略。主体就是第4行的echo -e “Hello World \a \n”,-e表示启用反斜线转义, \a表示输出“咚”的声音,\n表示换行。写完脚本后,为脚本添加可执行权限:chmod +x sh01.sh,然后用./sh01.sh执行就好了。

交互式脚本

最简单的情况就是获取用户输入,然后输出。

这个例子也比较简单,实用read进行输入的获取,并将值赋于紧跟着的变量上,执行效果:

数值计算

bash shell仅支持整数的简单加减乘除,需要用到$((express)),两层小括号内的express则为计算的表达式。

第七行采用declare的方式声明一个变量sum,使用$(( ))的方式计算结果。

判断式

1. test命令

检查文件是否存在:

test -e filename && echo "Exist" || "Not exist",如果存在,会输出Exist,否则Not exist. test命令有很多参数.

命令参数解释备注
关于文件类型的判断, test -e filename
test-e文件名是否存在常用
-f文件名是否存在且为文件常用
-d目录名是否存在且为目录常用
-b文件名是否存在且为一个block device设备
-c文件名是否存在且为一个character device设备
-S文件名是否存在且为一个Socket设备
-p文件名是否存在且为一个FIFO文件
-L文件名是否存在且为一个连接文件
关于文件的权限检测,如test -r filename
-r文件名是否存在且具有可读权限
-w文件名是否存在且具有可写权限
-x文件名是否存在且具有可执行权限
-u文件名是否存在且具有SUID属性
-g文件名是否存在且具有SGID属性
-k文件名是否存在且具有Sticky bit属性
-s文件名是否存在且为非空白文件
关于两个文件之间的比较,test file1 -nt file2
-ntnewer than,判断file1是否比file2新常用
-otolder than,判断file1是否比file2旧
-ef判断file1与file2是否为同一文件
关于两个整数之间的比较,test n1 -eq n2
-eq两数值相等
-ne两数值不等
-gtgreater than,n1 大于n2
-ltless than,n1小于n2
-gegreater than or equal,n1 大于等于n2
-leless than or equal,n1小于等于n2
判断字符串
test -z string判断字符串是否为0
test -n string判断字符串是否不为0
test str1 = str2判断字符串是否相等
test str1 != str2判断字符串是否不等
多重条件判定,test -r filename -a -x filename
-a两个条件同时成立时返回true
-O任何一个条件成立时返回true
!反向状态,当条件不成立时返回true

2. []判断符

除了使用test外,我们还可以使用[](中括号)来进行一些判断,如判断HOME环境变量是否为空:

[ -z $HOME ] ; echo $?

注意命令中的空格,[之后]之前都要跟一个空格,如果用到==,则==两侧也都需要有一个空格(要么都有,要么都没有)。比如,[ "aaa" == "bbb" ],这是合理的方式,如果写成[ "aaa" =="bbb" ]或者[ "aaa"== "bbb" ]就不合理了,会报错。使用[]进行判断时,应该注意如下几点:

a. 在括号[]内的组件都需要空格来分隔。

b. 括号内的变量最好要用双引号括起来。

c. 括号内的常量最好也要用单引号或者双引号括起来。

3. shell script的默认变量$0, $1, $2...

当我们给一个脚本带参数运行时,我们可以在脚本里获取到该命令的一些信息,比如:sh01.sh aaa bbb,在脚本里,$0就可以拿到脚本名,$1,$2分别为第一、第二个参数,以此类推,我们可以总结一下:

$0, 脚本名

$1, $2,脚本的参数

$#, 参数个数

$@, 所有参数,每个参数用双引号括起来

$*, 所有参数,用空格隔开

做个例子:

运行结果:

条件判断式

这个好理解,就是我们常见的if else语句,在shell脚本里用if then表示if语句,if then else表示if else语句,if出现时要用fi来结尾,else if用elif代替。看个例子:

1. 判断输入的第一个参数是不是hello

2. 如果无任何参数,则提示用户输入一个参数

3. 如果输入的参数不是hello,则提示用户只能输入hello作为参数

查看效果:

case判断

我们用过程序语言里的switch case语句,在某些情况下比if else方便很多,在shell脚本里也有类似的语句块叫:case in esac,还是上面的例子,我们换种写法:

看看效果:

循环

1. while do ... done

这个就是我们常见的while循环,当满足条件时,已知执行循环体里的语句,直到条件不满足时推出循环,done为循环结束标志。

2. until do ... done

该语句和while do ... done正好相反,当条件不满足时进行循环,满足时结束循环。

3. for do ... done

常见的for循环,一般就是对一个已知的数组或者结构进行循环遍历。

for do ... done还有一种用法就是对数值的处理,可以使用我们传统for循环的方式: for (( ;;))

shell 脚本的追踪与调试

在执行一个shell脚本之前,我们可以先进行一系列的语法检查,这样可以初步检测出一些明显的问题。

sh [-nvx] script.sh

-n, 不执行script,仅检查语法问题

-v, 在执行script前,先输出脚本到屏幕上

-x, 将使用到的script显示到屏幕上,列出所有的执行过程

这一章基本就要结束了,主要是一些基本的编写shell script的语法,我们可以先把这些掌握熟了,多加练习,然后多看一些复杂的文本处理的例子,多学习,多模仿复杂脚本的写法,然后写出复杂的脚本就不再是什么难事。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要成为一个Python的大牛,需要通过一系列实战经验来不断进阶。 首先,我们需要从菜鸟开始,学习基本的语法和常用库。掌握Python的基本语法、变量、数据类型、条件语句和循环语句等是必不可少的。此外,还要熟悉常用的Python库,如NumPy、Pandas和Matplotlib等,这些库在数据处理和可视化方面都非常常用。 接下来,我们需要通过实战来巩固所学的知识。可以选择一些小项目来实践,比如编写一个简单的Web应用、爬取网页数据或者创建一个简单的机器学习模型。通过实际应用,可以提升对Python的实际运用能力。 在实战过程中,我们需要积累并解决一些常见的问题。这些问题可能涉及到代码的优化、调试、性能优化等方面。通过解决这些问题,我们可以提升自己的编程能力,并且学会更高效地利用Python来解决实际问题。 另外,为了进一步提升自己的水平,可以参与开源项目或者自己创建项目。通过参与开源项目,可以学习到更多高级的编程技术和实践经验。同时,创建自己的项目有助于锻炼独立思考和解决问题的能力。 除了对Python语言的掌握外,我们还需要了解相关的领域知识。比如,在数据科学领域,需要学习统计学、机器学习和数据挖掘等知识。通过将Python与领域知识相结合,可以在相关领域中发挥更大的作用。 总而言之,成为一个Python的大牛需要不断地实践和学习。通过不断地积累实战经验,掌握并解决常见问题,参与开源项目或者自己创建项目,同时结合相关领域的知识,多角度地深入学习Python。这样的进阶之路需要耐心和毅力,但最终将能够取得令人骄傲的成果。 ### 回答2: Python是一门广泛应用于软件开发和数据分析的编程语言,具有简洁易学、功能强大的特点,因此非常适合初学者入门。然而,要想从菜鸟到大牛,需要不断拓展知识,提升技能。 首先,要全面掌握Python的基础知识,包括语法、数据类型、条件语句、循环语句等。可以通过阅读相关书籍、教程、参加培训班等方式进行学习。 其次,理解面向对象编程(OOP)是进阶的关键。Python是一门支持OOP的语言,掌握面向对象的概念和用法可以使代码更加模块化和可重用。可以通过练习编写类和对象,深入理解继承、封装和多态等概念。 另外,掌握Python标准库和第三方库也是提升的必要条件。标准库包含了许多常用的模块和函数,如操作文件、网络编程、并发等。同时,第三方库可以满足更具体的需求,如数据分析(NumPy、Pandas)、机器学习(Scikit-learn、TensorFlow)等。可以通过实践项目和参与开源社区来积累经验和熟悉常用的库。 此外,代码优化和性能调优也是进阶的一环。良好的代码结构、规范的命名和注释可以提高代码的可读性和可维护性。同时,了解性能优化的技巧和工具可以提高程序的执行效率。 最后,实际项目经验是从菜鸟到大牛的关键。通过实践解决真实的问题,遇到的挑战和解决方案都可以让你不断成长。可以自己找项目实践,也可以参与开源项目、参加比赛等方式来积攒经验。 总的来说,进阶的过程需要坚持不懈的学习和实践,并且保持持续学习的动力。不断总结和思考,参与开源社区和技术讨论也可以获得更多的启发和帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值