Shell脚本编程入门
说句题外话,19年互联网整体环境不太好,裁员挺严重的,现在真的能有一个稳定的工作已经算是可以了,前些年的互联网热潮已经过去了,再也不是那种会四大组件就可以随便进入一家公司的年代了,现在找工作不仅要会使用某个东西,而要知道里面的实现原理,需要有一个比较强的技术实力,才能找到一份符合自己愿望的公司。所以程序员就是要时刻保持一个学习的心态,对于除了自己工作中用到东西,更需要对工作之外的东西学习,学到老,活到老,拥有别人所没有的东西,才能在竞争中脱颖而出。延迟享受,先苦后甜。
一直在为音视频的学习打基础,这几天看了下shell的脚本编程,为后面的ffmpeg库编译做准备,下面就来学习下shell,看下怎么使用。
Shell
是一个用 C 语言编写的程序,它是一门解释型编程语言,它是用户使用 Linux 的桥梁,我们后面说的是shell脚本编程(shell Script),是一种shell脚本程序,而不是编写shell本身,shell 和 shell script 是两个不同的概念,后面说的shell是指shell脚本。
准备阶段
要学习shell,首先需要准备一个linux环境,可以自己装一个虚拟机,ubuntu和centos都可以,也可以自己去买一个服务器,这个比较方便,然后用xshell连接远程服务器,也可以在浏览器中直接使用。
第一个列子
linux环境准备好了,就可以编写shell了,先上第一个例子
#!/bin/bash #1
#第一个入门shell脚本 #2
echo "这是第一个例子" #3
这是一个非常简单的shell了,就是打印一句话。但是还是来介绍下它的基本格式,首先#1处#!
表示shell用的解释器,常用的主要有两种,第一个是/bin/bash
,第二个是/bin/sh
,shell脚本第一行都是来声明使用到的解释器,#2处是一个注释功能,shell的注释使用#
,#3处echo
表示字符串的格式输出。
写完就可以运行了,shell执行方式有三种:
- 1 、 /bin/bash 脚本.sh 这是最标准的写法
- 2 、./脚本.sh 这种执行方式需要授权
- 3、 sh 脚本.sh 这是一种简介的执行方式
第二个例子 外部传参
有时候为了灵活控制,参数需要从外部获取,这时候来看下怎么做吧
#!bin/bash
echo "AAAAAAA"
age=99 # 定义局部变量
echo age: $age #使用局部变量
echo PWD: $PW # 使用系统命令,需要大写
#-----------
echo 当前shell脚本名称是:$0 #获取当前shell名称
echo 参数一:$1 #获取从外部传入的第一个参数
echo 参数二:$2 #获取从外部传入的第二个参数
#-----------
echo "是否执行成功:this\$? is $?" #上一个命令是否执行成功
echo "外界传递来了多少参数:this\* is $*" #外部传入了多少参数
echo "外界传递参数的数量:this\# is $#" #外部传入了多少个参数
上面这个例子中用到知识还是挺多的,其一,有局部变量的定义,怎样打印局部变量,已经打印系统命令的执行结果。其二,获取当前shell名称,从外界获取传入的参数。其三,判断上一个shell是否执行成功,传入了多少参数,数量。
执行命令时候外面加上参数就可以了比如sh test02.sh 888 999
在shell中定义变量不要加空格,不然会识别不到,但是命令使用要加空格,后面会说到
第三个例子 for循环
完成了上面的基础学习,下面就开始学习使用for循环
首先来看下怎么使用for循环打印
#!/bin/bash
#使用 `seq 1 20`作为我们的数据源,然后遍历这个数据源
for i in `seq 1 20`
do
echo "循环遍历的数字是:$i"
done
这个例子使用到了一个系统命令seq
,用于生成从一个数到另一个数的所有整数,然后用i
接收,在循环中打印
在shell中执行系统命令需要加``,并且for循环中不能使用括号,用$i来打印i接收的指
接下来看一个累加的功能
#!bin/bash
#做累加的操作
a=0
for((f=0;f<100;f++))
do
#注意:累加的时候,需要加空格,不然会有问题
a=`expr $f + $a` # $((100+100))和`expr 100 + 100`是一样的效果,只不过后者全兼容
done
echo "最后累加1~100的值是:$a"
这个例子用到一个expr系统命令,可以实现数值运算、数值或字符串比较、字符串匹配、字符串提取、字符串长度计算等功能。它还具有几个特殊功能,判断变量或参数是否为整数、是否为空、是否为0等。
for循环需要加双括号来完成计算功能,并且计算时候 + 号之间需要加空格,这就是前面提到的命令要有空格。
第四个例子 while循环
继续来学习循环while
#!/bin/bash
#while循环的演示
i=0
while((i<100))
do
echo "i的值是:$i"
i=`expr $i + 1`
echo "循环遍历的值 数字是:$i"
done
在这个例子中也要使用双括号,来做条件判断
也可以参考上个例子来做累加功能。
第五个例子 while循环读文件
接着就来看下使用while循环来读文件
#!/bin/bash
#读取文件内容
echo $`pwd`
while read lineVarAA
do
echo $lineVarAA
done<`pwd`/file01.txt # $PWD和` pwd `效果是一样的
这个例子是用来读取当前目录下的file01.txt文件,最后一行代表待读取文件,这个是按行读取,读取的内容会放在lineVarAA变量中,然后打印出来
第六个例子 if语句学习
#!/bin/bash
#if语句:
#if(())代表算术运算符, if[ ]代表执行指令,注意:在指令旁边要加空格,列如: if[ ! -d ]
NUM1=100
NUM2=200
if(($NUM1>$NUM2));then
echo "num1>num2"
elif(($NUM1==$NUM2));then
echo "num1=num2"
else
echo "num1<num2"
fi
这个例子中有多个条件的判读,也需要加双括号,需要使用的时候,直接参考着写就可以了
then代表条件触发的点,前面要加分号,写在单独一行可以不加,fi代表结束判断
第七个例子 if深入
学习了if的基础使用,就来看下if的深入用法,判断目录是否存在,不存在,就创建目录
#!bin/bash
#判断目录是否存在,如果存在就提示已经存在,如果不存在,就创建此文件夹
if [ ! -d `pwd`/testdir ]; then
mkdir -p `pwd`/testdir
else
echo "kevintetdir目录已经存在了"
fi
如果当前目录不存在,就创建目录,否则就提示已经存在
如果是命令的执行使用的是中括号[ ],并且要注意空格的存在
第八个例子 if判断
接下来学习if来判断是否相等和是否为空
#!bin/bash
# 判断字符串是否相等
var1="abcd"
var2="ad"
if [ $var1 ]; then
echo "var1不为空"
else
echo "var1为空"
fi
echo "-------------------------"
if [ $var1 = $var2 ]; then
echo "var1等于var2"
else
echo "var1不等于var2"
fi
比较简单就没有过多可以说明了,具体看代码
第九个例子 函数
接下来就看进阶用法,函数的使用
#!/bin/bash
#函数的学习
function test01(){
echo "这是一个函数"
}
test01
#局部变量的使用
function test02(){
var1="ruby1"
var2="ruby2"
echo $var1
echo $var2
}
test02
#传递参数给函数
function test03(){
echo "参数值1是:`expr $1`"
echo "参数值2是:`expr $2`"
echo $1
echo $2
}
test03 "呵呵" "哈哈"
shell中使用函数使用function关键字定义,使用函数,比如使用test01,后面直接用名字调用就可以了,如果要传参,后面直接接上函数的参数,比如test03就可以了。
第十个例子 重定向
重定向列表
输出重定向
重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:
command1 > file1
上面这个命令执行command1然后将输出的内容存入file1。
注意任何file1内的已经存在的内容将被新内容替代。
如果要将新内容添加在文件末尾,请使用>>操作符。
实例:
who > file01.txt
将who输出的内容重定向的file01.txt文件中了,可以使用cat命名查看
输入重定向
和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:
command1 < file1
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
注意:输出重定向是大于号(>),输入重定向是小于号(<)。
实例:
cat 0< file01.txt
上面这个命令执行完之后,会将file01.txt文件中的内容重定向到屏幕上(unix屏幕表示0),也就是会输出file01.txt文件中的内容
常用命令
举几个常用的linux命令,方便复习使用
echo $?
查询上一个命令是否执行成功,127执行错误,0成功
df -h
查询磁盘使用量
pwd
查询当前路径详情
$0
当前脚本名称
$1
从外部传参1
$2
从外部传参2,后面内推
$*
外界传递了多少参数
$#
外界传递参数的数量
seq 1 20
相当于for循环打印1-20
mv
文件重命名
sz
文件导出
rz
文件导入
rm -rf
删除文件
shell入门之后就会去编译ffmpeg库,后续继续总结
参考
1.Shell 教程