Linux核心shell之深入学习

Linux可划分为以下四部分:
Linux内核
GNU工具
图形化桌面环境
应用软件
大致架构如下:
在这里插入图片描述

Linux 内核

内核主要负责以下四种功能:
系统内存管理
软件程序管理
硬件设备管理
文件系统管理

将终端的背景色设置成白色、文本设置成黑色
setterm -inversescreen on或者setterm –background white + setterm –foreground black两个命令

GNU bash shell
单点符(.),表示当前目录
双点符(…),表示当前目录的父目录

cp -i 新文件test_two和文件test_one的修改时间并不一样。如果目标文件已经存在,cp命令
可能并不会提醒这一点。最好是加上-i选项,强制shell询问是否需要覆盖已有文件。

链接文件

符号链接:符号链接就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。
这两个通过符号链接在一起的文件,彼此的内容并不相同。
要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用ln命令以及-s选项来
创建符号链接。

$ ls -l data_file
-rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file 
$ 
$ ln -s data_file sl_data_file
$ 
$ ls -l *data_file
-rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file 
lrwxrwxrwx 1 christine christine 9 May 21 17:29 sl_data_file -> data_file

在上面的例子中,注意符号链接的名字sl_data_file位于ln命令中的第二个参数位置上。显示
在长列表中符号文件名后的->符号表明该文件是链接到文件data_file上的一个符号链接。
另外还要注意的是,符号链接的文件大小与数据文件的文件大小。符号链接sl_data_file只有9
个字节,而data_file有1092个字节。这是因为sl_data_file仅仅只是指向data_file而已。它们的内容
并不相同,是两个完全不同的文件。
另一种证明链接文件是独立文件的方法是查看inode编号。文件或目录的inode编号是一个用
于标识的唯一数字,这个数字由内核分配给文件系统中的每一个对象。要查看文件或目录的inode
编号,可以给ls命令加入-i参数。
$ ls -i *data_file
296890 data_file 296891 sl_data_file
$
从这个例子中可以看出数据文件的inode编号是296890,而sl_data_file的inode编号则是
296891。所以说它们是不同的文件。

硬链接
硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言
是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,
只不过这次使用ln命令时不再需要加入额外的参数了。

$ ls -l code_file 
-rw-rw-r-- 1 christine christine 189 May 21 17:56 code_file 
$ 
$ ln code_file hl_code_file 
$ 
$ ls -li *code_file 
296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56 
code_file 
296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56 
hl_code_file 
$

在上面的例子中,我们使用ls -li命令显示了*code_files的inode编号以及长列表。注意,
带有硬链接的文件共享inode编号。这是因为它们终归是同一个文件。还要注意的是,链接计数
(列表中第三项)显示这两个文件都有两个链接。另外,它们的文件大小也一模一样。

说明
只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,
只能使用符号链接。

复制链接文件的时候一定要小心。如果使用cp命令复制一个文件,而该文件又已经被链接
到了另一个源文件上,那么你得到的其实是源文件的一个副本。这很容易让人犯晕。用不着复
制链接文件,可以创建原始文件的另一个链接。同一个文件拥有多个链接,这完全没有问题。
但是,千万别创建软链接文件的软链接。这会形成混乱的链接链,不仅容易断裂,还会造成各
种麻烦。

shell脚本

外层应用程序如果想直接操作linux外核,需要使用shell
1、在创建shell脚本文件时,必须在文件的第一行指定要使用的shell。其格式为:
#!/bin/bash
在通常的shell脚本中,井号(#)用作注释行。shell并不会处理shell脚本中的注释行。然而,
shell脚本文件的第一行是个例外,#后面的惊叹号会告诉shell用哪个shell来运行脚本(是的,你
可以使用bash shell,同时还可以使用另一个shell来运行你的脚本)。

2、在指定了shell之后,就可以在文件的每一行中输入命令,然后加一个回车符。之前提到过,
注释可用#添加。例如:

#!/bin/bash 
# This script displays the date and who's logged on 
date 
who

这就是脚本的所有内容了。可以根据需要,使用分号将两个命令放在一行上,但在shell脚本
中,你可以在独立的行中书写命令。shell会按根据命令在文件中出现的顺序进行处理。

3、你要跨过的第一个障碍是让bash shell能找到你的脚本文件。shell会通过PATH环境变量来查找命令。快速查看一下PATH环境变量就可以弄清问题所在
要让shell找到test1脚本,只需采取以下两种作法之一:
(1)将shell脚本文件所处的目录添加到PATH环境变量中;
(2)在提示符中用绝对或相对文件路径来引用shell脚本文件。

第二个就是要给文件赋权
chmod rwx read 读取 w write x 执行

4、echo命令后面加上了一个字符串,该命令就能显示出这个文本字符串
在字符串中出现引号的话,需要用单引号或双引号来划定文本字符串

$ echo "This is a test to see if you're paying attention" 
This is a test to see if you're paying attention 
$ echo 'Rich says "scripting is easy".' 
Rich says "scripting is easy".

否则字符串中的引号就没啦

如果想把文本字符串和命令输出显示在同一行中,该怎么办呢?可以用echo语句的-n参数。只要将第一个echo语句改成这样就行:
echo -n "The time and date are: "
你需要在字符串的两侧使用引号,保证要显示的字符串尾部有一个空格。命令输出将会在紧
接着字符串结束的地方出现。现在的输出会是这样:
$ ./test1
The time and date are: Mon Feb 21 15:42:23 EST 2014

