千家信息网

LINUX中shell脚本编程的方法是什么

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了LINUX中shell脚本编程的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇LINUX中shell脚本编程的方法是什么文章都会有所收获,下面
千家信息网最后更新 2026年10月31日LINUX中shell脚本编程的方法是什么

这篇文章主要介绍了LINUX中shell脚本编程的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇LINUX中shell脚本编程的方法是什么文章都会有所收获,下面我们一起来看看吧。

一. shell简介

当命令不在命令行中执行,而是从一个文件中执行时,该文件就称为 Shell 脚本。shell脚本是纯文本文件,以行为单位逐行执行。

相当于一种命令翻译器。

二. shell脚本的编写

2.1脚本的创建

使用文本编辑器(或touch)创建脚本文件

语法:touch a.sh

2.2脚本的执行

将脚本添加可执行权限

语法:chmod +x a.sh

执行脚本命令:

(1)./a.sh

(2)sh a.sh

(3)source a.sh //不需要x权限

2.3脚本的编写

编辑脚本:vim a.sh

#!/bin/bash //系统以bash解释器执行脚本

cd /etc/

pwd //命令语句

三. shell功能

3.1重定向

重定向输出:将命令的执行结果覆盖到目标文件

语法:df > a.txt //将磁盘信息覆盖到a.txt文件

重定向追加:uname -p >> a.txt //将处理器类型追加到a.txt

重定向输入:

vim pass.txt

123456

passwd --stdin jerry < pass.txt //标准输入

tail -2 /etc/shadow //查看用户密码信息后两行

3.2管道符号

将左侧的命令输出结果,作为右侧命令的处理对象

cat a.txt |grep "123" //筛选出含字符串"123"的行

grep "bash$" /etc/passwd | awk -F: '{ print $1,$7 }' //-F:后要求有空格

例:提取根分区/的磁盘使用情况

df -hT //查看磁盘使用情况-h显示更易读-T显示文件系统类型

df -hT | grep "/$" | awk '{print $6}'

四. shell变量

shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。

4.1自定义变量

4.1.1定义一个新的变量(输入)

格式:变量名=变量值

4.1.2查看变量的值(输出)

格式:echo $变量名

echo命令的选项:

-n:取消自动换行

-e:使用转义字符,把字符串中某些字符当成特殊字符处理

\t:制表符

\n:换行符

\b:删除前一个字符

\f:换行但光标仍旧停留在原来的位置

\r:光标移至行首,但不换行

赋值时使用引号

双引号:允许通过$符号引用其他变量值

单引号:禁止引用其他变量值,$视为普通字符

反撇号:命令替换,提取命令执行后的输出结果

4.1.3从键盘输入内容为变量赋值(提示输入)

格式: read [-p "提示信息"] 变量名

4.2整数变量运算

Shell变量的数值运算多用于脚本程序的过程控制,只能进行整数运算,不支持小数 运算。整数的运算主要通过内部命令Expr进行。

格式:expr 变量1 运算符 变量2 [运算符 变量3]... //注意空格

常用运算符:加(+)、减(-)、乘(\*)、除(/)、取模(%)

例:设置X(值为35)、Y(值为16)两个变量,并进行加、减、乘、除、取模运算

X=35

Y=16

expr $X + $Y

expr $X - $Y

expr $X \* $Y //乘法符号在shell中有其它含义,运算时需要转意符号

expr $X / $Y

expr $X % $Y

4.3环境变量

由系统提前创建,用来设置用户的工作环境

配置文件:/etc/profile 、~/.bash_profile

env :查看当前工作环境下的环境变量。

这表示为 $n,n为1~9之间的数字

例:编写一个加法运算的小脚本a.sh,用来计算两个整数的和。需要计算的两个整数在执行脚本时以位置变量的形式提供。

#vim a.sh

#!/bin/bash

SUM=`expr $1 + $2`

echo "$1 + $2 = $SUM"

#chmod +x a.sh

#./a.sh 12 24 //$1为12、$2为24

4.4预定义变量

是由Bash程序预先定义好的一类特殊变量,使用"$"符号和另一个符号组合表示。

$# :命令行中位置变量的个数

$* :所有位置变量的内容

$? :表示上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错

$0 :当前执行的进程/程序名

例:编写一个备份小脚本

#vim mybak.sh

#!/bin/bash

TARFILE=beifen-`date +%s`.tgz

