主要学习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 #执行脚本
image.png
image.png
作为解释器参数
直接运行解释器,其参数就是shell脚本的文件名,
bin/sh shell_1.sh
Shell变量
定义变量时,变量名不加美元符号($ PHP语言中变量需要),如:
your_name="runoob.com"
特别注意:变量名和等号之间不能有空格,不然就会报错
报错说明
Shell变量名的命名遵循的规则如下:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash里的关键字
使用变量
使用一个定义过的变量,只要在变量名前面加$即可,如
my_name="pll"
echo $my_name
echo ${my_name}
平时使用变量时,尽量在变量名外面加上花括号,这样可以帮助解释器识别变量的边界
注意 赋值时不能加
$)
使用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文件的行数,流入管道后面的指令即每行按逗号分割,输出文本的第一项和第二项。