LINUX学习之路

发布 2023-05-19 21:41:28 阅读 8002

linux学习之路3 (2011-07-21 19:59)

标签: 变量输入/输出重定 for循环 grep家族分类: linux学习之路

今天是第4天了,老师给休息的时间啊!不过最主要的任务还是让我们回来总结复习!由于这俩天系统有毛病在这儿抗争了俩天,终于胜利了!还是赶紧把昨天学到的东西总结下把!!

上一次说到了脚本的问题并且发了我写的第一个脚本的图,里面写的很麻烦!

这是修改后的,好的这次学的新东西就是从这里开始的,同样看这个脚本,如果让我么再写一个同样的不过我们换个目录例如说 /tmp/scripts2 怎么办呢?我们首先想到的方法就是将脚本里面的scripts都改为scripts2这样做当然可以!然而这是个小脚本就够麻烦了,如果大脚本不更难办了!

所以这是后引入了变量的问题!昨天已经稍微说了下变量了,好的我们在这个脚本里声明一个变量是它的 = tmp/scripts2

好的这是用变量改过的脚本,以后如果遇到都是创建不同目录的相同脚本我们只要改变量的值就可以了省力啊!呵呵。这里还有要说明的是引号 ""的问题,这里我用了单引号,这里是一个字符串并且没用空格可以不加引号,但是规范最好还是加上!

如果里面有其他变量的引用必须用双引号,没有的话用单引号或双引号都可以!还有一个变量我们使用完之后要释放它占用的空间这时候要用 uset 命令即可,当然脚本的变量在它执行完之后就自动释放了 !

这里是说明变量的使用能给我们带来极大的方便!那么linux里有哪些变量呢!又怎么用呢?

变量有4中类型

1、本地变量只对当前shell有效对子shell无效。

2、环境变量对子shell同时有效

子shell就是在一个shell里面又打开的其他shell /bin/bash

环境变量的声明必须使用 export 表示导出一个变量作用就是使其对子shell也有效。

linux里面内置里许多环境变量用于定义用户工作环境。

利用不带任何选项的 export 能够看到系统内置的环境变量 export可以看到声明过程 declare 声明一个变俩用的。

printenv 显示当系统全部或部分环境变量

env显示当前的环境变量主要作用是使用某个特定命令式在特定环境下的变量。

3、特殊变量 bash里内置的变量用于调用bash脚本编程环境一些特殊的执行结果。

例如 $?表述上一个命令是否执行成功 0表示执行成功 1-255表示错误系统使用的1 2 127

4、位置变量 $1 $2 等能直接向脚本传递参数 10以后${}写。

算数运算。如这是个计算俩个数的和差积商的脚本我们传个参数看看。

这就是变量大致的类型了!

下面说几个。

系统内置的环境变量。

histsize 记录历史命令的大小条数。

path 用于记录命令搜索的路径。

home用于记录用户家目录。

ps1 不是很清楚是个宏可以有当前变量中的值进行替换

重要功能bash的命令别名:

alias cdnet='cd /etc/sysconfig/network-scripts'设置命令的别名方法。

unalias cdnet 撤消别名。

声明的别名仅对当前shell有效。

昨天的博文里其实就有过别名出现了。

要想使这些别名永久有效怎么办呢?这要将他们存放在特定的文件中如下:

全局配置文件放的位置:/etc/profile,/etc/

局部配置文件放的位置:~/bash_profile,~/bashrc,~/bash_logout

3类区分标准。

profile类:

设置环境变量。

运行用户登录要执行的一些命令。

bashrc类:

设置别名。设置本地变量。

shell两类。

shell:交互式登录式shell以一个用户身份登录后能输入命令的,交互式登录的shell引用配置文件的次序:

etc/profile-->etc/>~bashrc-->etc/bashrc

非登录式shell:非登录式shell系统自动运行不需要用户登录且不用用户发送命令自动执行的shell

读取配置的过程:~/bashrc-->etc/bashrc-->etc/

我们可以用source或。 来读取配置文件使其生效。

下面做个课堂上的练习。

让用户登录进来的时候,显示,hi,i know you, you are 用户名。

这是在用户输入完用户名密码后登陆进来时要执行的命令所以存放在profile类里,不同的用户登陆进来后看到的是自己的名字这说明是全局的配置因此存放在 /etc/profile里面因此我们只要在这个文件里添加一句话就好!

下面是演示的结果。

接下来我们学习的是输入/输出重定向还有管道。

标准输入:/dev/stdin,0表示标准输入设备的描述符 kebyboard

标准输出:/dev/stdout,1,monitor

错误输出:/dec/stderr,2,monitor

输入重定向:<

输出重定向:>覆盖输出重定向 >>追加输出重定向不覆盖原有内容。

echo" "tmp/ 向文件末追加一行。

错误输出重定向:2>

cat查看文件内容将输入的内容输出出来。

输出流标准输出跟错误输出时俩个不同的输出流

>合并错误输出跟标准输出的输出流。

set -c 避免使用覆盖重定向在此模式下想要用覆盖则使用 >|

set +c 关闭功能。

set -/表示打开/关闭一个功能。

管道,连接多个命令将前一个命令的输出结果当做下个命令的输入结果来使用。

即将输出结果重定向给下个命令来处理。

例如 echo "123456" |passwd --stin redhat 就将redhat的密码改为 123456

