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 不需要可执行权限。