tar zcf $TARFILE $* &> /dev/null

echo "已执行$0脚本,"

echo "共完成$#个对象的备份"

echo "具体内容包括:$*"

#chmod +x mybak.sh

#./mybak.sh /boot/grub

#./mybak.sh /etc/passwd /etc/shadow

五. 测试脚本命令

5.1条件测试

测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值

格式1:test 条件表达式

格式2:[ 条件表达式 ] //注意空格,中括号与表达式之间有空格

执行条件测试操作以后,通过预定义变量"$?"获取返回状态值。

5.2文件测试

根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、 可写、可执行等。

用法:[ 操作符 文件或目录 ]

-d:测试是否为目录(Directory)

-e:测试目录或文件是否存在(Exist)

-f:测试是否为文件(File)

-r:测试当前用户是否有权读取(Read)

-w:测试当前用户是否有权写入(Write)

-x:测试是否设置有可执行权限(Excute)

例:

[ -d /media/cdrom ]

echo $?

0 //返回0表示条件成立,返回1表示条件不成立

使用逻辑与"&&"和echo命令一起更直观的显示结果

[ -d /media/cdrom ] $$ echo "yes"

yes

5.3整数值比较

根据给定的两个整数值,判断第一个与第二个数的关系

用法:[ 整数1 操作符 整数2]

-eq:等于(Equal)

-ne:不等于(Not Equal)

-gt:大于(Greater Than)

-lt:小于(Lesser Than)

-le:小于或等于(Lesser or Equal)

-ge:大于或等于(Greater or Equal)

例:判断当前已登录的用户数,超出五个时输出"Too many"

Unum=`who | wc -l` //查看当前已登录用户数

[ $Unum -gt 5 ] && echo "Too many."

5.4字符串比较

通常用来检查用户输入、系统环境等是否满足条件

用法1:[ 字符串1 = 字符串2] [ 字符串1 != 字符串2 ]

用法2:[ -z 字符串 ] //检查是否为空

通用 :[ 字符串1 操作符 字符串2 ]

例1:判断当前系统语言,不是"http://en.US"时输出"Not http://en.US "

echo $LANG

[ $LANG != "http://en.US" ] && echo "Not http://en.US"

例2:用户需输入yes或no来确认操作

read -p "是否覆盖现有文件(yes/no)?" ACK

[ $ACK = "yes" ] && echo "覆盖"

read -p "是否覆盖现有文件(yes/no)?" ACK

[ $ACK = "no" ] $$ echo "不覆盖"

5.5逻辑测试

判断两个或多个条件之间的关系

用法1:[ 表达式1 ] 操作符 [ 表达式2 ]

用法2:命令1 操作符 命令2

&& :逻辑与,"而且",使用test命令时可改为"-a"

|| :逻辑或,"或者",使用test命令时可改为"-o"

! :逻辑否,"不"

例:测试当前系统内核版本是否符合要求

uname -r

Mnum=$(uname -r | awk -F. '{print $1}')

Snum=$(uname -r | awk -F. '{print $2}')

[ $Mnum -eq 2 ] && [ $Snum -gt 4 ] && echo "符合要求"

六. if条件语句

根据复杂程度:单分支的if语句,双分支的if语句,多分支的if语句

6.1单分支if语句

只有条件成立时才会执行一条相应的代码

用法:

if 条件测试

then 命令序列

fi

例:判断挂载点目录是否存在,若不存在则新建此目录

vim chkmountdir.sh

#!/bin/bash

MOUNT_DIR="/media/cdrom/"

if [ ! -d $MOUNT_DIR ]

then

mkdir -p $MOUNT_DIR

fi

chmod +x chkmountdir.sh //给chkmountdir.sh执行的权限

./chkmountdir.sh

6.2双分支if语句

用法:

if 条件测试操作

then 命令序列1

else 命令序列2

fi

例:检查目标主机是否能连通,显示相应信息

vim pinghost.sh

#!/bin/bash

ping -c 3 -i 0.2 -w 3 $1 &> /dev/null //命令执行时的消息都不看

if [ $? -eq 0] //判断前一条命令的返回状态

then

echo "Host $1 is up."

else

echo "Host $1 is down."

fi

chmod +x pinghost.sh

./pinghost.sh 192.168.4.11

6.3多分支if语句

用法:

if 条件测试操作1

then 命令序列1

elif 条件测试操作2

then 命令序列2