自定义输出重定向

exec 3> (tmp/ 自定义覆盖(追加)输出重定向。

ls /etc >&3

撤销自定义重定向 exec 3>&-

/dev/null

> /dev/null 重定向到这里就是丢弃没用的输出。

这里就不演示了和以下的for循环一起在脚本里演示。

linux里程序的执行流:顺序执行,选择分支(执行),循环执行。

下面将主要说循环执行。

脚本里面。循环关键字。

for i in list; do

statement1

statement2

done其中list是列表列表又分以下几种:

简单列表 ,1 2 3 4

复杂列表,this is tom`s cat

变量 `seq 1 $lines`

命令 `ls /var`

通配符 for i in /var/*

例题。for i in 1 2 3 4 5 6 7 8 9 10; do

useradd user$i

echo user $i | passwd --stdin user$i

done这个脚本的工作就是创建user1-user10并将其密码分别设置为user1-user10

由于我做过其他类似的脚本并没有删除这些用户所以又做了其他脚本如下显示。

注意不删家目录也是不能创建同名用户的 -r连同用户的家目录一起删除。

好如果注意到的话我上面做的另外一个里面用到了 grep这个命令这就是我接下来学到的一个东西了!下面说下它是什么东东,学它的时候被老师折磨的不轻。

grep家族通过给定的模式找到匹配的行给予显示。

grep [options] "pattern" file...

模式正则表达式(基本正则表达式,扩展正则表达式),元字符

-i 不区分大小写。

-v 跟默认方式相反显示没有匹配的行。

-n 显示匹配到的行在文中的行号。

-an 显示匹配的行及后n行。

-bn 显示匹配的行及前n行。

-cn 显示匹配的行及前后n行。

--color 高亮显示。

元字符 ^ 行首定位符。

$ 行尾定位符。

. 任意单个字符。

* 前一个字符出现0次或者n次。

-e = egrep

这个看起来似乎是不多不过用起来就好玩了!老师出了一堆难题让你来匹配,这要有很强的逻辑能力啊!这个还是多练练吧!

这个及看下上面那个吧 !下面这些元字符的东东组合起来我还没整太明白类!一串一串的写出来后得看半天才知道什么是什么啊!

还有egrep里面的元字符扩展的,由于电脑的问题上课这个是用ppt讲的抓的图没有了下次去上课的时候我再把ppt复制下来再补上吧!

最后在发个作业是关于管道和重定向的。

大家看到后面少了点儿东西后面echo "192.168.0.$i is down"

至于为什么会这样因为我用的是 nano的编辑器有兴趣的同学可以试下按我这么写会出现什么结果挺郁闷的!其实就是后面只有2个字符的位置 ||要在另一行显示的话会出现俩个空格这样脚本就不会执行了!昨天试了好几次才发现。

& 短路操作 command &&command 前面执行成功执行后面的命令前面执行失败则不执行后面的命令。

| 短路操作 command ||command 前面执行失败则执行后面的命令前面执行成功则不执行后面的命令。

在命令中起到判断的作用。

这是这个脚本的部分执行结果我再寝室用虚拟及做的虚拟网卡都禁用了竟然有up出现。

最后再附加个关于for循环和重定向的脚本。

这里面有自定义重定向自定义重定向的好处是减小系统的开支!这里我有个不好的习惯就是没撤销变量,虽然说脚本执行完在脚本里定义的变量会自动释放,但是这是个不好的习惯,一定要改!

这里面有个特殊列表 /var/*

对里这里少总结了一个很重要的东西cut

cut d 指定以什么分隔符将内容分段。

f 取第几段 n,m n-m

还有里面有很多命令的引用最重要的是第2个脚本的第4行和第6行第4行的意思是取/etc/passwd的每行以空格分段的第1段!绕啊!

第6行使最近常碰到的是怎么取一个文件的第几行的具体的做法就是取前几行然后再取最后一行,意思就是说例如取前5行的最后一行不就是第5行了么?!绕吧!然后通过管道将这个命令的结果给后面这个命令同样是将这个行以:

分段取第一段这综合说明了管道 for循环还有 cut 以及变量命令的引用!

grep这个下次再详细总结吧!

不知为何!一向勤奋的马哥今天上午没来!趁这个机会把grep 和 egrep 总结下吧!用下面的几个练习具体说明下吧!

Linux学习课程

linux学习笔记。安装说明。1 先安装虚拟机 vmware 再装linux 南开大学 软件 2 硬件要求 磁盘要求2g以上,内存 256ms 3 red har linux系统硬件支持列表。4 分区命名方案 dev hd sd y n例如 dev hda3是第一个ide硬盘上的第三个主分区或扩展分...

linux学习参考指令

1 找到 temp 下,s 形式的文件。find temp name s 2 找到 temp 下,s 或 s 或 t 形式的文件。find temp name sst 查找某一类型的文件,诸如 b 块设备文件。d 目录。c 字符设备文件。p 管道文件。l 符号链接文件。f 普通文件。2 找到 tem...

ruby学习之路

学习ruby最好的方法就是 源码包,里面带有sample和test,是入门学习的最好实例。我 的是2.1.0版本,首先。configure,然后make,sudo make install。从文件中可看出,包含有两类test test和test all,test主要是对sample 进行测试,tes...