【Linux篇】Shell脚本语法< 3 >

简介: 在安卓源码里,离不开两个东西,一个就是.sh文件,还有一个就是.mk文件。这两个文件各持有一个语法,一个是Makefile语法,一个是Shell脚本语法。这两个是真的让我头疼,就像看天书一样,呜呜呜。

7、函数


linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。


1)函数返回值

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"


函数返回值在调用该函数后通过 $? 来获得。


2)带参函数

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73


注意:$10不能获取第十个参数,获取第十个参数需要$10。当n>=10时,需要使用${n}来获取参数。



8、输入输出重定向


就是把文件内容搞过来,或者搞过去。


1)输出重定向


把乌鸡哥三个字放到这个77.txt文件中

$ echo "乌鸡哥" > 77.txt


2)输入重定向

wc -l < 文件名


其中,wc 是一个统计文本信息的命令,-l 参数表示只统计行数。< 符号表示将文件内容作为输入传入到命令中。

因此,执行这个命令后,它会读取文件 “users” 的内容,并统计其中的行数,然后输出结果。这个命令在 Unix 或 Linux 环境下经常用于查看文件的行数。



sort < input.txt > output.txt


input.txt读取文件,然后用sort排序,最后排完了再输出到output.txt



3)特殊重定向


● 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。

标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。

标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。


ls /mnt 2>> log.txt


这个命令尝试列出 /mnt 目录中的内容。如果操作成功,则结果将直接打印到终端上;但是,如果操作失败,命令将记录相关错误信息,把错误信息通过追加的方式写入到 log.txt 文件中。当您想要获取输出并将其保存在文件中时,这种重定向技术特别有用。


ls /mnt > output.txt 2>&1


这个命令尝试列出 /mnt 目录中所有的内容。如果目录可以访问,则命令将把结果列表格式输出到 output.txt 文件中,不论这些结果是标准输出还是标准错误输出。如果存在任何错误或警告信息,则它们也将被重定向到该文件中,使您可以轻松快速地查看所有输出。注意,在使用此语法时,请确保您有足够的权限来访问输入和输出文件,并且不会覆盖或修改意外文件。



4)Here Document


Here Document 是一种在 Bash/Shell 脚本中用于向命令提供输入的语法。它允许您指定一个“限定词”(也称为分界符),然后在该分界符下方的多行文本将作为命令的标准输入进行处理。

在脚本中,Here Document 语法通常采用以下形式:

command <<LIMITER
input text
...
LIMITER


其中:

command 表示要接收 Here Document 作为输入的命令。


<< 符号用于指定 Here Document 分界符,并将其留空以让 Shell 可以自动选择默认值。


LIMITER 是由用户指定的分界符,用于隔离输入文本并告诉 Shell 在何时停止读取标准输入。


input text 是最终传递给命令作为标准输入的多行文本。


注意,分界符必须从第一列开始,因此不能缩进 Here Document 中的文本。另外,当您需要在输入文本中使用变量或其他 Bash 命令时,可以在限定词前加上一个“-”符号,例如 <<-LIMITER,这会告诉 Shell 忽略输入文本中的缩进(就像 Bash 中的 heredoc 标记)。

例如,以下是一个使用 Here Document 语法的示例:

cat <<END
This is some example text that will be passed
as standard input to the cat command.
It can contain multiple lines.
END


这将创建一个名为 END 的分界符(END也可以换成pp啥都可以),并将三行文本作为标准输入传递给 cat 命令。最终,命令会将输入文本作为输出打印到终端上。



5)/dev/null 文件


如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

$ command > /dev/null


/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

$ command > /dev/null 2>&1


注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。



9、文件包含(引用)

和C语言差不多,也可以引用其他.sh脚本里面的函数、变量等等。


. filename   # 注意点号(.)和文件名中间有一空格
source filename


创建两个 shell 脚本文件


A.sh文件

#!/bin/bash
name="乌鸡哥"


B.sh文件

#!/bin/bash
#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh
echo "${name}"


$ chmod +x B.sh

$ ./B.sh

乌鸡哥

被包含的文件 A.sh 不需要可执行权限。


目录
相关文章
|
10天前
|
Web App开发 Java Linux
Linux之Shell基本命令篇
Linux之Shell基本命令篇
Linux之Shell基本命令篇
|
18天前
|
弹性计算 Shell Perl
ecs服务器shell常用脚本练习(二)
【4月更文挑战第1天】shell代码训练(二)
102 1
|
18天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
72 1
|
20天前
|
Java Shell
SpringBoot启动脚本Shell
SpringBoot启动脚本Shell
15 0
|
21天前
|
Linux Shell Python
Linux执行Python脚本
Linux执行Python脚本
26 1
|
1天前
|
运维 监控 Shell
利用Shell脚本编写局域网监控软件:实时监测主机连接情况
本文介绍了如何使用Shell脚本创建一个局域网监控工具,以实时检查主机连接状态。脚本包括扫描IP地址范围检测主机可达性及使用`netstat`监控ESTABLISHED连接。此外,还展示了如何每60秒将连接数数据自动提交到指定网站API,以便实时跟踪网络活动。这个自动化监控系统有助于提升网络安全性和故障排查效率。
6 0
|
2天前
|
Shell
Shell脚本之流程控制语句
Shell脚本之流程控制语句
|
3天前
|
JSON 运维 监控
训练shell常用脚本练习(三)
【4月更文挑战第14天】shell代码训练(三)
14 1
|
7天前
|
存储 弹性计算 Shell
ecs服务器shell常用脚本练习(十)
【4月更文挑战第11天】shell代码训练(十)
137 0
|
7天前
|
弹性计算 Shell Go
ecs服务器shell常用脚本练习(九)
【4月更文挑战第10天】shell代码训练(八)
124 0