Linux Shell 入门实战之二
sinye56 2025-01-14 16:52 13 浏览 0 评论
函数
Shell 脚本函数是一组可以被重复调用的代码块,它们可以帮助你简化脚本编写、提高代码复用性以及增强可读性。通常我们将一个独立的功能编写为函数,在需要的地方调用他们,在 Linux 中,我们通常使用 Bash(Bourne Again SHell)来编写 Shell 脚本。
定义函数
在 Bash 中,你可以使用 function 关键字或者直接使用括号来定义一个函数。以下是两种定义方式:
# 使用 function 关键字
function my_function {
echo "This is a function"
}
# 使用括号
my_function() {
echo "This is another function"
}
调用函数
定义好函数后,你可以通过函数名来调用它:
#!/bin/bash
val=10
# 定义一个名为 func_name 的函数
function func_name() {
if [ $val -eq 10 ]; then
echo "Value is 10"
elif [ $val -lt 10 ]; then
echo "Value is less than 10"
else
echo "Value is greater than 10"
fi
}
# 调用上面定义的函数
func_name
带参数的函数
函数可以接受参数,这些参数在函数内部可以通过 $1, $2, ..., $N 来访问。
#!/bin/bash
greet() {
echo "Hello, your input parameter is $1"
}
greet "First Params"
# 上面的函数执行后将输出Hello, your input parameter is First Params
返回值
函数可以通过 return 命令返回一个状态码(0-255),也可以使用 echo 输出结果。
#!/bin/bash
add() {
local sum=$(( $1 + $2 ))
echo $sum
}
result=$(add 3 5)
echo "The result is: $result"
# 上面的函数执行后将输出The result is: 8
综合示例
下面编写了一个函数file_exist 函数用于获取第一个参数,这个参数是一个文件,判断该文件是否存在;path 变量用于从命令行接受第二个参数,create_path函数用于创建目录,这个函数在judge_path 函数中调用,judge_path 函数用于判断给定的path路径是否存在,如果不存在则使用create_path进行创建,main函数用于调用 file_exist函数和judge_path 函数,这是整个文件执行的入口,一般我们在最下方调用main,这是一个比较典型的编写函数的流程,任何其他函数都可以套用这个逻辑。
#!/bin/bash
# 判断文件是否存在
file_name=$1
file_exist() {
if [ -e "$file_name" ]; then
echo "File $file_name exists."
else
echo "File $file_name does not exists."
fi
}
# 判断目录是否存在,如果不存在则创建
path=$2
# 创建目录
create_path() {
mkdir $path
}
# 判断目录是否存在
judge_path() {
if [ -d "$path" ];then
echo "目录已存在"
else
create_path
fi
}
main() {
file_exist
judge_path
}
# 函数入口
main
我们将上面的代码保存到func.sh文件中,当然你可以根据需要进行命名,在命令行分别输入以下命令,并对比执行结果,执行 bash func.sh data /opt和bash func.sh test /aa 的执行结果如下:
Shell 输入/输出重定向
在 Shell 中,输入输出重定向是一种改变命令的输入和输出流的机制。默认情况下,大多数命令从标准输入(通常是键盘)读取数据,并把结果输出到标准输出(通常是屏幕)。通过使用重定向操作符,你可以改变这种默认行为,将命令的输出写入文件,或者从文件中读取输入。
输出重定向
1. 标准输出重定向(>)
将命令的输出重定向到文件中,如果文件不存在则创建文件,如果文件已存在则覆盖文件内容。
echo "Hello, World!" > output.txt
这个命令会创建一个名为 output.txt 的文件,并将字符串 "Hello, World!" 写入该文件。
2. 标准错误重定向(2>)
将命令的错误输出重定向到文件中。
ls not_existing_file 2> error.txt
这个命令会将 ls 命令的错误信息写入 error.txt 文件。
3. 标准输出和标准错误重定向(&>)
将标准输出和标准错误都重定向到同一个文件。
./your_script.sh &> log.txt
这个命令会将标准输出和错误输出都写入 log.txt 文件。
输入重定向
1. 标准输入重定向(<)
从文件中读取输入,而不是从键盘读取。
cat < input.txt
这个命令会读取 input.txt 文件的内容,并将其作为 cat 命令的输入。
追加重定向
1. 标准输出追加重定向(>>)
将命令的输出追加到文件末尾,而不是覆盖文件内容。
echo "Another line" >> output.txt
如果 output.txt 已存在,这个命令会将字符串 "Another line" 追加到文件末尾。
2. 标准错误追加重定向(2>>)
将命令的错误输出追加到文件末尾。
ls not_existing_file 2>> error.txt
3. 标准输出和标准错误追加重定向(&>>)
将标准输出和标准错误都追加到同一个文件。
./your_script.sh &>> log.txt
管道和重定向
重定向可以与管道结合使用,以实现更复杂的数据处理。
grep "error" log.txt > errors.txt
这个命令会从 log.txt 文件中搜索包含 "error" 的行,并将这些行重定向到 errors.txt 文件。
临时文件重定向
在某些情况下,你可能需要临时重定向输出,可以使用 $ 来创建一个临时文件。
tempfile=$(mktemp)
command > "$tempfile"
这里,mktemp 命令创建了一个临时文件,并将文件名存储在变量 tempfile 中。然后,command 的输出被重定向到这个临时文件。
注意事项
- 使用重定向时,如果目标文件不存在,Shell 会自动创建它。
- 使用追加重定向时,如果目标文件不存在,Shell 也会自动创建它。
- 重定向操作符会覆盖文件描述符,例如 >& 用于关闭文件描述符。
- 重定向可以用于大多数命令,但某些命令可能不支持重定向,或者重定向的行为可能与预期不同。
安装httpd服务搭建简单的文件服务器
Apache HTTP Server(通常称为httpd或Apache)是一个开源的Web服务器软件,由Apache软件基金会开发和维护。httpd采用模块化设计,用户可以根据需求动态加载或卸载模块,实现灵活的功能扩展,支持配置多个虚拟主机,使一台服务器能够承载多个域名下的网站,实现资源共享和隔离,提供丰富的安全功能,包括SSL/TLS支持、访问控制、身份认证等,保障服务器和网站的安全性,支持多进程和多线程模型,能够有效管理并发请求,提高服务器性能和响应速度,可以在大多数计算机操作系统中运行,由于其跨平台和安全性被广泛使用,支持HTTP/1.1和HTTPS协议并广泛应用于全球各类网站和Web应用。本次实验在CentOS 7系统下完成,如果使用其他Linux发行版本,一般只需要切换不同的软件包管理工具,操作类似,安装命令:
yum install httpd -y
修改配置文件,配置文件位置在/etc/httpd/conf/httpd.conf, 暴露访问端口为18080,其他配置不变,然后使用systemctl start httpd命令启动服务。配置文件内容如下:
# 指定Apache服务器的根目录
ServerRoot "/etc/httpd"
# 监听 18080 端口
Listen 18080
# 包含所有在conf.modules.d目录下的配置文件
Include conf.modules.d/*.conf
# 指定运行Apache的用户和组
User apache
Group apache
指定管理员的电子邮件地址
ServerAdmin root@localhost
<Directory />
AllowOverride none
Require all denied
</Directory>
# 指定文档根目录为/var/www/html,我们存放文件的位置,可以根据实际修改
DocumentRoot "/var/www/html"
# 允许覆盖配置(AllowOverride None)并允许所有访问(Require all granted)
<Directory "/var/www">
AllowOverride None
Require all granted
</Directory>
# 允许索引和符号链接跟随(Options Indexes FollowSymLinks)
# 不允许覆盖配置(AllowOverride None)
# 并允许所有访问(Require all granted)
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule mime_module>
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf
在浏览器输入IP:18080 可以看到如下页面,说明服务启动成功
下面我们通过将/opt/shell 目录下的脚本打包并移动到/var/www/html 目录下,然后使用wget 命令在另一台服务器上下载(资源有限,我就在同一台服务器演示下),在解压到指定目录,看看这个需求我们如何使用shell脚本来操作,我们在 /opt 目录下创建一个脚本op.sh文件,并输入以下内容:
#!/bin/bash
set -e
function mk_file() {
# 使用 tar 命令打包
tar -zcvf shell.tar.gz shell
# 将打包后的文件移动到/var/www/html 目录下
mv shell.tar.gz /var/www/html/
}
function download() {
# 将 shell.tar.gz 文件下载到 /tmp 目录下
wget http://localhost:18080/shell.tar.gz -O /tmp/shell.tar.gz
# 解压 shell.tar.gz 文件使用-C 参数指定至 /tmp目录下
tar xvf /tmp/shell.tar.gz -C /tmp/
# 查看目录解压后里面的文件
ls -l /tmp/shell
}
# 使用函数调用具体业务逻辑
function main() {
mk_file
download
}
# 函数入口
main
如果您也对 Linux 这种充满魅力和无限可能的操作系统感兴趣,那么真心地欢迎您关注我。Linux 作为一款开源的操作系统,在当今的科技领域中占据着举足轻重的地位。众多的开发者和爱好者们不断为其贡献着智慧和力量,使其功能日益强大且完善。
在后续的日子里,我将竭尽全力为大家带来一系列既有趣又实用的内容。例如,深入剖析 Linux 内核的精妙架构,让您领略其底层设计的智慧与魅力;分享一些实用的命令行技巧,帮助您在日常操作中更加高效快捷;讲述 Linux 在服务器领域的广泛应用案例,展现其强大的稳定性和可扩展性;还会介绍如何利用 Linux 进行编程开发,开启您的创新之旅。
我相信,通过这些丰富多彩的内容,能够让您对 Linux 有更深入的理解和认识,激发您探索的热情,为您在 Linux 的世界里开启一扇充满惊喜的大门。
- 上一篇:Linux-Shell编程快速入门
- 下一篇:Linux crontab 使用教程
相关推荐
- 程序员:JDK的安装与配置(完整版)_jdk的安装方法
-
对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...
- Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置
-
一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...
- 麒麟系统安装JAVA JDK教程_麒麟系统配置jdk
-
检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...
- 学习笔记-Linux JDK - 安装&配置
-
前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...
- Linux新手入门系列:Linux下jdk安装配置
-
本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...
- 测试员必备:Linux下安装JDK 1.8你必须知道的那些事
-
1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...
- Linux 下安装JDK17_linux 安装jdk1.8 yum
-
一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...
- 在Ubuntu系统中安装JDK 17并配置环境变量教程
-
在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...
- 如何在 Linux 上安装 Java_linux安装java的步骤
-
在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...
- Windows和Linux环境下的JDK安装教程
-
JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...
- linux安装jdk_linux安装jdk软连接
-
JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...
- linux安装jdk,全局配置,不同用户不同jdk
-
jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...
- 运维大神教你在linux下安装jdk8_linux安装jdk1.7
-
1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...
- window和linux安装JDK1.8_linux 安装jdk1.8.tar
-
Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...
- 最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?
-
默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)