Linux学习-菜鸟教程知识(四)
发布日期:2022-02-01 14:28:07 浏览次数:24 分类:技术文章

本文共 4205 字,大约阅读时间需要 14 分钟。

Shell 函数

[ function ] funname [()]{	action;	[return int;]}#!/bin/bashdemoFun(){	echo "这是我的第一个shell函数"}demoFun这是我的第一个 shell 函数!
#!/bin/bashfunWithReturn(){    echo "这个函数会对输入的两个数字进行相加运算..."    echo "输入第一个数字: "    read aNum    echo "输入第二个数字: "    read anotherNum    echo "两个数字分别为 $aNum 和 $anotherNum !"    return $(($aNum+$anotherNum))}funWithReturnecho "输入的两个数字之和为 $? !"这个函数会对输入的两个数字进行相加运算...输入第一个数字: 1输入第二个数字: 2两个数字分别为 1 和 2 !输入的两个数字之和为 3 !

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

函数参数

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

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

$# 传递到脚本或函数的参数个数$* 以一个单字符串显示所有向脚本传递的参数$$ 脚本运行的最后一个进程ID号$! 后台运行的最后一个进程的ID号$@ 与$*相同,但是使用时教引号,并在引号中返回每个参数$- 显示Shell使用的当前选项,与set命令功能相同$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

和 C 语言不同,shell 语言中 0 代表 true,0 以外的值代表 false。

Shell 输入/输出重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

command > file 将输出重定向到filecommand < file 将输入重定向到filecommand >> file 将输出以追加的方式重定向到filen > file 将文件描述为n的文件重定向到filen >> file 将文件描述符为n的文件以追加的方式重定向到filen >& m 将输出文件m和n合并n <& m 将输入文件m和n合并<< tag 将开始标记tag和结束标记tag之间的内容作为输入

文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

输出重定向

$ echo "菜鸟教程:www.runoob.com" > users$ cat users菜鸟教程:www.runoob.com$

输入重定向

command1 < file1

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

如果希望 stderr 重定向到 file,可以这样写:$ command 2>file如果希望 stderr 追加到 file 文件末尾,可以这样写:$ command 2>>file如果希望对 stdin 和 stdout 都重定向,可以这样写:$ command < file1 >file2command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。

Here Document

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。

command << delimiter    documentdelimiter

它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

  • 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
  • 开始的delimiter前后的空格会被忽略掉。
cat << EOF欢迎来到hello worldEOF欢迎来到hello world

/dev/null 文件

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

$ command > /dev/null

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

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

$ command > /dev/null 2&1

Shell文件包含

. filename或source filename

test.sh

#!/bin/bashurl="http://www.baidu.com"

test2.sh

#!/bin/bash. ./test1.sh #使用.号来引用test1.sh文件#或者# source ./test1.shecho "百度官网:$url"
$ chmod +x test2.sh $ ./test2.sh 菜鸟教程官网地址:http://www.runoob.com

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

Linux链接概念

默认情况产生硬链接

硬链接

硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。

硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

软连接

另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。

touch f1ln f1 f2 #创建f1的硬链接f2ln -s f1 f3 #创建f1的软连接f3ls -li #-i显示文件的inode节点信息total 09797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f19797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f29797649 lrwxrwxrwx  1 oracle oinstall 2 Apr 21 08:11 f3 -> f1

从上面的结果中可以看出,硬连接文件 f2 与原文件 f1 的 inode 节点相同,均为 9797648,然而符号连接文件的 inode 节点不同。

echo "I am f1 file" >>f1cat f1I am f1 filecat f2I am f1 filecat f3I am f1 filerm -f f1cat f2I am f1 filecat f3cat: f3: No such file or directory

当删除原始文件 f1 后,硬连接 f2 不受影响,但是符号连接 f1 文件无效

  • 删除符号连接f3,对f1,f2无影响;
  • 删除硬连接f2,对f1,f3也无影响;
  • 删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效;
  • 同时删除原文件f1,硬连接f2,整个文件会真正的被删除。

转载地址:https://blog.csdn.net/shunjianxaioshi/article/details/111611919 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Linux学习-菜鸟教程知识(三)
下一篇:python基础知识(一)

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月08日 17时41分21秒