Shell编程入门

Posted @从一到无穷大

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell编程入门相关的知识,希望对你有一定的参考价值。


1 Shell编程简介

Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。

(1)Linux 运维工程师在进行服务器集群管理时,需要编写 Shell 程序来进行服务器管理。
(2)对于 JavaEE 和 Python 程序员来说,需要编写一些 Shell 脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
(3)对于大数据程序员来说,需要编写 Shell 程序来管理集群。

2 Shell脚本的执行方式

脚本格式要求

(1)脚本以 #!/bin/bash 开头
(2)脚本需要有可执行权限

例如:创建一个 Shell 脚本,输出 hello world!

#! /bin/bash

echo "hello world!"

在这里插入图片描述

3 Shell变量

3.1 Shell变量介绍

Linux Shell 中的变量分为系统变量和用户自定义变量。
系统变量:$HOME$PWD$SHELL$USER 等等

(1)定义变量:变量=值
(2)撤销变量:unset 变量
(3)声明静态变量:readonly 变量,注意:不能 unset

#! /bin/bash

# 输出系统变量
echo "PATH=$PATH"
echo "USER=$USER"

在这里插入图片描述

#! /bin/bash

A=100
echo "A=$A"
unset A
echo "A=$A"

# 定义和使用静态变量
readonly B=90
echo "B=$B"
# 静态变量不能unset
unset B
echo "B=$B"

在这里插入图片描述

3.2 定义变量的规则

