linux 学习心得笔记<初级>第二篇

本文深入讲解了Linux系统的基础知识,包括流行的UNIX版本、系统架构、命令行操作、文件系统管理、用户与组权限、shell环境配置等内容。
 

目前,最流行的商业版UINX有:
IBM: AIX 只能用在power系列的CPU上
HP:  HP-UX
ORACLE: solaris
现在没有统一概念的unix,原来的unix已经捐献给open


常见的系统架构cpu内部的核心
arch:
 1 inter:
    8086 IA-32,x86(常见)  inter主导32位的 通过ape技术最多支持64个核
 2 amd:                   amd主导64位的
    amd-64,x86_64(常见)
 3 IBM:power  <最高16核> p系列指CPU是Power系列的  但价格很贵
 4 IBM Motorola Apple :Powerpc 广泛用在嵌入式芯片上
 5 SUN:Ultrasparc  被卖给ORACLE
 6 HP卖给Intel的安腾(IA-64)
 7 Motorola m68k
 8 mips
 9 ARM 只设计CPU 不生产,arm的芯片在嵌入式、手机上应用
 
汇编语言的编写是非常接近底层的,芯片级的编程都是汇编语言
<c+库>耦合度高、移植性低。 
所谓移植:就是将其程序包含所要移植到硬件的硬件驱动程序
eg: 在x86上编写的linux内核 是不能运行在power上的,因为这个linux内核驱动不了power的cpu。所以内核要能够驱动所兼容的架构,就必须包含这些架构中硬件的驱动程序。但是针对不同架构的linux内核的不同之处也就仅仅是驱动CPU的程序,对上层的应用的程序都相同。所以在不同架构的平台上装linux要注意版本!

linux 达到全球最强大的计算机 小到手机、机顶盒 支持的架构很多
 
 中间件<集群中用到的>:
  websphere \IBM weblogic \redhat jBoss \BEA--->ORLCAR fusion server\ tuxto
 
  管理员--->工程师------>架构师------>咨询师

 

默认登陆环境:
CLI
GUI

起始目录:家目录
普通用户的起始目录在: /home/username下
root的起始目录在: /root 下

 

早起unix上 mainframe上的 多用户的可以同时登陆
提供了多个终端---->键盘、显示器

linux: 有虚拟终端、模拟终端、串行控制台
 默认虚拟终端有6个 Ctrl + alt + F1~F6  F7是返回图形终端<前提是已经启动了x-server  startx & 来启动>
 who命令可以查看已登陆的终端
 tty1 ---->第1个终端
 tty2 ---->第2个终端
 tty3 ---->第3个终端
 :0------->图形用户界面<默认只有一个  startx -- :1 & 来启动第    二个图形界面 CTRL+ ALT+F8>
 pts/1---->模拟终端<open terminal> ctrl+shift+t      ctrl+pageup/down 可以在模拟终端间切换
    ctrl+shift+c复制  ctrl+shift+v粘贴
    <ctrl>shift+pageup/down 来翻转页面
    alt+f10窗口最大化 /alt+f9窗口最小化

终端上的数据是被临时的被保存在显卡显存的缓冲区中了,重新换一个终端就没有了
 
补齐:
命令补齐:
命令:
 内部命令:
   指shell自身带着一些命令如 bush 中的 cd  type来查询命令是内部的还是外部的。
 外部命令:
   指操作系统上某个路径下有个可执行文件,输入命令时,就是将可执行文件运行了一下。
 所谓命令补齐:
  就是到某个目录下查找有没有一个文件对应你指定字符串开头的,先找内部命令,再找外部命令。
  外部命令的查找要通过<echo $PATH查看>环境变量,从前向后寻找,并将找到的环境变量对应的命令用hash编码的方式记录下来,下次再次执行这个命令时就从hash表中查找<2分法查找>,如果没有的话再从$path中找。
 
路径补齐:
  以你输入命令的前缀来查找补齐。

su <switch user>命令来切换用户 su [-] username
                               exit用来退回原来的用户
    加横线将重新创建一个新的shell ,将读取那个用户所需要的环境变量
    eg 用普通用户登录
       [student@server ~]$ ifconfig
       -bash:ifconfig:command not found
       [student@server ~]$ echo $PATH
       /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
       :/home/student/bin
      所以就没有ifconfig这个命令对应的环境变量
      
     不加横线表示沿用原来的那个shell

sudo 表示你不用在切换用户的情况下以另一个用户的身份来执行某个命令
    eg:  sudo passwd 所要用到的用户身份在一个文件中定义的


