栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

shell变量,重定向,管道

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

shell变量,重定向,管道

  1. 定义变量(无引号、单引号、双引号)

用“=”连接变量名和变量值

设置变量值时,“=”左右不能直接连接空

 

如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;

如果 value 包含了空白符,那么就必须使用引号包围起来。

试以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。

以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。

  1. 输出变量值(两种方法)、换行输出、不换行输出

 

  1. 修改变量值,追加新内容,并输出

 

修改输出:

 

追加输出:”$variable_name ”或 ${variable_name }

 

  1. 使用read赋值变量值,并输出,对选项-p、-n进行练习

 

  1. 输出系统环境变量
  2. env

 

export

 

  1. 特殊变量的应用:$、?

$:查看当前Bash的进程号(PID)

 

?:返回上一个命令的状态码,一般用0表示成功非0表示失败异常

 

  1. 输出重定向”>”,”>>”,输出到lzx.sh(自己姓名首拼)中

 

输出重定向是指命令的结果不再输出到显示器上,而是输出到其它地方,一般是文件中。

在命令后输入大于号“>”并且后跟一个文件名,对原文件的内容进行了“覆盖”,即清空原文件内容。

在命令后输入两个大于号“>>”并且后跟一个文件名,表示在原文件的基础上“追加”新内容。

  1. 输入重定向”<”练习(与ppt中不同的案例)输入重定向就是改变输入的方向,不再使用键盘作为命令输入的来源,而是使用文件作为命令的输入。功能:将原来从键盘输入的数据改为从文件读取。
  2. 以file1作为输入,输出file1的行数

将file1作为输入,将对file1的操作结果输出到file2

 

从键盘读取数据,直到遇到END才结束

 

  1. 管道”|”练习。

可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)。

功能:一个命令的输出成为另一个命令的输入

使用管道符号“|”连接两个命令,左侧命令的输出成为右侧命令的输入,可以在一条命令中多次使用管道符号以实现更复杂的操作

 

 

  1. 用命令的执行结果为变量赋值的两种方法`command ` 或$(command ),哪个更好?

第二种方式更好,因为第一种方式把命令用反引号` `(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易混淆。第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

  1. 使用变量值的两种形式$variable_name  或  ${variable_name}区别是什么?

 

${variable_name}具有截取功能

格式为${变量名:开始处(起始为0):步长}

  1. 如何验证变量的作用范围?

在不同的作用域中,同名的变量不会相互干涉,就好像 A 班有个叫小明的同学,B 班也有个叫小明的同学,虽然他们都叫小明(对应于变量名),但是由于所在的班级(对应于作用域)不同,所以不会造成混乱。但是如果同一个班级中有两个叫小明的同学,就必须用类似于“大小明”、“小小明”这样的命名来区分他们。
Shell 变量的作用域可以分为三种:

  • 有的变量可以在当前 Shell 会话中使用,这叫做全局变量(global variable);
  • 有的变量只能在函数内部使用,这叫做局部变量(local variable);
  • 而有的变量还可以在其它 Shell 中使用,这叫做环境变量(environment variable)。

所谓全局变量,就是指变量在当前的整个 Shell 会话中都有效。每个 Shell 会话都有自己的作用域,彼此之间互不影响。在 Shell 中定义的变量,默认就是全局变量。
想要实际演示全局变量在不同 Shell 会话中的互不相关性,可在图形界面下同时打开两个 Shell,或使用两个终端远程连接到服务器(SSH)。
首先打开一个 Shell 窗口,定义一个变量 a 并赋值为 88,然后打印,这时在同一个 Shell 窗口中是可正确打印变量 a 的值的。然后再打开一个新的 Shell 窗口,同样打印变量 a 的值,但结果却为空,如图 所示。
 
图1:打开两个 Shell 会话

这说明全局变量 a 仅仅在定义它的第一个 Shell 中有效,对其它 Shell 没有影响。这很好理解,就像小王家和小徐家都有一部电视机(变量名相同),但是同一时刻小王家和小徐家的电视中播放的节目可以是不同的(变量值不同)。
需要强调的是,全局变量的作用范围是当前的 Shell 会话,而不是当前的 Shell 脚本文件,它们是不同的概念。打开一个 Shell 窗口就创建了一个 Shell 会话,打开多个 Shell 窗口就创建了多个 Shell 会话,每个 Shell 会话都是独立的进程,拥有不同的进程 ID。在一个 Shell 会话中,可以执行多个 Shell 脚本文件,此时全局变量在这些脚本文件中都有效。

例如,现在有两个 Shell 脚本文件,分别是 1.sh 和 2.sh。

1.sh 的代码如下:

2.sh 的代码如下:

打开一个 Shell 窗口,输入以下命令:

 从输出结果可以发现,在 Shell 会话中以命令行的形式定义的变量 a,在 1.sh 中有效;在 1.sh 中定义的变量 b,在 2.sh 中也有效。

局部变量

Shell 也支持自定义函数,但是 Shell 函数和 C/C++、Java 等其他编程语言函数的一个不同点就是:在 Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果。请看下面的代码:

a 是在函数内部定义的,但是在函数外部也可以得到它的值,证明它的作用域是全局的,而不是仅限于函数内部。


要想变量的作用域仅限于函数内部,那么可以在定义时加上local命令,此时该变量就成了局部变量。请看下面的代码:

输出结果为空,表明变量 a 在函数外部无效,是一个局部变量。

环境变量

全局变量只在当前 Shell 会话中有效,如果使用export命令将它导出,那么它就在所有的子 Shell 中也有效了,这称为“环境变量”。
环境变量被创建时所处的 Shell 被称为父 Shell,如果在父 Shell 中再创建一个 Shell,则该 Shell 被称作子 Shell。当子 Shell 产生时,它会继承父 Shell 的环境变量为自己所用,所以说环境变量可从父 Shell 传给子 Shell。不难理解,环境变量还可以传递给孙 Shell。

注意:环境变量只能向下传递,不能向上传递

在一个 Shell 中创建子 Shell 最简单的方式是运行 bash 命令,如图

通过exit命令可以一层一层地退出 Shell。
下面演示一下环境变量的使用:

  1. $ a=99    #定义一个全局变量
  2. $ echo $a    #在当前Shell中输出a,成功
  3. 99
  4. $ bash    #进入子Shell
  5. $ echo $a    #在子Shell中输出a,失败
  6.  
  7. $ exit    #退出子Shell
  8. exit
  9. $ export a    #将a导出为环境变量
  10. $ bash    #重新进入子Shell
  11. $ echo $a    #在子Shell中再次输出a,成功
  12. 99
  13. $ exit    #退出子Shell
  14. exit
  15. $ exit    #退出父Shell,结束整个Shell会话

可以发现,默认情况下,a 在子 Shell 中是无效的;使用 export 将 a 导出为环境变量后,在子 Shell 中就可以使用了。
export a这种形式是在定义变量 a 以后再将它导出为环境变量,如果想在定义的同时导出为环境变量,可以写作export a=99。
注意,本节我们一直强调的是环境变量在子 Shell 中有效,并没有说它在所有的 Shell 种有效;如果你通过终端创建一个新的 Shell,那么它就不是当前 Shell 的子 Shell,环境变量对这个 Shell 就是无效的。

此外,通过export命令导出的环境变量是临时的,关闭 Shell 会话后它就销毁了。所以,这种环境变量也只是在局部范围内起作用,并不影响所有 Shell。

将管道、find、grep结合进行练习。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/890879.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号