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
以上是关于Shell编程入门的主要内容,如果未能解决你的问题,请参考以下文章
shell从入门到精通(-1)初次会面运行第一个shell脚本
shell从入门到精通(32)优秀的shell编程习惯和规范