5、
(1)环境变量:在脚本中,你可以在环境变量名称之前加上美元符($)来使用这些环境变量
(2)用户变量:用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量
区分大小写,所以变量Var1和变量var1是不同的!!!
使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格

var1=10 
var2=-57 
var3=testing 
var4="still more testing"

与系统变量类似,用户变量可通过美元符引用。

$ cat test3 
#!/bin/bash
# testing variables 
days=10 
guest="Katie" 
echo "$guest checked in $days days ago" 
days=5 
guest="Jessica" 
echo "$guest checked in $days days ago" 
$ 

运行脚本会有如下输出。
$ chmod u+x test3
$ ./test3
Katie checked in 10 days ago
Jessica checked in 5 days ago
$
注意:变量每次被引用时,都会输出当前赋给它的值

在赋值语句中使用value1变量的值时,仍然必须用美元符

value1=10 
value2=$value1 
echo The resulting value is $value2

这样才能正常输出
因为没有美元符,shell会将变量名解释成普通的文本字符串

6、命令替换
shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋
给变量之后,就可以随意在脚本中使用了。这个特性在处理脚本数据时尤为方便
有两种方法可以将命令输出赋给变量:
反引号字符(`)
( ) 格 式 t e s t i n g = ′ d a t e ′ t e s t i n g = ()格式 testing='date' testing= ()testing=datetesting=(date)
shell会运行命令替换符号中的命令,并将其输出赋给变量testing。注意,赋值等号和命令替换字符之间没有空格

$ cat test5 
#!/bin/bash 
testing=$(date) 
echo "The date and time are: " $testing 
$

下面这个例子很常见,它在脚本中通过命令替换获得当前日期并用它来生成唯一文件名

#!/bin/bash 
# copy the /usr/bin directory listing to a log file 
today=$(date +%y%m%d) 
ls /usr/bin -al > log.$today

today变量是被赋予格式化后的date命令的输出。这是提取日期信息来生成日志文件名常用
的一种技术。+%y%m%d格式告诉date命令将日期显示为两位数的年月日的组合140131

7、输出重定向
最基本的重定向将命令的输出发送到一个文件中。bash shell用大于号(>)来完成这项功能:

$ date > test6 
$ ls -l test6 
-rw-r--r-- 1 user user 29 Feb 10 17:56 test6 
$ cat test6 
Thu Feb 10 17:56:58 EDT 2014 
$

重定向操作符创建了一个文件test6(通过默认的umask设置),并将date命令的输出重定向
到该文件中。如果输出文件已经存在了,重定向操作符会用新的文件数据覆盖已有文件。

$ who > test6 
$ cat test6 
user pts/0 Feb 10 17:55 
$

如果不想覆盖文件原有内容,而是想要将命令的输出追加到已有文件中,比如你正
在创建一个记录系统上某个操作的日志文件。在这种情况下,可以用双大于号(>>)来追加数据

8、输入重定向
这里有个和wc命令一起使用输入重定向的例子。
$ wc < test6
2 11 60
$
wc命令可以对对数据中的文本进行计数。默认情况下,它会输出3个值:
文本的行数
文本的词数
文本的字节数

9、管道
要将一个命令的输出作为另一个命令的输入,这个过程叫作管道连接(piping)。符号是 |
command1 | command2

10、使用方括号
原先使用expr命令来操作数学表达式,现在有更好的方法:
bash shell为了保持跟Bourne shell的兼容而包含了expr命令,但它同样也提供了一种更简单
的方法来执行数学表达式。在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和
方括号($[ operation ])将数学表达式围起来。
方括号[]里不会有通配符,都是运算符号

bash shell数学运算符只支持整数运算。若要进行任何实际的数学计算,这是一个巨大的限制。

11、浮点型的数学运算——bc
可以用命令替换运行bc命令,并将输出赋给一个变量
variable=$(echo “options; expression” | bc)
第一部分options允许你设置变量。如果你需要不止一个变量,可以用分号将其分开。
expression参数定义了通过bc执行的数学表达式。这里有个在脚本中这么做的例子

#!/bin/bash 
var1=$(echo "scale=4; 3.44 / 5" | bc) 
echo The answer is $var1 
$

这个例子将scale变量设置成了四位小数,并在expression部分指定了特定的运算。运行
这个脚本会产生如下输出。

11、退出脚本
在这里插入图片描述

Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码。对于需要进行检查的
命令,必须在其运行完毕后立刻查看或使用$?变量。它的值会变成由shell所执行的最后一条命令
的退出状态码。
按照惯例,一个成功结束的命令的退出状态码是0。如果一个命令结束时有错误,退出状态码就是一个正数值

12、特殊参数变量

$1-9 第1个到第9个参数  ${10}   10个以上参数要加{}
$0 读取脚本名,这个脚本名是带路径的,不带路径的要加basename      basename $0
特殊变量$#含有脚本运行时携带的命令行参数的个数
$*$@变量可以用来轻松访问所有的参数
$*变量会将命令行上提供的所有参数当作一个单词保存。这个单词包含了命令行中出现的每一个参数值。基本上$*变量会将这些参数视为一个整体,而不是多个个体。
$@变量会将命令行上提供的所有参数当作同一字符串中的多个独立的单词。这样你就能够遍历所有的参数值,得到每个参数。这通常通过for命令完成。

$* rich barbara katie jessica 给它的参数会被它当成一个参数,放在一行
$@ rich barbara katie jessica 给它的参数会被单独处理,可以作为遍历命令行的绝妙方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值