Linux中怎么用shell写程序,Linux下的shell编程学习(上)

主要学习Linux下的Bourne Again Shell(/bin/bash)编程

#!放在第一行是告诉系统其后路径所制定的程序,即是解释此脚本文件的Shell程序

用vim打开一个shell_1.sh文件,文件后缀名为.sh。输入一些代码,如下:

#! /bin/bash

echo "Hello World!"

运行脚本的两种方式

作为可执行程序

上面的代码保存为shell_1.sh,在相应的目录下

chmod x(权限的规定如755等) ./shell_1.sh #使脚本具有执行权限

./shell_1.sh #执行脚本

da1b42b8c947

image.png

da1b42b8c947

image.png

作为解释器参数

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

bin/sh shell_1.sh

Shell变量

定义变量时,变量名不加美元符号($ PHP语言中变量需要),如:

your_name="runoob.com"

特别注意:变量名和等号之间不能有空格,不然就会报错

da1b42b8c947

报错说明

Shell变量名的命名遵循的规则如下:

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头

中间不能有空格,可以使用下划线(_)

不能使用标点符号

不能使用bash里的关键字

使用变量

使用一个定义过的变量,只要在变量名前面加$即可,如

my_name="pll"

echo $my_name

echo ${my_name}

平时使用变量时,尽量在变量名外面加上花括号,这样可以帮助解释器识别变量的边界

注意 赋值时不能加

math?formula=%EF%BC%8C%E5%8F%AA%E6%9C%89%E5%9C%A8%E4%BD%BF%E7%94%A8%E5%8F%98%E9%87%8F%E6%97%B6%E6%89%8D%E5%8A%A0%E7%BE%8E%E5%85%83%E7%AC%A6( $)

使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变

使用unset命令可以删除变量,变量被删除后不能再次使用,unset命令不能删除只读变量

Shell字符串

字符串是Shell编程中最常用最有用的数据类型,可以用单引号也可以用双引号,也可以不用引号。

单引号

str='this is a string'

单引号字符串的限制:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

单引号字符串中不能出现单独一个的单引号,但可成对出现,作为字符串拼接使用

双引号

your_name='pll'

str="Hello,I know you are \"$your_name\"!\n"

输出结果为:

Hello,I know you are “pll”

双引号的优点:

双引号可以有变量

双引号可以出现转义字符

拼接字符串

your_name="pll"

greeting="hello,"$your_name"!\n"

greeting_1="hello,${your_name}!"

echo $greeting $greeting_1

# 使用单引号拼接

greeting_2='hello, '$your_name' !'

greeting_3='hello, ${your_name} !'

echo $greeting_2 $greeting_3

输出结果:

hello,pll!

hello,pll!

hello, pll ! hello, ${your_name} !

获取字符串长度

my_name="pll"

echo ${#my_name} #输出 4

提取子字符串

从字符串第2个字符开始截取4个字符

echo ${greeting:1:4} #输出结果 ello

执行过程中遇到一个问题shell_1.sh: Bad substitution

这与linux shell使用的是/bin/sh,还是/bin/bash有关系,故我们将执行语句改为

/bin/bash shell_1.sh

提取子字符串

查找字符i或o的位置(哪个字母先出现就计算哪个)

string="runoob is a great site"

echo `expr index "$string" io` # 输出 4

注意:该脚本中的`是反引号,而不是单引号‘

字符串延伸

#表示从左边删除到第一个指定的字符

var=http://www.aaa.com/123.htm

echo ${var#*//} #从左边开始删除到第一个//为止的所有字符

即删除http://

结果是:www.aaa.com/123.htm

##表示从左边删除到最后一个指定的字符

var=http://www.aaa.com/123.htm

echo ${var##*/} #从左边开始删除到最后一个/为止的所有字符

即删除http://www.aaa.com/

结果是:123.htm

%表示从右边删除到第一个指定的字符

var=http://www.aaa.com/123.htm

echo ${var%/*} #从右边开始删除第一个/及右边的所有字符

即删除/123.htm

结果是:http://www.aaa.com

%%表示从右边删除到最后一个指定的字符

var=http://www.aaa.com/123.htm

echo ${var%%/*} #从右边开始删除第一个/及右边的所有字符

即删除//www.aaa.com/123.htm

结果是:http:

从左边第几个字符开始及字符的个数

echo ${var:0:5}

即提取的字段:http:

从左边第几个字符开始一直到结束

echo ${var:5}

即提取的字段://www.aaa.com/123.htm

从右边第几个字符开始一直到结束

echo ${var:0-7}

其中的7表示左边第8个字符开始,一直到结束

即提取的字段:123.htm

从右边第几个字符开始及字符的个数

echo ${var:0-7:3}

其中的0-7表示右边第七个字符开始,3表示字符的个数

即提取的字段:123

注 左边的第一个字符是用0表示,右边的第一个字符用0-1表示

Shell数组

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

定义数组

在Shell中,用括号来表示数组,数组元素用"空格"符号分隔开。可以不使用连续的下标,而且下标的范围没有限制。定义数组的一般形式为:

数组名=(值1 值2 ....值n)

array_name=(value0 value1 value2 value3)

array_name[0]=value0

array_name[1]=value1

array_name[n]=valuen

读取数组

读取数组元素的一般格式是:${数组名[下标]},使用@符号可以获取数组中的所有元素

valuen=${array_name[n]}

echo ${array_name[@]}

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同

length=${#array_name[@]}

Shell注释

以#开头的行就是注释,会被解释器忽略。

多行注释

:<

注释内容...

注释内容...

注释内容...

EOF

或者

:<

注释内容...

注释内容...

注释内容...

'

或者

:<

注释内容...

注释内容...

注释内容...

!

shell编程的小练习

题目描述:在Linux系统中的一个目录下有188个.avro文件和188个.csv文件,如何使用命令行把188个.csv文件复制到一个新的目录下

首先这是一个批量处理的问题,单纯的copy/paste特别麻烦,单纯的命令行也是很麻烦。所以这个时候最好的方式就是用shell编写一个小脚本,执行脚本命令。

#查找所有的.csv文件,然后依次遍历每个文件并把每个文件复制到一个新的目录下

for file in find -name "*.csv"

do

#echo $file shell脚本中输出每一个csv文件

cp -r $file 新的目录路径

done

shell编写脚本一次性建立多个文件夹

mkdir 2019050{1,2,3,4,5,6,7,8,9}

就会建立20190501~20190509九个文件件

将文件夹data中的所有csv文件的行数并存入另一个文件1.txt中

这个时候最好用的就是shell编程

wc -l data/*.csv > 1.txt

发现这样还不够,应该按分隔符分为两个列,一列是行数,一列是文件名

这个时候就用到awk命令

wc -l data/*.csv | awk '{print $1,",",$2}' > 1.txt

这条命令的意思是:从文件夹data中记录每个csv文件的行数,流入管道后面的指令即每行按逗号分割,输出文本的第一项和第二项。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值