id 用来查看用户的身份、信息
   eg: id student
finger 更加详细的查看用户信息
   eg: finger student

passwd   root用户可以更改别的用户的密码,但要加上用户名
   eg: [root@server ~]# passwd user1    user1是一个用户名
         普通用户只能改自己的密码

银行的网络和我们使用的网路不在一起


命令历史:
  1 history 查看之前使用的命令
  2 history n 查看最后所使用过的n条命令
  3 !!  重复刚才执行的命令
  4 ! fin 从后往前第一个以fin开头的命令
  5 ! 26  执行一下命令历史列表中的第26条命令
  6 ! -26 执行一下命令历史列表中的倒数第26条命令
  7 [root@server ~]# ls -l /etc  
    查看/etc目录下的文件,但是如果我想查看/dev目录下的文件  就可以输入
    [root@server ~]# ^/etc^/dev
    就是把上条命令的字符/etc换成/dev
  8 [root@server ~]# ls /etc/sysconfig/network-scripts/
    如果想用ls -l 来查看上面那个长的目录
    [root@server ~]# ls -l !$
    !$ 表示上面一行命令最后的参数
  9 [root@server ~]# ls -l {[Esc]+[.]}----->/etc/sysconfig/network-scripts/
    [Esc]+[.]可以将最后一个参数调出来
  10 [ctrl]+[r] 命令历史搜索
     [root@server ~]# [ctrl]+[r] --->{reverse-i-search}'ls -l /etc': ls -l /etc/sysconfig/network-scripts/
     逆向搜索你所键入的字符所对应的命令行
  11
  12     环境变量:HISTCONTROL     
       [root@server~]# echo $HISTCONTROL

       [root@server~]# export HISTCONTROL----->表示导出环境变量
       [root@server~]# export HISTCONTROL=
                  1 erasedups 从后面忽略重复的命令
                  2 ignorespace 忽略空格开头的命令
                  3 ignoredups 从前面忽略重复的命令
                  4 both------>ignorespace  ignoedups
                
  13 命令历史被保存在内存的缓存区中了,为了下次开机的时候还能够看到 shell将命令历史存在用户的家目录下~/.bash_history文件中 
  14 环境变量:HISTSIZE---->定义了命令历史最多保存多少条,
     eg:[root@server~]# echo $HISTSIZE
         1000
         [root@server~]# HISTSIZE=500
         [root@server~]# echo $HISTSIZE
         500
      只对当前的shell有效,但要一直保持500条就要编辑配置文件
  15 环境变量:HISTFILESIZE 是控制保存命令历史文件的数量
  16 环境变量:HISTFILE 是用来定义存放命令历史是什么的
   环境变量:
  17 history -c 清空命令历史列表
 
命令

  1 [root@server~]# ------>prompt 命令提示符
  
    [root@server~]# commend [option] [arguments]
    option:修改命令的执行方式的
          长选项<--help>、段选项<-h -v -d  -hvd>
    arguments :指定命令的作用对象 eg: ls /etc '/etc'是参数
          命令参数、选项参数< lvextend -l +1G ‘+1G是-l的参数’>
  2 [root@server~]# date----->系统时间
    [root@server~]# echo $LANG
    en_US.UTF-8 ---------------->语言、字符集
    [root@server~]# LANG=zh_CN.UTF-8 date
    [root@server~]# clock---->硬件时间BIOS
    [root@server~]# date mmDDHHMMYY.SS<秒>修改时间
    系统时间的修改不影响硬件时间
    hwclock -w   -------->将硬件时间设置成系统时间
    hwclock -s   -------->将系统时间设置成硬件时间
    [root@server~]#date +"%m-%d-%Y" 修改时间显示方式详细查看<man date>
    12-05-2010
    [root@server~]#timestamp   unix元年--格林尼治时间70/01/01
    [root@server~]# cal 11 2010 显示2010年11月的日历
  3 帮助
    -h  ----->内部命令获得帮助  Eg: cd -h
    --help  -->外部命令获得帮助  eg: ls --help
    man <manual,手册>
        man commend  man打开commend手册时,并且手册是压缩存储的,所以用man首先要解压缩手册,然后调用less命令来查看这个文件。 这些手册在 /usr/share/man中存放,并且分章节。
    less查看---> b向上翻一屏 \[]向下翻一屏\ k向上翻一行\ enter向下翻一行

 

 

man -f  = whatis
    -k  =(equivalent) apropos
whatis数据库是每天要更新的,要使用wahtis数据库要用makewhatis这个命令来建立

