Linux系统编程-Shell脚本基本使用(变量、运算符、语句等)

简介: Shell 本身是一个用 C 语言编写的程序, Shell 作为命令语言时,可以交互式地解释和执行用户输入的命令;作为程序设计语言时,支持定义各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

1. Shell脚本介绍

Shell 本身是一个用 C 语言编写的程序, Shell 作为命令语言时,可以交互式地解释和执行用户输入的命令;作为程序设计语言时,支持定义各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

shell脚本的后缀一般是.sh,后缀只是方便用户部分这是个脚本文件。就像windows下的.bat后缀文件一样的道理。

Shell 脚本不需要编译,是依靠解析器解析运行,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。所以效率上是没有编译型语言速度快,不适合写大量运算的代码。

Linux 下的 Shell 解释器种类众多,当前系统的支持的解释器可以在/etc/shells 文件里查看:

[wbyq@wbyq linux_c]$ cat /etc/shells
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh

查看当前系统默认的 shell:

[xiao@localhost file_2]$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 05-25 19:24 /bin/sh -> bash

如果在脚本里想使用其他解释器,可以使用以下语法进行指定:

#!/bin/bash

!告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序

下面就介绍Shell脚本的基础语法规则、基本使用案例。

2. Shell脚本的基本语法规则

创建一个简单的脚本文件并运行:

[wbyq@wbyq linux_c]$ vim shell.sh
[wbyq@wbyq linux_c]$ ls /bin/sh -l
lrwxrwxrwx. 1 root root 4 7月   1 2019 /bin/sh -> bash
[wbyq@wbyq linux_c]$ ls
shell.sh
[wbyq@wbyq linux_c]$ ./shell.sh 
12345
jsdsdsd
[wbyq@wbyq linux_c]$ sh shell.sh 
12345
jsdsdsd

Shell脚本一些规则总结:

在脚本代码里#表示注释,并且只是支持单行注释.

\#! 是用来指定脚本解释器,#!是一个整体. 比如: #!/bin/bash

脚本文件编写之后需要将文件权限改为可执行才可以直接运行

3. shell变量基本使用

#!/bin/bash
cnt=12345
echo "$cnt"
echo "${cnt}"
echo "${cnt}67890abcd"

int_a=6666
abcd="hello"
float_c=123.456
char_d='A'
printf "%d,%f,%c,%s\n" $int_a $float_c $char_d $abcd

4. 获取命令行传递的参数

#!/bin/bash
printf "脚本名称:$0\n"
printf "第一个参数:$1\n"
printf "第二个参数:$2\n"
printf "第三个参数:$3\n"
printf "所有参数:$*\n"
printf "参数总个数:$#\n"
rm 123.c
printf "上一个命令执行状态:%d\n" $?

5. 算术运算符

#!/bin/bash
a=10
b=20
c=30
d=`expr $a + $b + $c`
printf "d=$d\n"

d=`expr $a \* $b`
printf "d=$d\n"

d=`expr $a '*' $b`
printf "d=$d\n"

d=`expr \( 12 + 66 + 77 \) \* 12`
printf "d=$d\n"

6. if语句基本用法

基本语法格式:
#!/bin/bash
if [ 123 -eq 123 ]
then
    printf "相等\n"
fi

if [ 123 -eq 456 ]
then
    printf "相等\n"
else
    printf "不相等\n"
fi

if [ 123 -eq 456 ]
then
    printf "123 -eq 456 相等\n"
elif [ 456 -eq 888 ]
then
    printf "456 -eq 888 相等\n"
elif [ 456 -eq 456 ]
then
    printf "456 -eq 456 相等\n"
else
    printf "123 -eq 456 不相等\n"
fi

if [ 123 -eq 123 -a 456 -eq 456 ]
then
    printf "相等1\n"
fi

if [ 123 -eq 123 -o 456 -eq 457 ]
then
    printf "相等2\n"
fi

if [ 123 -eq 123 -o 456 -eq 457 ] && [ 123 -eq 123 -a 456 -eq 457 ]
then
    printf "相等3\n"
fi

