zoukankan      html  css  js  c++  java
  • shell_basic

    1、回顾基础命令
    2、脚本
    3、变量
    4、别名
    5、条件判断
    6、test判断
     
    一、回顾基础命令
    shutdown --关机/重启
    exit --退出当前shell
    rmdir --删除空目录
    du --查看目录占用的存储空间
    df --查看已 经挂载的文件系统的空间使用情况
    ln --创建链接
    cat --显示文件的所有内容
    head --显示文件的头部
    tail --显示文件的尾部
    less --分屏/分页 显示文件内容
    dirname --取出目录
    basename --取出文件名
    history --历史命令
    1、ln
    # ln -s [目标] [源 -- 创建软链接 (symbolic link)
    # ln [目标] [源] -- 创建硬链接
    2、cat
    concatinate,把文件的内容按顺序连接起来,输出到标準输出。目前,只需要简单理解成显示文件的内容即可
    # cat f1 -- 显示文件 f1 的内容到屏幕上
    # cat -n f1 -- 显示文件的内容,并且加上行号
    # cat -A f1 -- 打印出一些不可见的字符和位置标记
    3、head
    读取文件的头部
    # head -n 3 /etc/passwd --读取文件前面三行
    # head -n -3 /etc/passwd --读取文件时,丢掉文件的后三行;
    # head -c 3 /etc/passwd --读取文件的前面三个字节
    # head -c 10m /dev/zero > f1 --创建一个10M的文件
    4、tail
    读取文件的尾部
    # tail -n 3 /etc/passwd -- 读取文件的后面三行
    # tail -c 3 /etc/passwd -- 读取文件的后面三个字节
    # tail -n +28 /etc/passwd -- 读取文件中从第28行开始直到结尾的所有行
    # tail -f /etc/passwd -- 跟踪文件尾部内容的变化,常用观察日志文件的变化
    5、history
    # set -o history --启用命令历史功能 ,默认记录在文件 ~/.bash_history 中
    # set +o history --关闭命令历史功能
    # history --显示最近n条历史命令
    注:以下三个变量用于控制命令历史的数量,以及是否记录时间戳
    # vim /etc/bashrc --一般配置在该文件当中,用户级可配置在 ~/.bashrc
    HISTSIZE=1000000 --最多存储多少条记录
    HISTFILESIZE=2000000 --命令历史文件的最大尺寸
    HISTTIMEFORMAT='[%Y-%m-%d %H:%M:%S] ' --命令历史的时间戳格式
    export HISTSIZE HISTFILESIZE HISTTIMEFORMAT --把他们定义成环境变量
     
    二、脚本
    1、如何执行脚本
       # vim test.sh
        #!/bin/bash
      echo 'hello world'
    # bash test.sh
    # bash -x test.sh --显示脚本执行过程的信息
    # sh test.sh
    # source test.sh
    # . test.sh
    --上述兼为非标准执行脚本,脚本文件可以没有可执行权限;下列为标准执行:
    # head -n 1 test.sh
    #!/bin/bash
    # chmod a+x test.sh
    # ./test.sh
    可直接将脚本放到 PATH 路径下,直接当命令运行
    注意:shell 必须以 #! 开头,读作sha-bang,这两个字符用来标识文件类型,#! 用来告诉系统,这个文件里的内容将要用指定的解释器来解释,#! 之后的字符串将会被解释成一个程序,该程序用来解释当前文件。如果没有提供sha-bang这一行,当前 shell 将会自主猜测一个,但结果并不保证和预期一致;所以最好明确指定。./test.sh 的运行流程:
    1、内核读取该脚本,检查文件类型标记,获取解释气得路径;
    2、内核运行解释器;
    3、解释器运行起来后,就打开脚本文件,解释其执行
    linux 自带的诸多解释器:#!/bin/bash;#!/bin/sh;#!/usr/bin/perl;#!/bin/sed;#!/bin/awk
    2、四则运算符
    + - * /
    $(()) $[] expr let
    # echo $((38%5)) --取余
    # echo $[38/5] --求商
    # echo $((10**2)) --10的平方
    2.1、expr
    # expr 14 % 9 --取余
    # expr 34 / 9 --求商
    # expr 30 * 3 --使用乘号时,必须用反斜线屏蔽其特定含义
    # expr index "sarasara" a --抓取第一个字符数字串出现的位置
    # expr substr "this is a test" 3 5 --抓取字串
    # expr length "this is a test" --计算字串长度
    2.2、let
    let计算工具用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来
    # no=20
    # let no++ --自增
    # let no-- --自减
    # let no+=10 --自增10
    # let no=no+10 --同上
    # let no-=15 --自减15
    # let a=5+4 --变了a无须加 $ 符号
    # echo $a
    3、shell配置文件
    /etc/profile --全局配置文件,
    /etc/bashrc --全局配置文件,一般用来定义环境变了
    ~/.bash_profile --用户配置文件
    ~/.bashrc --用户配置文件
    ~/.bash_logout --用户配置文件,login shell 退出时会读取该文件
    4、shell种类
    根据shell 的启动方式不同,可以大致地把shell分为以下几种:
    login shell --在文本界面登录,如su -;读取shell配置文件顺序如下:
    /etc/profile——~/.bash_profile——~/.bashrc——/etc/bashrc
    interactive shell --gnome-terminal 中默认的shell;读取shell配置文件顺序如下:
    ~/.bashrc —— /etc/bashrc
    non-interactive shell --用来运行脚本的shell
     
    4.1、在~/.bashrc 中设置一个变量 v,要求该变量只出现在交互shell中
    # vim ~/.bash_profile --标识shell 是否登录shell
    LOGINSHELL=1
    # vim ~/.bashrc --不是登录shell 时,才设置变量
    if [ "$LOGINSHELL" != 1 ];then
    v="interactive shell only"
    fi
    5、命令优先级
    别名 > 函数 > 内部命令 > 外部命令
    6、shell特殊字符
    对于shell来说,有些字符除了它本身的意义之外,还有特殊的意义,如果要在字符串中包含特殊字符,就必须通过引用(quoting)的方法来去除特殊字符的特殊意义。以下列出的是部分特殊字符:
    ~ --不被引用的话将会被shell 替换成家目录
    & --把程序放到后台执行
    $ --dollar 符,可用于参数展开
    ${} --变量处理,可对变量的内容做替换,删除,抽取等操作
    * --星号,通配符,匹配所有字符
    ? --问号,通配符,匹配任意一个字符
    () --命令组
    {} --命令组
    "" --双引号,引用符号;可以去除大多数特殊字符的特殊意义,除 $;`;!;
    '' --单引号,引用符号;可以去除所有特殊字符的特殊意义,除自己本身
    . --相当于source命令;可用于设置隐藏文件;用于目录名时,代表当前目录
    / --斜杠,路径分隔符,根目录
    --反斜杠,可用来去除单个字符的特殊意义,也就是所谓的“转义“,也可用于表示特殊字符,如换行符 ( )
    `` --反撇号,命令优先执行,和$()含义是一样的;如果有嵌套那么不能用``号
    $(())和 $[] --运算符
    : --空命令
    ; --命令分割;不去考虑上一条命令所执行的结果
    ;; --case 选项的结束符
    # --注释
    && --逻辑与;可对命令进行分割;但是需要考虑上一条命令所执行的结果
    || --逻辑或;可对命令进行分割;不需要考虑上一条命令执行结果
    ----------------------------------------------------------------
    # echo 'hello world;' "hello world;" hello world; --用三种引用符合去除空格的特殊意义
     
    三、变量
    1、本地变量
    当前用户自定义的变量;当前进程有效,其他进程或者当前进程的子进程无效
    # a=123
    # echo $a
    # unset a --取消变了定义
    2、环境变量
    当前进程有效,并且能被子进程调用;
    # env --查看当前系统所有环境变量
    # set --查看当前系统所有环境变量和临时变量
    # echo $PATH -- 显示PATH变量的内容
    # export hi=hello --定义环境变量;工作当中一般喜欢把即用的环境变了写在 ~/.bash_profile
    几个常见环境变量:
    PATH --影响命令的搜索
    PS1 --命令提示符
    TMOUT --超时时间,单位为S,时间一到,自动退出 interactive shell ;所以最好将其设为只读变量 # declare -r TMOUT=60
    HISTSIZE, HISTFILESIZE, HISTTIMEFORMAT --命令历史
     
    3、系统变量
    又叫bash中内置的变量;shell本身已经固定好的一些变量
    $# --脚本后面接参数个数
    $* --脚本后面所有的参数(被双引号包含则被当成一个字符串输出)
    $@ --脚本后面所有的参数(被双引号包含还是保留各参数的边界)
    $? --上一条命令执行后返回的状态
    $$ --当前进程的进程号
    $! --后台运行的最后一个进程号
    !$ --最后一条命令或参数
    !! --最后一条命令的历史记录
    $0 --当前程序的程序名或进程
    $1~$n --位置参数变量
    #!/bin/bash
    echo "$0 = $0"
    echo "$# = $#"
    echo "$* = $*"
    echo "$1 = $2"
    echo "$7 = $7"
    echo "$11 = ${11}"
    # chmod a+x test.sh
    # ./test.sh a b c
    4、变量定义
    a、默认下,变量类型没啥要求。可以给变量赋任何值,但是等号两边不能有任何的空格
    b、变量名区分大小写
    c、变量名不能以数字或者特殊符号开头
    d、将命令所执行的结果保存到变量
    5、调用变量
    # a=$(hostname)
    # A=123456789
    # echo $A
    # echo ${A:2:3}
    6、数组
    数组的定义:用小括号扩起来定义数组,括号里的元素用空格隔开
    # array[0]=var1
    # array[1]=var2
    # array[2]=var3
    # array=(var1 var2 var3) --等同于上述三行,定义数组
    # echo ${array[0]} --取数组第一个值
    # echo ${array[*]} --取数组所有值
    # echo ${array[@]} --同上
    7、declare 定义有类型的变量
    -i --将变量看成整数
    -r --定义只读变量
    -x --将变量导出到环境变量
    -a --将变量看成数组
    8、read 交互式定义变量
    -p --提示信息
    -n --字符数
    -t --超时
    -s --不显示
     
    四、別名
    命令的別名,顾名思义,就是可以通过別的名字来执行命令。通常用于简化命令的输入,或者为命令增加一些参数,或者是单纯地为命令添加多个访问名称。
    # alias cp mv rm --查看cp, mv, rm这三个命令是不是別名
    # unalias rm -- 删除别名 rm
    # alias cdyum='cd /data/yum' -- 简化输入
    # alias rm='rm -i' -- 为命令增加参数
    -- 通常別名是在配置文件~/.bashrc 中设置的
    1、验证别名、函数、内部命令、外部命令的优先级别
    # alias pwd='echo it is an alias' --创建一个 pwd 别名
    # function pwd() { echo "this is a function"; } --创建一个 pwd 函数
    # pwd --运行pwd,发现输出是别名
    # unalias pwd --删除别名,再运行 pwd,发现输出是函数内容
    # unset pwd --删除函数,再运行 pwd,才是输出当前所在路径
    所以:别名 > 函数 > 内部命令 > 外部命令
     
    五、条件判断
    # vim test
    ----------------------
    if [ 条件 ];then
    command...
    fi
    ----------------------
    if [ 条件 ];then
    command...
    else
    command...
    fi
    ----------------------
    if [ 条件1 ];then
    command1...
    elif [ 条件2 ];then
    command2...
    else
    command3...
    fi
    ----------------------
    if [ 条件1 ];then
    command1...
    if [ 条件2 ];then
    command2...
    fi
    else
    if [ 条件3 ];then
    command3...
    elif [ 条件4 ];then
    command4...
    else
    command5...
    fi
    fi
     
    六、test判断
    test == [ judge ]
    1、文件存在与否的判断
    # vim test.sh
    #!/bin/bash
    if test -e $1;then --是否存在;还有 -p;-c;-b;-L
    if [ -f $1 ];then --使用 [ judge ] 替换
    if test -f $1;then --是否存在并且为普通文件
    if test -d $1;then --是否存在并且为目录
    if test -S $1;then --是否存在并且套接字文件
    echo 'YES'
    fi
    # chmod a+x test.sh
    # ./test.sh [path]
    2、文件权限相关判断
    -r;-w;-x --是否有读,写,执行权限
    -u --是否有suid
    -g --是否有sgid
    -k --是否有t位
    -s --是否为空白文件,-s表示非空;! -s 空文件
    3、字符串判断
    = --等于则为真,等于号两边必须有空格;也可以是:==
    != --不相等则为真
    -z 字符串 --字符串的长度为零则为真
    -n 字符串 --字符串的长度不为零则为真
    if test $num1 = $num2;then
    if [ $num1 = $num2 ];then
    if [ -n $num1 ];then
    4、数值判断
    -eq --等于则为真
    -ne --不等于则为真
    -gt --大于则为真
    -ge --大于等于则为真
    -lt --小于则为真
    -le --小于等于则为真
    if test $[num1] -eq $[num2];then
    if [ $[num1] -eq $[num2] ];then
    5、逻辑判断
    -a 和 && --逻辑与
    -o 和 || --逻辑或
    ! --非
    优先级:与>或>非
    if test -e $1 -o -e $2;then --判断是否有一个文件存在
    if [ -e $1 -o -e $2 ];then --同上
    if test ! -e $1 -o ! -e $2;then --判断两个文件没有同时存在
    if [ ! -e $1 -o ! -e $2 ];then --同上
     
  • 相关阅读:
    错误C2665: “AfxMessageBox”: 2 个重载中没有一个可以转换所有参数类型
    为什么DW的可视化下看到的效果与浏览器的效果有所区别?
    font-family:黑体;导致css定义全部不起作用
    web标准中定义id与class有什么区别吗
    网页尺寸规范
    SEO为什么要求网页设计师用DIV+CSS布局网页?
    去掉CSS赘余代码,CSS可以更简洁
    解决IE6、IE7、Firefox兼容最简单的CSS Hack
    实战中总结出来的CSS常见问题及解决办法
    高效整洁CSS代码原则 (下)
  • 原文地址:https://www.cnblogs.com/george-guo/p/7081083.html
Copyright © 2011-2022 走看看