else

命令序列3

fi

例:判断分数范围,分出优秀、合格、不合格三挡

vim gradediv.sh

#!/bin/bash

read -p "请输入您的分数(0-100):" GRADE

if [ $GRADE -ge 85 ] && [ &GRADE -le 100 ]

then

echo "$GRADE 分!优秀"

elif [ $GRADE -ge 70 ] && [ &GRADE -le 84 ]

then

echo "$GRADE 分,合格"

else

echo "$GRADE分?不合格"

fi

chmod +x gradediv.sh

./gradediv.sh

七. for循环语句

读取不同的变量,用来逐个执行同一组命令

用法:

for 变量名 in 取值列表

do

命令序列

done

例1:根据姓名列表批量添加用户

vim /root/users.txt //用做测试列表文件

jdy

ttl

tcc

vim uaddfor.sh

#!/bin/bash

ULIST=$(cat /root/users.txt)

for UNAME in $ULIST //从列表文件读取用户名

do

useradd $UNAME

echo "123456" | passwd --stdin $UNAME &> /dev/null

//通过管道指定密码字串

done

chmod +x uaddfor.sh

./uaddfor.sh

tail -3 /etc/passwd

例2:根据IP地址列表检查主机状态

vim /root/ipadds.txt

192.168.4.11

192.168.4.100

192.168.4.120

vim chkhosts.sh

#!/bin/bash

HLIST=$(cat /root/ipadds.txt)

for IP in $HLIST

do

ping -c 3 -i 0.2 -W 3 $IP &> /dev/null

if [ $? -eq 0 ] //嵌套if语句判断连通性

then

echo "Host $IP is up."

else

echo "Host $IP is down."

fi

done

chmod +x chkhosts.sh

./chkhosts.sh

for循环语句非常适合用于列表对象无规律,且列表来源已经固定。而对于要求控制循环次数,操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合while循环语句。

八. while循环语句

重复测试某个条件,只要条件成立则反复执行

用法:

while 条件测试操作

do

命令序列

done

例:批量添加规律编号的用户

#vim uaddwhile.sh

#!/bin/bash

PREFIX="stu"

i=1

while [ $i -le 20 ]

do

useradd ${[PREFIX}$i

echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null

let i++ //序号递增,避免死循环

done

chmod +x uaddwhile.sh

./uaddwhile.sh

grep "stu" /etc/passwd | tail -3

例:猜价格游戏,要求由脚本预先生成一个随机的价格数目(0-99)作为实际价格,判断用户猜测得价格是否高出或低于实际价格,给出相应的提示后再次要求用户猜测,直到用户猜中实际价格为止,输出用户共猜测的次数、实际价格。

#vim pricegame.sh

#!/bin/bash

PRICE=$(expr $RANDOM % 1000) //输入price一个随机数

TIMES=0

echo "商品实际价格范围为0-999,猜猜看是多少?"

while true //循环条件:true

do

read -p "请输入你猜测的价格数目:" INT

let TIMES++

if [ $INT -eq $PRICE ] ; then

echo "恭喜你答对了,实际价格是$PRICE"

echo "你总共猜测了$TIMES次"

exit 0

elif [ $INT -gt $PRICE ] ; then

echo "太高了!"

else

echo "太低了!"

fi

done

chmod +x pricegame.sh

./pricegame.sh

九. case分支语句

针对变量的不同取值,分别执行不同的命令序列

用法:

case 变量值 in

模式1)

命令序列1

;;

模式2)

命令序列2

;;

......

*)

默认命令序列

esac

例:检查用户输入的字符类型

提示用户从键盘输入一个字符,通过case语句判断该字符是否为字母、数字或者其他控制字符,并给出相应的提示信息。

#vim hitkey.sh

#!/bin/bash

read -p "请输入一个字符,并按Enter键确认:" KEY

case "$KEY" in

[a-z] || [A-Z])

echo "你输入的是 字母."

;;

[0-9])

echo "你输入的是 数字."

;;

*)

echo "你输入的是 空格、功能键或其他控制字符."

esac

chmod -x hitkey.sh

./hitkey.sh

十. sed、awk语句

10.1 Sed简介

sed是stream editor(流编辑器)的缩写,是一种在线编辑器,它一次处理一行内容。sed是非交互式的编辑器。

处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

10.2 Sed命令用法

格式:sed+[选项]+'命令'+文件名

常用选项:

-n :取消默认输入

-e :多项编辑

-i :直接修改读取的档案内容,而不是由屏幕输出

常用命令:

a\ :当前行后添加行

i\ :当前行前添加行

c\ :用字符串替换行

d :删除行

p :打印行

s :用一个字符串替换另一个

w :将所选的行写入文件

10.3 Sed定址

用于'命令'之前,决定对哪些行进行编辑。

如果没有指定地址,sed将处理输入文件的所有行。

1.地址是一个数字,则表示行号;是"$"符号,则表示最后一行。

2.地址可以指定范围,当需指定范围时使用逗号(,)隔开。

10.4 Sed用法

1.p命令

格式:sed -n '行号p' 文件名

2.d命令

格式:sed -n '行号d' 文件名

3.s命令

格式:sed -n '行号s/a/b/g'文件名

将文件中指定行里所有的a字符替换为b字符,g为全局变量

4.i命令

格式:sed -i '行号3d'文件名

直接修改文件内容,不打印在屏幕上

5.e命令

格式:sed -e '3d' -e '4p' 文件名

先删除第三行,再打印第四行字符

10.5 awk简介

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。

简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

10.6 awk用法

1.格式:awk ' pattern {action} '

pattern常指关系表达式,例如:

awk'/a/'file--显示文件中包含a的行

awk'$2>10'file--显示第二列中数字大于10的行

2. 分隔提取:awk -F"分隔符"'{print $1}'

例如:

awk -F.'{print $1, print $2}'表示以点为分隔符将每一行的前二个字段,分行输出

10.7 awk实例

判定输入ip的有效性:

vim a.sh

#!/bin/bash

read -p "请输入ip:" A

B=`echo $A |awk -F. "{print $1}"`

if [ $B -le 0 ] || [ $B -gt 255 ]

then echo "请输入正确的IP"

else

echo "ok"

fi

chmod +x a.sh

sh a.sh

十一. shell实例

例1:编写一个系统服务脚本

vim myprog

#!/bin/bash

case "$1" in

start)

echo -n "正在启动sleep服务..."

if sleep 7200 &

then

echo "OK"

fi

;;

stop)

echo -n "正在停止sleep服务..."

pkill "sleep" &> /dev/sull

echo "OK"

;;

status)

if pgerp "sleep" &> /dev/sull ;

then

echo "sleep服务已经启动."

else

echo "sleep服务已经停止."

fi

;;

restart)

$0 stop

$0 start

;;

esac

chmod +x myprog

./myprog start

例2: shell打印九九乘法表

使用for循环

for i in $(seq 1 9)

do

for j in $(seq 1 $i)

do

echo -n "$j * $i" = $[i * j] " "

done

echo

done

//例中$[i * j]可写为:$((i * j))、$[$j*$i]、$(( $j * $i ))、`expr $i \* $j`

//修改:第二个do下加一行 let "temp = i * j",再把$[i * j]改为:$temp

while 反向的乘法表:

i=9

j=1

while ((i>=1))

do

while ((j<=i))

do

echo -n "$j * $i"=$[$j * $i] " "

let j++

done

len j=1

let i--

echo ""

done

关于"LINUX中shell脚本编程的方法是什么"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"LINUX中shell脚本编程的方法是什么"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

命令 文件 变量 字符 脚本 测试 输入 条件 用户 语句 格式 字符串 序列 内容 处理 运算 价格 输出 系统 循环 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技金融是不是互联网金融 金融科技与互联网金融 唐信互联网科技 狮子座互联网科技有限公司 人人互联网科技是培训 金融科技和互联网金融 互联网科技股午盘股票涨跌 新华互联网科技校企合作 互联网科技创新企业排名 安控科技rtu产品工业互联网 江苏南京365互联网科技 阿里巴巴算科技企业还是互联网 受益于互联网科技的高速发展 互联网对科技的发展 互联网科技公司实习生 中国航天科技大学国际工业互联网 阿大互联网科技有限公司 卓翼科技产业互联网合作 米泉互联网科技专业怎么样 承德科技产业互联网平台 互联网是不是新科技 互联网扶贫科技 没上市的科技互联网公司 宜安科技 互联网金融 赫美联合互联网科技 昭通云南众福互联网科技有限公司 济南有互联网科技公司吗 山东星卡互联网科技有限公司官网 美国互联网科技公司 长沙渺峰互联网科技有限公司
0