if [ 123 -eq 123 -o 456 -eq 457 ] || [ 123 -eq 123 -a 456 -eq 457 ]
then
    printf "相等4\n"
fi

7. 如何从键盘上输入数据?

#!/bin/bash
read -p "请输入一个整数:" data
printf "你输入的整数:%d\n" ${data}

printf "请输入一个浮点数:"
read f_data
printf "你输入的浮点数:%f\n" ${f_data}

read -t 3 -p "输入一个字符串:" str_data
if [ $? -eq 0 ]
then
    printf "你输入的字符串:%s\n" $str_data
else
    printf "你输入太慢了.\n"
fi

read -s -p "请输入密码:" pass
printf "你输入的密码:%s\n" $pass

8. 判断平年和闰年

#!/bin/bash
read -p "请输入年份:" year

#1. 能被4整除 并且不能被100整除
#2. 能被400整除
if [ `expr $year % 4` -eq 0 -a `expr $year % 100` -ne 0 ] || [ `expr $year % 400` -eq 0 ]
then
    printf "%d 是闰年.\n" $year
else
    printf "%d 是平年.\n" $year
fi

if [ `expr $year % 4` -eq 0 -a `expr $year % 100` -ne 0 ]
then
     printf "%d 是闰年.\n" $year
elif [ `expr $year % 400` -eq 0 ]
then
    printf "%d 是闰年.\n" $year
else
    printf "%d 是平年.\n" $year
fi

9. for循环的基本使用

#!/bin/bash
for data in 1 2 3 4 5 6 7 9 0
do
    if [ $data -eq 5 ]
    then
        break 1
    fi
    printf "data1=%d\n" $data
done

for data in 1 2 3 4 5 6 7 9 0
do
    if [ $data -eq 5 ]
    then
        continue
    fi
    printf "data2=%d\n" $data
done

for file_name in *.sh
do
    printf "file_name=%s\n" $file_name
done

for file_name in /home/wbyq/*.sh
do
    printf "file_name=%s\n" $file_name
done

10. 使用for循环输出9*9乘法口诀表

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9
do
    for j in 1 2 3 4 5 6 7 8 9
    do
        printf "%d*%d=%d " $j $i `expr $i '*' $j`
        if [ $i -eq $j ]
        then
            break 1
        fi
    done
    printf "\n"
done

[wbyq@wbyq linux_c]$ ./shell.sh 
1*1=1 
1*2=2 2*2=4 
1*3=3 2*3=6 3*3=9 
1*4=4 2*4=8 3*4=12 4*4=16 
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 

11. while 循环基本用法

#!/bin/bash

#无限循环的编写案例
#while :
#do
#    printf "hello\n"
#    sleep 1
#done

#常规用法
cnt=0
while [ $cnt -lt 10 ]
do
    printf "cnt=%d\n" $cnt
    cnt=`expr $cnt + 1`
done

12. 使用while循环输出9*9乘法口诀表

#!/bin/bash
i=1
while [ $i -lt 10 ]
do
    j=1
    while [ $j -le $i ]
    do
        printf "%d*%d=%d " $j $i `expr $j \* $i`
        j=`expr $j + 1`
    done
    printf "\n"
    i=`expr $i + 1`
done

[wbyq@wbyq linux_c]$ ./shell.sh 
1*1=1 
1*2=2 2*2=4 
1*3=3 2*3=6 3*3=9 
1*4=4 2*4=8 3*4=12 4*4=16 
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
目录
相关文章
|
6天前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
60 32
|
16天前
|
存储 Linux 网络安全
linux应急响应检查脚本
通过这个脚本,可以快速收集系统的关键信息,有助于在发生问题时进行及时的应急响应和分析。
74 34
|
9天前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
38 17
|
18天前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
50 26
|
2月前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
2月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
121 13
|
3月前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
Shell
shell编程运算符
运算符很多啦,加减乘除,取余,以及逻辑运算符中的与或非等等 但是我们这里只说一种运算表示方法就足够应对工作需要了 aa=11 bb=12 怎么求和呢? sum=$(($aa + $bb)) echo $sum 就这么简单! 这里再次强调 $(()) 的作用很重要哦!
646 0
|
4月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
152 1