info 提供man一样的帮助信息,比man更加详细,支持连接,使用[Table]键来切换连接,一般用以补充man

pdf,html文档使我们经常查看的

 

Lecture 4 filesystrem文件系统


windows中每一个盘符都可以是一个文件系统
c盘是一个分区、是一个独立的文件系统,你的分区是平面的,彼此之间是对等的
linux中所有的文件系统、目录、分区都从/ 开始,而linux中的文件、目录是通过mount<关联>来和磁盘分区建立关系的,本身目录和分区是没有对应关系的
linux中要有/boot<操作系统内核>、/swap<虚拟内存>、/<根分区>   注意这一点和windows是不同的

linux中文件和目录是不能同名的,并且严格区分大小写,任何一个linux版本都要遵循FHS规范的

/ 、/root是不一样的 /表示为根目录 /root表示为管理员家目录,普通用户的家目录在/home中

bin:binary<二进制>表示为可执行文件、普通用户用的。
sbin:super bin 系统管理命令、管理员用的
usr<本地统一资源存放位置 unitary systerm resource>下也有bin\sbin文件
usr/local下也有bin\sbin
在跟目录下的bin\sbin是系统自身启动运行必须要用到的命令、提供基本功能的,而其他的则是第三方软件执行需要用到的可执行文件
media、mount挂载点目录,例如你想用U盘则必须和media/mount目录关联起来才能用
/etc是配置文件所在目录、存储配置信息文件
tmp、/var/tmp是临时文件索在目录 任何人都可以向里面写东西
/boot 引导目录,里面存放的是系统内核vmlinuz-2.6.18-164.e15 是单独分区的,之所以要单独分区是因为/boot是无法放在逻辑设备之上的如:lvm
/dev:设备文件
misc:这是一个杂项
opt:<option>第三方软件默认会装到这里
srv/var:数据文件存放的目录如:日志、邮件队列
 var是单独分区的
 srv<server>服务器在运行中产生的临时文件
proc/sys伪文件系统 ,在系统运行时存在,在系统关闭时文件内不会用任何内容
 /proc是内存中运行的内核信息的映射、我们要与内核打交道,可以通过proc来调动内核执行方式进行调优
 linux 2.6.36 <2:版本号 6:此版本号(基数为开发版,偶数为发行版) 36:发行号>
 /sys 在2.6之后出现的,用以导出系统硬件信息的 2.4之前/dev目录庞大无比,里面包含了各种设备应用时所需要的文件。 2.6之后添加了udev机制让我们在用户空间中为设备的添加的时候创建设备文件,用硬件抽象层来识别设备信息<如这是什么设配、设备的型号>,并把这些设备信息导入到/sys目录中,而udev就可以读取/sys下设备的信息并在/dev下动态创建设备文件,这实现了设备的动态管理
lib:库文件 都是绿色的可执行文件
 usr/lib、usr/local/lib

我们在执行ls命令的时候可以通过echo $PATH来找到对应的执行ls的二进制文件(shell层),但是在调用对应ls内核中的API<库>时需要在/etc/ld.so.conf/*.conf或/etc/ld.so.conf.d/*.conf下寻找ls调用API所对应的文件的位置,所以/etc/ld.so.conf/*.conf或/etc/ld.so.conf.d/*.conf中存放的是类似与 执行echo $PATH命令后 显示的的内容

 


在linux中可执行的二进制文件通常以绿色表示
浅绿色通常是表示为连接文件
蓝色表示为目录
黄色表示设备文件


bin sbin通常是存有二进制文件,sbin通常是放有系统管理命令,超级命令


文件的命名

1 linux中文件目录命名:最长255个字符,严格区分大小写,除了“/”不能用以外,其他字符都能用
 “*”是一个通配符,你要创建一个文件,如歌这个文件有特殊符号如 "*,&,^,%,¥,$,[空格]" 时要加上单或双引号
2 # touch 可以跟新文件的时间戳或创建文件
  touch a 表示创建一个a文件
  touch a* 表示修改任何名字以a为开头文件的时间戳
  touch 'a*' 表示创建a*这个文件
3
 1>命令 cd
 # cd []  回到起始目录
 # cd ~  回到家目录
 # cd ~ student 回到student的家目录
 # cd - 回到上一次所在目录下
 # cd ..回到上一级目录
 # cd . 回到当前目录
 2>命令 pwd<print working directory>
   显示当前所在的目录 <bash shell中有的>
 
4 命令行展开{}
mkdir -pv m/n 在m目录下创建 并且m之前是不存在的 -v显示  创建过程
mkdir -pv m/{n1,n2}
  创建 m/n1,n2/x1;n3/y1,y2;n3/y1/z;n3/y2/z  ?

mkdir -pv m/{n1,n2/x1,n3/{y1,y2}/z}
  创建 x_1 x_2 y_1 y_2  ?
mkdir {x,y}_{1,2}
 
~表示家目录
touch 可以用来创建文件,也可以用来修改文件的时间戳
mkdir -p 用来创建一个不存在目录下的子目录或文件
      -v 用来显示创建过程
         可以用tree命令来观看某目录下其他目录或文件的关系,显示目录的层次结构
rmdir 用来删除空目录
rm    用来删除文件的 
    -r 表示递归 可以删除非空文件和目录
    -f 表示强制
5
 ls命令
_ 表示的是普通文件
d 表示的是目录文件
l 表示的链接文件
c 表示的是字符设备 指线性的、串行的,有次序的,逐个字节传输的 如 键盘
b 表示的是块设备 指按块传输,一次读一整块的、非线性的 如 硬盘
s 套接字文件,用来进程之间通信的,如,在一个计算机上既做服务器又做客户端,这样,他们就有进程之间的通信并且通过inode号来通信,而不是通过网络协议来通信的
p 表示的是管道文件,也是用来进程之间通信的,一个进程的输出作为另一个进程的输入

6
三个时间:
  最近修改时间(modify time 文件内容),最近访问时间(access time),改变时间(change time 文件原属性,原数据)
  修改是改变文件的内容
  改变是改变文件的属性、名、大小、文件权限、文件被连接的数量
stat 命令用来查看这些时间
一个文件都有三个时间戳
只有修改时间、访问时间是可以用touch来修改的
-a 是用来改变最近访问时间,改为当前时间 access time
-m 是用来改变修改时间,改为当前时间 modify time
-t 是以YYMMDDHHmm的形式来变成想要的时间
如 touch -a -t 199010101010,就将最近访问时间变成199010101010
     <注意:任何用touch来修改的modify\access时间,都会引起      change时间的改变,默认改成当前时间,但是用cat来查看一      文件,仅会改变该文件的access访问时间,不会改变文件的      change改变时间>

让文件内容发生改变,用一个文本编辑器如vim、nano<ctrl+>
o保存 ctrl+x退出>,用文本编辑器改内容是正常的引起时间戳改变的,如会引起access modify change 这两个时间的改变

touch a.txt这条命会将access modify change这三个时间都改成当前时间,这是非正常的改变时间戳
用 # touch -a a.txt 这会将文件的 access 和 change时间变成当前时间

例子:有一个web服务器,上有4000个文件,每秒钟每个文件被访问10次,那么一秒钟就要总共被访问40000次,也就要修改40000次access时间,这虽然会让系统更加安全,但会大大增加服务器的负荷。这时我们需要关闭访问文件时修改标签的做法,这主要是为了减轻服务器压力的

7
复制文件cp
#cp [] src dst
  如果 dst是一个存在的目录,则src将被拷贝到dst目录下并且名字相同
  如果 dst是一个文件,则会覆盖目标文件,名字还是dst
  如果目标不存在 如 # cp /etc/issue /root/a.txt 其中a.txt不存在,但是/root存在,则会把issue拷贝到/root下并且重命名为a.txt,如果目标不存在/root也不对,则无法完成拷贝

-p 保留权限、属组、时间戳、连接、
这些属性默认是不会保留的,会变成当前用户的属性
                  例如一个文件/etc/issue的属组、拥有者都是root,现在切换成student用户执行# cp /etc/issue ~
                                                                                         # cd ~
                                                                                         # ll issue 你会发现在家目录下的issue的属组、拥有者都是student
                                                                    如果在后面加上-p则 issue的属组、拥有者还是student ,也就是说普通用户不能把原来的文件属性                                                                    保留成root
                   如果有一个文件/etc/fstab的属组、拥有者都是student,现在切换成root身份执行# cp /etc/fstab . -p
                                                                                            # ll fstab 你会发现fstab的属组、拥有者都是student  如果不加-p 则                                                                    fstab的属组、拥有者都是root                                
并且不同普通用户之间可以保留权限,而普通用户不能保留root用户的权限,root身份是可以保存普通用户的权限
-f 强行覆盖某个文件
-r 如果src是一个目录的话,会将src目录中的所有文件递归的拷贝到dst
-d 若原文件是连接文件的属性,则复制连接文件属性而非文件本身
-a = -pdr
-i 会在你复制时如果原文件和目标文件名字相同提示你是否覆盖

8
alias查看当前系统中的命令别名
如:
# alias
alias cp='cp -i'
alias rm='rm -i'
 这时你在用cp命令的时候就相当于执行了'cp -i'这个命令
如果你不想用'cp -i'这个命令时想用纯的cp,则输入 \cp 这样就不会有-i这个选项 实现绕过别名使用原始意义

9
 mv命令,移动命令,剪切
 mv [] src dst
 使用和cp相同,但是可以在不使用-r的情况下移动文件夹
 如果原文件所在的文件夹和目标文件所在的文件夹是相同的,但名字不一样,这时的mv命令相当于重命名
 如:# mv fastab .fastab 将fastab变成隐藏文件

10
  ls查看命令
 ls -l=ll
 ls -a 可以查看所有的包括隐藏的文件
 ls -d 可以查看文件夹本身的属性
 ls -A
 ls -i 显示inode号    inode表示文件的索引节点号 = index node
在我们的操作系统上每一个文件都有一个唯一的标示号,我们识别文件的时候靠的是文件名,而系统识别的时候靠的是inode号,并且inode和文件名是一对多的关系,就是说多个文件对应一个inode号,这说明这些文件其实是一个文件,只是路径不同 。与文件内容无关的类似文件创建时间、名字啊原始信息都在索引节点中。

11
 rm 来删除文件

注意在我们有的时候无法删除已输入的字符时,可以用ctrl+Backspace来删除已经输入错误的字符

12
 file
来帮我们简单判断文件的不同属性,如ASCII 文件、 纯文本文件、MP3文件

 

lecture 5
系统用户及组的权限概念

 用户:是获得服务、计算系统资源权限的集合<在计算机看来>
 用户组:权限的集合,是一个能装载用户的容器,在这个容器中的用户就会继承这个容器所具有的权限
 用户同静态的文件和动态的进程相关联
 一个用户在访问一个文件的时候,能不能访问是由文件对该用户的权限所决定的,但是根本上来说是这个用户发起了一个进程来访问这个文件
 系统在识别用户的时候通过标识符,同文件一样,即每个用户名对应一个号码<标识符Uid>,因为系统识别数字比识别字符串快很多
 user----->UID-->/etc/passwd 存储 账号对应标识符的信息数据库文件
 group---->GID-->/etc/group 存储 账号对应标识符的信息数据库文件
 用户登陆的时候需要将用户名转换成id号,通过名称解析机制到/etc/passwd中需找对应的id,机制是可以替换的,也可以设置成到别的文件中找
 在/etc/shadow中存储着 user账号属性信息、账号密码
 在/etc/gshadow中存储group组的密码 用户在切换组<切换到自己不属于的组>的时候用到组密码

用户账号:
类别:系统用户、普通用户、管理员
系统用户:1<UID<499
普通用户:500< UID <60000
管理员:root


类别:私有组:一个组中只有一个用户
      公共组:一个组中可以有多个用户
在用户的角度可分为:基本组<主组>和附加组<额外组>,每个用户对外仅显示主组

                    u     g    o
file 有9位权限模型 user group other  r w x
例子:有一个文件a.txt --->  _rw-r----- redhat redhat
当redhat这个用户发起一个进程访问a.txt这个文件的时候,这个进程首先会查看自己的身份标识和a.txt文件的user是否匹配,然后和group看是否匹配 最后和other  这就是所谓的安全上下文

对文件而言
r : cat,less,nl,more,tail
w : nano vim
x : 脚本,可执行
一般来说文件不要有X权限,否则你写的一些脚本能被运行起来,这可能会对系统不好
对目录而言
r : ls查看有什么文件
w : 创建新文件,删除原有的文件,或修改文件内容
x : 进入目录的权限 'cd'  'ls -l'
一般来说目录都要有X权限,否则我们无法进入目录

新建用户
useradd或adduser

useradd [] username
passwd username 默认不准空密码
groupadd [] groupname
gpasswd groupname

文件的权限修改

 1同时修改所有的权限:
rwx--->111---->7
rw---->110---->6
r-x--->101---->5
r----->100
-wx--->011
-w---->010
--x--->001
------>000---->0

 chmod <change mode>
例如:将a.txt的权限改成用户可读可写,组可读可写,其他     用户只读 chmod 664 a.txt
         文件默认的权限为644
         目录的默认权限为755  
     -R可以将目录中的文件改成和目录一样的权限
 2只操作某一类用户的权限
用户:u
组:g
其他:o
所有用户:a
 chmod u=rw- a.txt

 3只操作某一用户的某一位权限
chmod u+r a.txt

chmod --reference=src dst把dst的权限改成和src的一样

 


改变文件的属主、属组

chown/chgrp [] username filename
eg: m 目录中有文件k
chown user1 a.txt
chgrp -R user1 m----->可以将m目录和目录中的k文件的属组都变成user1

其中chown username:groupname filename
    chown username.groupname filename
这两个命令可以同时改属组、属主 支持-R选项

chown --reference =src dst 把dst的属主、属组改成和src的一样


其次文件还有 suid sgid sticky 这三种权限
suid:
例子:有一文件a   _rw-r----- redhat redhat a.sh
在不改变文件属主的情况下,现在user1想既不是以其他用户的身份、也不想以user1自己的身份,冒充redhat的身份来执行a.sh时,就叫做suid<substitute user ID>
sgid:
同理suid
sticky:
只应用于目录上,如果一个目录是任何人都可以写的,那么这里面的别人的文件你也是可以修改或删除的,使用sticky就是为了将文件的写权限只赋给拥有次文件的用户上,这样在这个目录中,用户只能修改自己的文件

 


例子:给_rwxr----- redhat redhat a.sh加上suid\sgid\sticky后变成
        _rwsr-S--T redhat redhat a.sh
注意大小写的意义:如果原来没有x加上权限后要写成大写S
                  如果原来有x加上权限后要写成小写S


_rwxr----- redhat redhat a.sh 这是一个权限为740文件
如果用数字表示suid\sgid\sticky 我们在740前面加一位数字

_---rwxr-----
100---->suid---->4
010---->sgid---->2
001---->sticky-->1
所以如果a.sh有suid和sticky那么这个文件的权限数字为5740

 

 

 


lecture 6 using the bash shell

write simple shell  scrips  set and reference shell variables

1 命令的编辑功能:(emask风格、非vim)linux中有emask    vim两大编辑器 如果想用vi风格用"set -o vi"来切换
  ctrl+a 可以将光标移动到行首部
  ctrl+e 将光标移到行的末尾
  ctrl+左右键 可以一次移动一个单词
  ctrl+k 可以删除光标所在位置之后的所有东西
  ctrl+u 可以删除光标所在位置之前的所有东西
  ctrl+l 是用来清屏的等同于clear
2 文件名通配<glob>
  1 *  匹配任意长度的字符 <0到任意个>
  2 ? 匹配任意单个字符 <只有一个>
  3 [] 匹配指定一个范围内单个字符[0-9] [0123456789]
    [:lower:]小写字母 表示一个范围=a-z
    [:upper:]大写字母
    [:digit:]0~9数字
    [:alpha:]字符表,含有大小写字母表
    [:alnum:]=[:alpha:]+[:digit:]
    [:punct:]所有的标点符号
    [:space:]空格、table键
  用的时候 例 [[:alpha:]]b.mp3 = [a-zA-Z]b.mp3

file用来查看文件内容和类型的命令


3 命令行展开(替换)
 1  ~  :当前用户的家目录 如:ls ~redhat 表示展开 redhat的家目录
 2  {} :mkdir {a,b}_{c,d}

4
 1 shell  bsh <1979 sh 标准>
          csh <c语言风格 BSD伯克利的分支>---> tcsh
          ksh <吸收了c b的风格 现在已经商业化>
          bash <k b的风格,兼容bsh,linux上默认shell>
          zsh <功能强大,刚出来的>
 2 cat -n 显示行号
   cat 默认是从键盘读取、输入并把结果 输出到标准输出
   cat /etc/shells 用来显示当前linux中支持的shell
   bash和sh是相同的
   nologin这个shell是用来指定用户不能来登录的
   tcsh\csh\ksh\
   zsh(功能强大)

 3 主要学好bash,这样能操控好很多linux
   切换shell时 直接打出shell的名字 例:     [root@station55~]# ksh 这样就可以切换成ksh,在退出换成bash时最好输入exit,来换成bash,而不要写bash.这样减少进程的调用和数量。因为再打开ksh时,是基bash进程打开了一个ksh子进程,如果通过输入bash来回到bash,就有相当于在ksh上又打开了另一个bash子进程,这样前面的bash和ksh还是存在的

4  shell 是一种应用程序,提供用户作为系统接口

 1> 通过命令,可以将命令写在文本文件中,然后运行文本文件,要运行文本文件则需要解释的方式来运行
  软件编程:
    1 编译类的,将源代码-->目标代码 需要编译器,这是静态语言 例如C、C++ JAVA,二进制代码,运行速度快,写驱动程序、操作系统、shell<开发shell要用c或c++语言,要编译,但shell是主要用于写脚本语言的>
    2 脚本类的,源代码不需要编译直接运行, 但是需要解释器(shell),每读一段,执行一段,不需要编译,但是要解释,慢,主要用于应用层、php、系统自动化脚本 (perl脚本面向过程语言、python、ruby、shell)
    3 变量是匿名或命名的内存空间
    编译类型是要严格的区分变量类型,这决定了数据怎么存储和长度
    脚本类(shell)不会严格区分变量类型,单字符类型的区分由编程人员来做,声明一个变量可以附任何值
    bash 中,有局部变量、环境变量(静态变量、全局)、位置参数变量(引用一个脚本的参数而是用的)、特殊变量($ ?引用脚本中、系统中某些状态的值),
    1 声明变量 ,变量名字由数字、字母、下划线,并且只能以字母开头,严格区分大小写 撤销用unset
    2 引用 " "(弱引用,有变量替换发生)\ ' '(强引用、没有变量替换)\ ` `或$() (命令引用)
    echo 和 printf 用于显示、引用变量的值、或现实一段字符串
    echo "$NAME"
    printf "%s" $NAME
 
  1>本地变量 私有的 声明用set,默认都是本地变量
  1)变量引用
  echo 显示变量的值 如:[root@station55~]# NAME=jerry
                        [root@station55~]# echo "$NAME"
                        jerry
                        [root@station55~]#
       显示字符串   如:[root@station55~]# echo "this is a test"
                        this is a test
                        [root@station55~]#
  etho 会默认带有换行符
  printf 则不会默认换行 eg:  [root@station55~]# printf "%s",$NAME
                             ,jerry[root@station55~]#
                             [root@station55~]# printf "%s" $NAME
                             jerry[root@station55~]#
                             [root@station55~]# printf "%s\n" $NAME
                             jerry
                             [root@station55~]# echo "$NAME\n"
                             jerry\n
                             [root@station55~]# echo -e "$NAME\n"   这样进行了两次的回车换行
                             jerry

                             [root@station55~]# echo '$NAME'    强引用
                             $NAME
                             [root@station55~]# ANIMAL=pig
                             [root@station55~]# echo $ANIMALS

                             [root@station55~]# echo  ${ANIMAL}S   这是规范的写法
                             pigs
  2)命令引用
    是来引用命令的执行结果的,可以将命令的执行结果赋给某个变量
    [root@station55~]# ls /root
    Desktop install.log install.log.syslog
    [root@station55~]# FILE=`ls /root`或FILE=$(ls /root)
    [root@station55~]# echo $FILE
    Desktop install.log install.log.syslog
    [root@station55~]# cp /etc/fstab /root/fstab-`date + "%H-%M-%S"`       可以用来备份文件 方便区别备份日期
    [root@station55~]# ls
    Desktop install.log install.log.syslog fstab-15-31-08
    [root@station55~]# date
    Thu Dec  9 15:31:15 CST 2010
    [root@station55~]#
  2>
   环境变量(全局变量)共有的  用export声明
   局部变量只是对当前的shell有效,而环境变量对当前的shell<或进程>和由其打开的子shell<或子进程>都有效
   在声明的变量的前面声明为export 导出这个变量
   用set来声明的变量都是本地的变量,不带任何东西的set,直接回车,会显示出所有的变量<包括本地的和环境的>,如过直接export回车,只显示环境变量,撤销变量用unset。env也是可以显示系统中的本地的环境变量的,但是env主要适用于 将命令运行在一个自己设定的环境变量中来运行 例子:
  # env PATH=/bin ls
  这时,ls 命令就是在/bin下的ls

  HISTSIZE,HISTFILE,HISTFILESIZE,HISTCONTROL
  这些环境变量都是系统自己运行时自己产生的
此外还有:
  PS1: [root@server~]#   export PS1='\u-\t \!\$' 具体如何修改,man bash 使用
  PS2: 续行符,一个命令一行写不下的时候可以在下一行写,只要以续行,就会有一个提示符
  PS3:
  PS4:调试跟踪shell脚本时用到的

  PATH 定义执行文件路径的变量
  HOME 定义家目录的
  DISPLAY 定义显示输出位置的,显示位置的
  HOSTNAME 定义主机名称
  LANG 定义默认的语言
  LOGNAME
  LS_COLOES
  OLDPWD ----->时刻在变话的,对应命令 cd -
  PWD  ------->时刻在变化的,对应命令 pwd


  所有这些环境变量都会在更换shell或重启计算机时时,不复存在,必须保存在个人的环境变量配置文件中才行


 
  3>
  静态变量 ,是不可以修改、删除的  用readonly 来声明
  如果不想让别人撤销你的变量,要将变量编程只读的 ,这时变量就是静态的变量
  #name=wendy
  #readonly name
  #echo ${name}
  wendy
  #unset name
  -bash:unset:name:cannot unset:readonly variable
  4>
  特殊变量  $?
  # echo $?------>用以表示上一次执行命令返回状态,用以定义是否执行成功
  0 表示成功
  1~255表示执行失败
  $$------>用以表示进程号
 
  5>
  位置参数变量:我们在执行脚本时候,如果这个脚本可以接受参数,通过命令行传递几个参数给脚本,并且还能够在脚本中引用这些参数,这就是位置参数变量。
  如:
  1> ./mycp.sh /etc /root /var
    $0         $1   $2   $3 ……${10} ${11}
    mycp.sh 的脚本程序如下
  
    #!/bin/bash
    FILE=`basename $1`
    cp -r $1 /root/$FILE-`date +"%F"` ---> $1 就是传递过来的参数 就是如上的/etc
  2> 
     整数的运算
   # A=1+1
   # echo $A
   1+1
   # A=$((1+1)) ---->表示加法 $((4/2))表示除法
   # echo $A
   2
   #
     将BC<计算器>用到脚本中,这里用到管道
     管道:能够连接两个命令,并且将前一个命令的结果作为后一个命令的输入
   #!/bin/bash
   sum=`echo "scale=3;$1/$2" | bc`
   echo $sum
     
   echo 的作用就是将原来的信息原封不动的现实出来    

   6
     环境
   用户刚刚登陆linux操作系统的时候,他会继承一些默认的设置<系统级别的设置>,为了让每个人都不一样,还会读取一些专门为个人保存的设置

   我们所有用户公共系统的设置在/etc/profile,/etc/profile.d/*,/etc/bashrc
   每个人不同的设置在如下文件中保存
 ~/.bash_profile,~/.bashrc,~/.bash_history,
~/.bash_logout
   会永久有效的命令、别名、变量等都是保存在一上这些文件中的,例如我们个人设定的别名就保存在~/.bashrc中,如果你保存在了/etc/bashrc中,则所有的用户都能用这个别名
  
   ~/.bash_profile /etc/profile 为登录用户shell准备的
   而以bashrc结尾的文件是为非登陆用户准备的
   非登录用户:你写的脚本,这个脚本安排成自动运行计划,是指在某时某刻不用输入用户密码,就能在主机上运行的一些程序。 
  
   这类文件又分为两类:
    交互式登陆shell            /etc/profile,/etc/profile.d ~/.bash_profile,    用于定义交互式用户的登陆  主要存储环境变量
    非交互式:
    /etc/bashrc  ~/.bashrc ,以bashrc为结尾的文件用于定义为非交互式用户登陆  主要存储别名alias
   

     交互式shell登陆读取文件的顺序:
    /etc/profile--->/etc/profile.d/*-----> ~/.bash_profile---->~/.bashrc--->/etc/bashrc
     这个次序很关键,因为后面读取的会覆盖前面读取的内容

     非交互式shell的读取顺序<没有用户的登陆>:
 ~/.bashrc--->/etc/bashrc--->/etc/profile.d/*
     


    例子:在用户登陆的时候马上让其执行一个脚本让其进行一些初始化的工作,发送一些欢迎信息
    在user1用户的家目录下编写一个脚本为welcome.sh<这是一个欢迎信息>,并将家目录下的一个隐藏文件.bash_profile中将welcome.sh的路径添加进去。
    例子:把用户的一些临时文件做一下清理
    在~/.bash_logout中配置,还可以在用户退出之前来行做的收尾工作的脚本程序都可以放在这个文件冲
    例子:我们在~/.bashrc中定义一个别名alias,但是这个别名并不会立刻生效,因为我们所有可用的别名都是要在系统读取过~/.bashrc这个文件之后才可用,所以有三种方法:
    1>退出该用再次的重新登陆进来
    2>用alias命令再重新声明一遍<这仅对当前的shell、进程有用>
    3>使用命令 source .bashrc  或<. .bashrc>这个命令的意思就是再读一遍.bashrc,这个很重要,将来在shell脚本中去载入其他的文件里面声明的函数的时候,通过这种方式将其他文件source进来
  

 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值