(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
(2)等号两侧不能有空格
(3)变量名称一般习惯为大写。

3.3 将命令的返回值赋给变量(重点)

(1)A=`ls -la`反引号,运行里面的命令,并把结果返回给变量 A
(2)A=$(ls -la)等价于反引号
#! /bin/bash

RESULT=`ls -l /root`
echo $RESULT
echo "-----------"
MY_DATE=$(date)
echo "date=$MY_DATE"

在这里插入图片描述

4 设置环境变量

基本语法

(1)export 变量名=变量值:将shell变量输出为环境变量
(2)source 配置文件:让修改后的配置信息立即生效
(3)echo $变量名:查询环境变量的值

在 /etc/profile 文件中定义 TOMCAT_HOME 环境变量

# 定义一个自己的环境变量
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME

查看环境变量 TOMCAT_HOME 的值
(注意:在输出 TOMCAT_HOME 环境变量前,需要让其生效:source /etc/profile
在这里插入图片描述

在另一个 shell 程序中使用 TOMCAT_HOME

#! /bin/bash

# 使用我们自定的环境变量
echo "tomcat_hmoe=$TOMCAT_HOME"

在这里插入图片描述

5 位置参数变量

当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如 :./myshell.sh 100 200 , 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息

基本语法

$n :n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
$* :这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#:这个变量代表命令行中所有参数的个数

#! /bin/bash

# 获取到各个参数
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"

在这里插入图片描述

6 预定义变量

就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用

基本语法

$$ :当前进程的进程号(PID)
$!:后台运行的最后一个进程的进程号(PID)
$? :最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了

#! /bin/bash

echo "当前的进程号=$$"

# 后台的方式运行 test.sh
./test1.sh &
echo "最后的进程号=$!"
echo "执行的值=$?"

在这里插入图片描述

7 运算符

基本语法

(1) $((运算式))$[运算式]
(2)expr m + n 注意 expr 运算符间要有空格
(3)expr m - n
(4)expr \\*, /, % :乘,除,取余

#! /bin/bash

# 第一种方式$()
RESULT1=$(((2 + 5)*4))
echo "result1=$RESULT1"

# 多行注释
:<<!
第二种方式[]
推荐
!
RESULT2=$[(2 + 7)*3]
echo "result2=$RESULT2"

# 第三种方式,使用expr
TMP=`expr 2 + 3`
RESULT3=`expr $TMP \\* 4`
echo "result3=$RESULT3"

# 求两个参数的和
SUM=$[$1+$2]
echo "sum=$SUM"

在这里插入图片描述

8 条件判断

8.1 基本介绍

基本语法

[ condition ](注意 condition 前后要有空格),非空返回 true,否则返回false

常用判断条件

(1)两个整数的比较=字符串比较
-lt 小于
-le 小于等于
-eq 等 于
-gt 大于
-ge 大于等于
-ne 不等于

(2)按照文件权限进行判断
-r 有读的权限 [ -r 文件 ]
-w 有写的权限
-x 有执行的权限

(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录

#! /bin/bash

# 案例1 "ok"是否等于"ok"
if [ "ok" = "ok" ]
then
        echo "equal"
fi

# 案例2 25是否大于20
if [ 25 -gt 20 ]
then
        echo "大于"
fi

# 案例3 /root/bbb 目录中的文件是否存在
if [ -e /root/bbb/test.txt ]
then
        echo "存在"
fi

在这里插入图片描述

8.2 if 判断

基本语法

if [ 条件判断式 ];then
	程序
fi

if [ 条件判断式 ]
then
	程序
elif [ 条件判断式 ]
then
	程序
fi

案例

#! /bin/bash

# 案例:请编写一个shell程序,如果输入的参数大于等于60,则输出及格,否则输出不及格

if [ $1 -ge 60 ]
then
        echo "及格"
elif [ $1 -lt 60 ]
then
        echo "不及格"
fi

在这里插入图片描述

8.3 case 语句

基本语法

case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

案例

#! /bin/bash

# 案例:当命令行参数是1时,输出"周一", 是2时,就输出"周二",其它情况输出"other"
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

在这里插入图片描述

9 循环语句

9.1 for 循环

基本语法1

for 变量 in 值1 值2 值3…
do
	程序
done

基本语法2

for (( 初始值;循环控制条件;变量变化 ))
do
	程序
done

案例

#! /bin/bash

# 案例1 打印命令行输入的参数

# 使用 $*
for i in "$*"
do
        echo "the num is $i"
done
echo "-----------------"
# 使用 $@
for j in "$@"
do
        echo "the num is $j"
done
echo "-----------------"

# 案例2 从1加到100的值输出显示

# 定义一个变量
SUM=0
for((i=1;i<=100;i++))
do
        SUM=$[$SUM+$i]
done
echo "sum=$SUM"

在这里插入图片描述

9.2 while 循环

基本语法

while [ 条件判断式 ]
do
	程序
done

案例

#! /bin/bash

# 案例 从命令行输入一个数 n,统计从 1+..+ n 的值是多少

SUM=0
i=1
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[$i+1]
done
echo "sum=$SUM"

在这里插入图片描述

10 read 读取控制台输入

基本语法

read(选项)(参数)

选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
参数:
变量:指定读取值的变量名

案例

#! /bin/bash

# 案例1 读取控制台输入一个num值

read -p "请输入一个数num1=" NUM1
echo "你输入的值是num1=$NUM1"

# 案例2 读取控制台输入一个num值,在10秒内输入

read -t 10 -p "请输入一个数num2=" NUM2
echo "你输入的值是num2=$NUM2"

在这里插入图片描述

11 函数

shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。

11.1 系统函数

basename基本语法:

basename [pathname] [suffix]:返回完整路径最后 / 的部分,常用于获取文件名
basename [string] [suffix]:basename 命令会删掉所有的前缀,包括最后一个/字符,然后将字符串显示出来。suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。

dirname基本语法:返回完整路径最后/ 的前面的部分,常用于返回路径部分。
dirname 文件绝对路径 :从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

在这里插入图片描述

11.2 自定义函数

基本语法

[ function ] funname[()]
{
Action; 
[return int;]
}

调用直接写函数名:funname [值]

案例

#! /bin/bash

# 案例 计算输入两个参数的和(read), getSum

function getSum(){
        SUM=$[$n1+$n2]
        echo "和是=$SUM"
}

read -p "请输入第一个数n1:" n1
read -p "请输入第二个数n2:" n2

# 调用getSum
getSum $n1 $n2

在这里插入图片描述


参考: https://www.bilibili.com/video/av21303002?p=9

以上是关于Shell编程入门的主要内容,如果未能解决你的问题,请参考以下文章

Shell 脚本是用户使用Linux的桥梁-快速入门

shell从入门到精通(-1)初次会面运行第一个shell脚本

Atom编辑器入门到精通 Atom使用进阶

shell从入门到精通(32)优秀的shell编程习惯和规范

shell从入门到精通(32)优秀的shell编程习惯和规范

Shell 编程入门