您的位置:首页 > 运维架构 > Shell

shell学习笔记(一)

2016-05-06 09:43 337 查看
【Shell什么?】               
Shell是一个负责把用户语法的语言解释成系统与内核调用的解释程序——命令解释器
                            即使用户交互的界面也是控制系统的脚本语言
 
【Shell分为两大类  】        
Algol 语言风格:     sh,ksh,bash
                            C语言风格:              csh,tcsh
echo $SHELL                 查看shell类型
echo $SHLVL                 查看嵌套层数
 
【每个终端的shell与用户启动的shell】
1、用户登录与shell的关系
              a、服务器启动login
              b、用户输入帐号与口令、
              c、服务器打开/etc/passwd            /etc/shadow
                                                        /etc/group      /projects等文件
              d、检验用户信息,并且打开的信息保存在内存中这些信息用公用的名字:
环境变量LOGNAME  USERHOMESHELLUIDMALL

                            e、切换到主目录${HOME}
                            f、启动shell(loginshell /
登录shell /注册shell)
2、shell的启动方式
                            a、登录方式启动:登录时候默认启动方式是登录shell,
用户也可以使用登录方式启动,bash –login或bash –l
                            b、用户方式启动:bash
启动方式的不同:shell启动的时候还做了如下工作,加载如下几个脚本/etc/profile, ~/.bashrc(~/.bash_profile或者~/.bash_login或者~/.profile)三个文件的其中一个.
登录shell全部加载
非登入shell不全部加载~/.bashrc
 
【第一个shell脚本】
              1、shell编程的方式
                            a、交互式shell编程:       
命令行shell语句
                            b、非交互式shell编程:执行的语句存放到一个文件中——shell脚本:建议扩展名为.sh
2、shell脚本语言(algol语法)
                            字work:                    
字面值(word)、标示字(name)、保留字、使用空格和tab键分割
                            语句statement:     
使用回车键等分割
                            块block:                    
多种(流程控制块、函数块)
              3、使用语句的多种形式
                            ;                      
分隔的语句
                            ||                      
分割语句:一个成功就终止
                            &&                    
分割语句:一个失败终止
                            |                         
分隔语句:管道
                            &                        
必须加载语句
                            <newline>       
必须在语句最后
              4、使用块      a、(语句列表)
          eg:(pwd;date)
                                          b、{语句列表;}  eg:{ pwd;date;}
              5、元字符:容易歧义字符:        |        
;         &           ()         
ceec
             
空格    <>                       |                         
回车
【shell的执行】
              1、在第一行使用#!/bin/bash指定shell程序,#!指定解释当前脚本文件的程序
2、命令行优先制定shell程序,命令行没有,则代码中优先,都没有,采用命令行默认shell程序
3、把脚本.sh设置可执行文件#chmod +x filename.sh
4、多行注释
              :<<BLOCK    ->注释开始      将BLOCK之间的代码重定向到一个不存在的命令中,
                            ……                                             从而间接的实现了多行注释         

              BLOCK                            ->注释结束
 
【变量】
              1、声明与使用
                            变量名=值                  (没有空格)变量没有数据类型
                            ${变量名}                    如果没有歧义情况{}可以省略为: $变量名
             
declare             变量属性        变量名称
等同   typeset            -p                        显示所有变量的值
                            -i                          定义为整数,若求值失败或不是整数设置为0
                            -r                         声明为只读变量,不允许修改或删除
                            -a                        声明为数组
                            -f                         显示所以自定义函数,包括名称和函数
                            -x                        设置成环境变量

eg:  #!/bin/bash
a=20
b=hello
echo ${a}${b}
echo $a$b
declare -i d=20+30
echo $d
declare -i e
e=45+55
echo $

2、变量名的作用范围与导出变量
                            a、作用范围(){}的差异
                                         
()执行另外建立子shell环境来执行(两个不同环境)
                                           {}
在当前shell环境执行,同一环境中
                            b、shell脚本与shell脚本之间
                                          fork调用        
直接调用:建立子进程执行
                                          exec调用       
加载调用:使用shell替代当前代码
                                          source调用   
代码包含:等价于c的#include
                            c、全局永远不要指望访问局部,局部可以访问全局,bash需要做额外处理
                            e、函数内部定义的变量也属于全局变量          
                        f、局部变量定义local                      eg:local v2=200
                                          函数定义了两个相同变量名的全局变量和局部变量,函数内部优先使用局部变量
             
3、特殊的变量
                            PATH:执行程序的搜索路径
                            PS1:1级命令提示符
                            PS2:2级命令提示符
                                         
提示符号支持特殊的转义符号
                            使用man  bash帮助找到PS支持的所有转义符并且在~/.bash_profile设置自己喜欢的提示符
 
              4、命令行变量
                            $0                      命令本身
                            $1…$9                             命令行参数
                            $*  $@           所有命令行参数
                            $#                       命令行参数个数
                            $?                    状态码0-255,用来获取shell命令的执行状态,如果成功执行,返回值0,失败则返回1
                            $$                       当前shell进程ID
 
              5、销毁变量               unset                 eg:unset           v
 
【赋值】
              1、简单赋值                             a=20
 
              2、值的歧义的解决                                          var=123
                            "  "    :保持语法意义                     a="hellowo${var}rld"输出hello wo123rld
'  '       :保持原字符意义                a='hellowo${var}rld'输出hello wo${var}rld
$'  '     :支持转义字符                     a=$'hell\to\two${var}rld'输出hell o wo${var}rld

接下内容在 SHELL 笔记续篇中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: