zoukankan      html  css  js  c++  java
  • BASH知识点记录

    bash配置文件

    profile类

    为交互式shell提供配置文件

    ~/.bash_profile 个人配置

    /etc/profile,/etc/profile.d/*.sh 全局配置

    功用:定义环境变量;运行命令和脚本。

    bashrc类

    为非交互式用户提供配置文件

    ~/.bashrc 个人配置

    /etc/bashrc 全局配置

    功用:定义本地变量,别名。

    登录式shell读取配置文件顺序

    /etc/profile ---> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

    非登录式shell读取顺序

    ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

    让定义的配置文件立即生效

    #source /etc/profile

    #. /etc/bashrc

    bash的工作特点

    命令执行状态返回值

    每个命令执行结束后,会有“执行状态返回值”,有效范围:0-255

    0:表示执行成功

    1-255:表示执行失败

    使用$? 可查看状态返回值

    命令

    格式:

    COMMAND OPTIONS ARGUMENTS # 命令 选项 参数

    使用type查看命令类型

    内部命令:shell程序自带的命令,由shell内建提供

    外部命令:独立的可执行程序文件,名字即为程序名

    执行外部命令时查找方式

    echo $PATH

    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    选项

    短格式选项-char

    -l, -d, -h,

    -ldh

    长格式选项

    --word, --long, --directory, ...

    参数

    命令的作用对象

    快捷键

    Ctrl+a:光标跳至命令行首

    Ctrl+e:光标跳至命令行尾

    Ctrl+u:删除光标之前的所有内容

    Ctrl+k:删除光标之后的所有内容

    bash功能

    文件名通配:globbing

    特殊字符,元字符

    不表示字符的表面意义,而是被匹配符合指定特征的字符串

    *:匹配任意长度的字符,包括空

    ?:匹配任意单个字符,不包括空

    []:匹配指定范围[]内的任意单个字符

    [^]取反,匹配指定范围[]之外的任意单个字符

    字符集合

    [:space:]表示所有空白字符

    [[:space:]]表示匹配其中任意一个

    [:punct:]所有的标点符号

    [:lower:]所有小写字母a-z

    [:upper:]所有大写字母A-Z

    [:digit:]所有的数字 1-9

    [:alnum:]所有的数字和字母字符

    [:alpha:]所有的字母

    命令补全,路径补全

    history

    history

    -c清空历史记录

    -w保存缓存中的历史命令到历史文件中

    -a追加保存

    -d n删除第n条历史记录

    export HISTCONTROL=ignorespace\执行history命令时,不显示空格开头的命令

    export HISTCONTROL=ignoredups\忽略重复的命令

    export HISTCONTROL=ignoreboth\空格开头的重复的命令全不显示

    位置:通常在用户家目录下.bash_history

    !#:执行第几条历史命令

    !!:执行上一条命令

    !..:执行上一个..开头的命令

    !$:调用上一条命令的最后一个参数

    按ESC松开再按.号,即会重新调用上一个命令的参数

    管道和重定向

    输出重定向:

    COMMAND > POSITION 覆盖输出

    COMMAND > POSITION 在原有内容的后面追加输出

    错误重定向:

    COMMAND 2> POSITION 只有错误信息才会被重定向

    COMMAND 2>> POSITION

    合并重定向:

    COMMAND &> POSITION 无论正确与否全部重定向

    COMMAND > POSITION 2> POSITION

    输入重定向:

    COMMAND < POSITION 覆盖输入,是指把POSITION的内容定向给COMMAND,并显示COMMAND的执行结果

    COMMAND << POSITION 追加输入,此处文档

    常搭配EOF使用:

    #cat > /tmp/123.txt << EOF

    >Hello,world.

    >How are you?

    >EOF

    img

    单双引号区别

    “”:双引号,弱引用,里面的变量会被替换

    ‘’:单引号,强引用,里面的所有字符都是字面量,直接输出

    如果一个字串没有变量,单双引号没有区别

    如果有变量,想要获取变量的结果,需要双引号,如果想要变量本身,那么使用单引号

    如果是命令,需要使用反引号,才能得到该命令执行的结果

    bash变量

    内存空间地址+数据,数据是放在内存中,即也叫有名称的内存地址

    变量的赋值:向变量的存储空间中存储数据

    定义一个变量后,也就确定了:

    1,存储机制,如存储的是字符型还是数值型等;

    2,存储空间

    3,参与的运算方式,如数值型的加减乘除等;

    bash对变量的机制:

    1,所有都看作字符型

    2,不支持浮点数据,需借用外部机制

    3,变量无需事先声明,相当于,赋值和声明同时实现

    命名规范:

    1,不能以数字开头,只能使用字母,数字和下划线

    2,变量名要做到见名知义,如userName=admin风格

    3,不能使用程序中的关键字(保留字),如if,else,where,for等

    查看变量:

    查看当前shell进程中所有的本地变量

    set

    查看当前shell进程中的所有环境变量

    export

    printenv

    env

    取消赋值:unset VAR_NAME(注意,这里不需要加$)

    本地变量:作用范围仅当前shell,对其他shell和当前shell的子进程都无效,重启后失效;

    赋值:var_name=VALUE

    环境变量:只作用于当前shell进程及其子进程

    用户可自定义环境变量:

    bash有许多内置的环境变量,赋值时注意不要重名

    export VAR_NAME=VALUE # 定义一个环境变量

    export VAR_NAME # 导出一个变量为环境变量

    readonly VAR_NAME # 锁定变量为只读变量,在当前shell进程结束前无法更改

    var_name=value --> export var_name

    declare -x var_name=VALUE # -x 表示定义为一个环境变量

    如:declare -i var_name=VALUE # 将var_name定义为整形

    局部变量:作用范围为shell脚本中的某片代码片,通常用于函数本地

    local VAR_NAME=VALUE

    位置变量

    使用$1, $2, ..., $9, ${10}, ...

    $0表示脚本文件路径本身;取文件名:basename $0

    shift:把引用过的参数'踢'掉,在脚本中永远只使用$1引用下一个

    例如:shift 2 :踢2个,这样就可以在脚本中永远以$1和$2来引用后面的参数

    特殊变量:shell内置,有特殊功用

    $? 上个命令的状态返回值

    $# 传递给脚本参数的个数,就是一共有多少个位置变量

    \(* 或\)@ 引用传递给脚本的所有参数

    变量引用:

    1,${var_name}

    2,$var_name

    3,date 反引号``,有同样效果

    一般\(var与\){var}并没有啥不一样

    但是用${}会比较精确的界定变量名称的范围,比如:

    $A=B

    $echo $AB

    原意是想将$A的值替换出来,然后在后面加B,但在命令行上,结果却是只会替换变量为AB的值出来

    正确的应该是${A}B

    变量撤销

    unset var_name

    bash弱类型:

    变量=值 (无需事先声明,可直接使用,默认值为字符型)

    变量的值的类型:

    数值型:

    精确数值:整数

    近似数值:浮点型,浮点型又分单精度和双精度浮点型

    字符型:char,string

    布尔型:true,false

    增强型赋值:

    a=\([\)a+100],一般写成 let a+=100

    表示变量a在自己的值上加上一个100,得到的结果在赋值给本身

    +=, -=, *=, /=, %=, **= 都需要使用let命令进行描述

    变量自加:var=\([\)var+1] == let var+=1 == let var++

    表示一个变量每次只加1或减1,赋值给自己本身,可写成此形式

    export PATH=$PATH:

    unset PATH //撤销变量

    算术运算:bash会对数字执行隐式的类型转换

    let VAR_NAME=Integer_Value(语句)

    declare -i Var_Name=Integer_Value

    VAR_NAME=$Integer_Value(表达式)

    操作符:+, -, *, /, %(取模), **(次方)

    双目运算符:需要至少两个操作数

    bash的算术运算的方式:

    let Var_Name=EXPRESSION(表达式)

    $[EXPRESSION]

    $((EXPRESSION))

    命令:expr ARG1 OP ARG2

    举例:

    #let sum=\(num1+\)num2

    #echo $sum

    #echo $[ $num1 + $num2 ]

    #echo \(((\)num1 + $num2))

    expr $num1 + $num2

    语句不能单独执行,需要let等命令来执行

    表达式可以单独执行

    img

    给变量以默认值

    varName=${varName-:value}

    若varName不为空,则其值不变;否则,会使用value作为其值

    逻辑运算

    布尔运算:真1和假0

    与运算:

    1 && 1 = 1

    1 && 0 = 0

    0 && 1 = 0

    0 && 0 = 0

    只有两个都为真,结果才为真,否则为假。遵守短路法则

    或运算:

    1 || 0 = 1

    1 || 1 = 1

    0 || 1 = 1

    0 || 0 = 0

    只要有一个为真,即为真,类似电路并联

    非运算:

    非真为假,非假为真

    异或运算:

    判断两者是否不同,不同者为真;相同者为假

    短路法则:

    COMMAND1 && COMMAND2

    COMMAND1为真,COMMAND2才会执行;COMMAND1为假时,COMMAND2不会在执行。

    COMMAND1 || COMMAND2

    COMMAND1为真,COMMAND2不执行;COMMAND1为假,COMMAND2才会执行

    bash条件测试

    命令执行成功与否,即为测试条件

    命令执行成功与否为测试条件

    test 表达式

    [ 表达式 ]

    [[ 表达式 ]]

    比较运算:

    <, >, <=, >=, ==, !=,

    整型比较:数值间的大小比较

    -eq:等于

    -gt:大于

    -lt:小于

    -ge:大于等于

    -le:小于等于

    -ne:不等于

    a=10
    b=20
    [ $a -gt $b ]
    echo $?
    

    字符串比较:

    字符串大小比较

    1,字符串要加引号引用

    2,作比较时使用双中括号[[ VAR ]]

    ==:等于

    >:大于 需用双中括号

    <:小于 [[ ]]

    !=:不等于

    =~:左侧的字符串是否能被右侧的pattern所匹配,匹配为一部分,不是精确匹配,如:[[ "ab" =~ [ab][Ab][AB] ]]

    例如:写个脚本,可判断输入的用户是否有可登录shell

    #!/bin/bash
    #
    read -p "Plz input a username: " userName
    userInfo=`grep "^$userName\>" /etc/passwd
    
    if [[ "$userName" =~ /bin/.*sh$ ]]; then
         echo "Can login."
    else
         echo "Not can login."
    fi`
    

    -z “STRING”:判断指定的字串是否为空,空则为真,不空则假

    -n “string”:判断指定的字串是否不空,空则为假,不空则真

    #[ "$a" -gt "$b" ]
    #echo $?
    

    判断文件的存在性及属性等

    -a或-e FILE:判断一个文件是否存在,存在即为真;

    -f FILE :存在且为普通文件,则为真;

    -d FILE:存在且为目录,则为真;

    -L或-h FILE :存在且为软链接文件,则为真;

    -b FILE:块设备

    -S FILE:套接字文件

    -s FILE :存在且为非空文件

    -N FILE:修改时间新于访问时间的文件,如被重定向过的文件

    -r FILE:存在且可读

    -w:可写

    -x:可执行

    例如:

    FILE1 -nt FILE2:文件1的修改时间mtime,新于文件2,则为真;

    FILE1 -ot FILE2 :旧于

    FILE1 -ef FILE2 :

    例如:

    if [ -x $a ];then
        echo $a
    fi
    

    权限测试

    r,w,x,

    组合条件测试:

    与:[ condition1 -a condition2 ]

    或:[ condition1 -o condition2 ]

    非:[ -not condition ]

    bash切片

    1、基于字符串切片

    Usage: ${var:offset: length}

    # 定义一个变量,等会切这个变量
    mypath="/etc/sysconfig/network-scripts/"
    echo ${mypath:5} #偏移5个字符显示
    """
    sysconfig/network-scripts/
    """
    
    echo ${mypath:10} #偏移10个字符显示
    """
    nfig/network-scripts/
    """
    
    echo ${mypath:5:5} #偏移5个字符,取5个字符 
    """
    sysco    
    """
    
    # 取出字符串的最后几个字符:${var: -length}
    # 注意:-length之前有空白字符
    echo ${mypath: -10}
    """
    k-scripts/
    """
    

    2、基于模式取子串

    Usage:
    ${var#*word}: 自左而右,查找var变量中存储的字符串中第一次出现的由word所指明的字符,删除此字符及其左侧的所有内容

    ${var##*word}: 自左而右,查找var变量中存储的字符串中最后一次出现的由word所指明的字符,删除此字符及其左侧的所有内容

    ${var%word*}: 自右而左,查找var变量中存储的字符串中第一次出现的由word所指明的字符,删除字符及其右侧的所有内容

    ${var%%word*}: 自右而左,查找var变量中存储的字符串中最后一次出现的由word所指明的字符,删除此字符及其右侧的所有内容

    mypath="/etc/sysconfig/network-scripts"
    echo ${mypath#*/}
    """
    etc/sysconfig/network-scripts
    """
    
    mypath="/etc/sysconfig/network-scripts"
    echo ${mypath##*/}
    """
    network-scripts
    """
    
    mypath="/etc/sysconfig/network-scripts"
    echo ${mypath%c*}
    """
    /etc/sysconfig/network-s
    """
    
    echo ${mypath%%c*}
    """
    /et
    """
    

    3、基于字串查找替换

    Usage:
    ${var/pattern/replacement} :查找var变量存储的字符中第一次由pattern匹配到的内容,并替换为replacement

    ${var//pattern/replacement} :查找var变量存储的字符中所有能够由pattern匹配到的内容,并替换为replacement

    ${var/#pattern/replacement} :查找var变量存储的字符中最开始处能够由pattern匹配到的内容,并替换为replacement

    ${var/%pattern/replacement} : 查找var变量存储的字符中最后位置能够由pattern匹配到的内容,并替换为replacement

    示例:

    url="http://www.baidu.com:80"
    echo ${url/www/WWW}
    """
    http://WWW.baidu.com:80
    """
    
    echo ${url/w/W}
    """
    http://Www.baidu.com:80
    """
    
    echo ${url//w/W}
    """
    http://WWW.baidu.com:80
    """
    
    userinfo="root:x:0:0:rootuser:/root:/bin/bash"
    echo ${userinfo/#root/ROOT}
    """
    ROOT:x:0:0:root user:/root:/bin/bash
    """
    
    userinfo="root:x:0:0:rootuser:/root:/bin/root"
    echo ${userinfo/%root/ROOT}
    """
    root:x:0:0:root user:/root:/bin/ROOT
    """
    

    4、基于字串查找删除
    Usage:
    \({var/pattern}:删除变量第一次pattern匹配到的内容 \){var//pattern}:删除变量所有pattern匹配到的内容
    \({var/#pattern}:删除变量头部匹配pattern的内容 \){var/%pattern}:删除变量尾部能够匹配pattern的内容
    示例:

    userinfo="root:x:0:0:rootuser:/root:/bin/root"
    echo ${userinfo/root}
    """
    :x:0:0:root user:/root:/bin/root
    """
    
    echo ${userinfo//root}
    """
    :x:0:0: user:/:/bin/
    """
    
    echo ${userinfo/#root}
    """
    :x:0:0:root user:/root:/bin/root
    """
    
    echo ${userinfo/%root}
    """
    root:x:0:0:root user:/root:/bin/
    """
    
    

    5、基于字符串大小写转换
    Usage:
    \({var^^}:把var变量中的所有小写字母,统统替换为大写; \){var,,}:把var变量中的所有大写字母,统统替换为小写;
    示例

    echo $userinfo
    """
    root:x:0:0:root user:/root:/bin/root
    """
    
    myinfo=${userinfo^^}
    echo $myinfo
    """
    ROOT:X:0:0:ROOT USER:/ROOT:/BIN/ROOT
    """
    
    echo ${myinfo,,}
    """
    root:x:0:0:root user:/root:/bin/root
    """
    

    6、空变量判断赋值
    Usage:
    ${var:-word}:如果变量var为空或未声明,则返回word所表示的字符串;否则,则返回var变量的值, 临时赋值

    echo $name # 这行的值为空
    echo ${name:-tom}
    tom
    
    name=hello 
    echo ${name:-tom}            hello
    

    ${var:=word}:如果变量var为空或未声明,则返回word所表示的字符串,并且把word赋值为var变量;否则,则返回var变量的值,直接等值

    echo "User's name is${name:?wrong}"
    -bash: name: wrong
    
    name=tom
    echo "User's name is${name:?wrong}"
    User's name is tom
    

    ${var:+word}:如果变量var为空或未声明则忽略;否则,则返回word;

    unset name
    echo "User's name is ${name:+wrong}"
    """
    User's name is
    """
    
    name=tom
    echo "User's name is${name:+wrong}"
    """
    User's name is wrong 
    """
    

    正则表达式字符匹配

    .:匹配任意单个字符

    .*:匹配任意字符,0个到无穷多个

    []:匹配指定范围内的任意字符:

    [0-9],[[:digit:]]

    [a-z],[[:lower:]]

    [A-Z],[[:upper:]]

    空白 [[:space:]]

    所有标点符号 [[:punct:]]

    所有大小写字母 [[:alpha:]]

    所有大小写字母和数字符号 [[:alnum:]]

    [^] 取反

    bash环境中特殊符号

    #:批注符号,视为说明

    \:转义符号,将特殊字符或通配符还原成一般字符

    |:管道。左边命令结果,输送给右边命令执行

    ;:连续命令执行分隔符,前面命令执行完,执行后面一个,然后同时输出屏幕

    &&:如果前面的命令执行正确,则开始执行后面的命令,如果前面命令出错,后面命令也不会执行

    ||:如果前面的命令执行成功,则后面的命令不执行,反之,如果前面的命令执行失败,则开始执行后面的命令

    $:使用变量前导符

    &:作业控制,将命令送到后台执行

    !:逻辑运算中‘非’的意思

    ‘’:单引号,不具有变量置换功能,原样输出

    “”:双引号,具有变量置换的功能

    ··:反单引号,优先执行的命令,等同于$()

    RAID

    :0:条带技术 性能+,读写+
    冗余 -
    1:镜像 (每块硬盘都存储同一种数据) 性能+,读+,写-
    冗余+
    2:3:4:校验码技术5:RAID 5 (至少3块) 性能+,读写+
    冗余+1+0: (至少4块) 性能+,读写+
    冗余+
    0+1:(至少4块) 性能+,读写+ 冗余+5+0: (至少6块) 性能+,读写+
    冗余+JBOD技术:适用于存储单个大文件,多个硬盘累加当成一块硬盘用 性能0,读写0
    冗余0(至少2块)(ps:比如一块硬盘存储一个文件,这个文件的大小累计增长的,当文件大小达到硬盘容量后,这时可以在添加一块硬盘,然后使用JBOD技术,把新加的硬盘与原硬盘合并成一整块硬盘。)

    img![img](file:///D:/My Knowledge/temp/6ea688a4-c878-4750-b831-eda777da87d0/128/index_files/9b88cf85-3efc-465c-a7f3-390a86c4e9b9.png)
    ![img](file:///D:/My Knowledge/temp/6ea688a4-c878-4750-b831-eda777da87d0/128/index_files/4dd05eca-0141-4c9f-b8de-d67d044d3045.jpg)

    man手册的段落

    NAME:命令的名称
    DESCRIPTION:命令功能的详细描述
    OPTIONS:所有选项
    SYNOPSIS:使用格式
    EXAMPLES:使用示例
    FILES:与当前命令相关的配置文件
    SEE ALSO:可参考的其他手册
    帮助中的格式字串 []:可省略
    <>:不可省略
    | : 二选一或多选一
    ... : 同类内容可以出现多个

    Linux将命令行执行的命令记录到日志文件中便于审计使用

    配置方法:

    1,编辑/etc/bashrc文件

    vim /etc/bashrc

    # 在此文件的最后一行加入如下内容

    export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[hostname- \((hostname)]": "[euid=\)(whoami)]":\((who am i):[`pwd`]:"\)msg"; }'

    # 保存退出

    2,重新加载下bashrc

    source /etc/bashrc

    3,查看配置结果

    # 在执行如下之令之前,可以随意执行几个命令,以便显示效果

    tail -f /var/log/messages

    end

    作者:暴风来临

    出处:http://www.cnblogs.com/xiaofeiweb/

    版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    abp(net core)+easyui+efcore实现仓储管理系统——入库管理之一(三十七)
    abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之十(三十六)
    abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之九(三十五)
    abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之八(三十四)
    abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之七(三十三)
    abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之六(三十二)
    abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之五(三十一)
    一个屌丝程序猿的人生(一百一十四)
    一个屌丝程序猿的人生(一百一十三)
    给程序员们以及在外漂泊的同学们普及下户口那点事!
  • 原文地址:https://www.cnblogs.com/xiaofeiweb/p/13451007.html
Copyright © 2011-2022 走看看