• Shell 基础


    Shell中有三种引号,分别为双引号(" ")、单引号(' ')以及反引号(` `)
    其中双引号对字符串中出现的$、''、`和进行替换;单引号不进行替换,将字符串中所有字符作为普通字符输出,而反引号中字符串作为shell命令执行,并返回执行结果。具体含义如下:

    双引号(" "):在双引号中,除了$, '', `和以外所有的字符都解释成字符本身。
    单引号(' '):在单引号中所有的字符包括特殊字符($,'',`和)都将解释成字符本身而成为普通字符。
    反引号(` `):在反引号中的字符串将解释成shell命令来执行。

    例如

    $ a=1
    $ echo $a
    1
    $ echo 'this is $a' #单引号 this is $a
    $
    echo "this is $a" #双引号 this is 1

      $ a=`ls` 
      $ echo $a  #反引号,显示执行ls命令后的结果

    使用变量与其它字符连接时,可以如下如下使用
    $ echo ${a}_2
    1_2

    一些快捷操作命令
    $PWD
    $USER
    $HOME
    $PATH

    $ pwd  #返回当前的目录路径
    $ echo $PWD     #返回当前的目录路径
    $ echo $USER   #返回当前用户名
    $ echo $HOME  #返回当前的目录路径 等价于 $ echo ~
    $ echo $PATH   #返回当前的环境变量的内

    $ echo $$  #查看当前的进程的ID
    $ () 在括号中执行的的子 shell,相当于函数的作用域。而 {} 执行的是当前的语句块
    $ (a=1)
    $ echo $a   #不会显示 1

    $ for ((i=0;i<5;i++));do echo $i;sleep 2;done &   #每两秒操作操作一次字符,而最后的 “&”字符表示该操作在后台进行,且不影响当前界面进行其他操作

    $ echo $!   #返回当前进程的最后一个进程的 ID

    $ jobs   #显示当前进程的状态

    按键盘 CTRL+Z ,会把当前正在执行的进程暂停,然后放到后台,按 CTRL+Z 后,程序会给被暂停的进程一个标识号。若想把被暂停的进程调回来继续执行,

    使用命令  bg  +  标识号;若被调到后台的进程想调到前台,使用命令  fg + 标识号

    > 输出重定向,可以把内容输出到文件中,但是会覆盖文件中原来的内容;
    >> 输出重定向,可以把内容输出到文件中,不会覆盖文件中原来的内容,而是追加输入到文件中

    $ echo "hello" > file  #将字符串“hello”输出到文件file 中
    $ echo "hello" >> file  #将字符串“hello”追加输出到文件file 中

    < 输入重定向,可以把文件的内容输入到一个变量上,

    $ resd x < file   #把file 文件中的内容输入到x (read 命令一次读取一行)
    $ echo $x
    testerhome
    $ ls ddd > a 2>&1    #前提,已建立了文件a,2代表当前的标准错误输出,1代表标准输入。

    2>&1 该命令的意思:将ddd输入到文件中,若报错,将报错信息也输入到文件a中,若正常执行,则将正常执行的结果输入到文件a中;2>&1 该命令是一个固定模式,不能修改

    ls 命令

    $ ls -l  #显示当前目录下的文件具体信息,如权限、大小、创建时间、文件名字等,可以简写为 $ ll
    $ ls -al  #显示当前目录下的文件具体信息,包含了隐藏文件一起显示

    $ which  #加文件名 例如 $ which python 是从当前的环境变量中查找该文件的安装位置
    $ export PATH=$PATH:$PWD  #把当前的目录的添加到当前的系统变量中

    数组处理

    $ array=(1 2 3 4 5)
    $ echo ${array[@]}  #@不管加不加双引号,都当做数组处理
    1 2 3 4 5
    $ echo ${array[*]}  # * 当加上双引号时, 把数组中的值都当做字符串处理
    1 2 3 4 5
    $ echo ${#array[@]} #返回数组中有多少个元素
    5
    $ echo ${array[2]} #通过数组下标索引输出元素
    3
    

      

      

    cd 命令,进入目录
    $ cd expert/  #进入expert/目录
    $ cd ..   #回到上一层目录
    $ cd   #回到根目录

    特殊字符处理

    $ echo -e "a
    bb"   #-e 开启转义功能,不开启,输出的是 a
    bb
    a
    bb
    $ echo $(())  #对变量进行操作
    $ a=2;b=3
    $ echo $((a+3))
    5

    (()) 把括号中的变量当做整数去处理

    $ a=1;b=3
    $ (($a>$b));echo $?
    1

    echo $? 表示上一个语句是否执行正确,返回响应的值,在bash中,0代表true,所有非0的代表false
    注意,针对的是上一个语句,整个表达式的执行

    seq 命令,给定初始值和终值,构建一串序列

    字符串操作

    $ s="hello from testerhome"
    $ echo ${s:6} #从字符串的第六个字符开始输出,类似python的切片
    from testerhome 
    $ echo ${s:6:3} #截取从字符串的第六个字符开始,到后面的第三个字符,然后输出
    fro
    $ echo ${s#hello}  #将指定的字符/字符串去掉(默认包含了前后空格,从头部开始匹配),然后输出
    from testerhome
    $ echo “${s#hello}”  #将指定的字符/字符串去掉(加双引号不包含前后空格),然后输出
    from testerhome
    $ echo ${s#*m}  #采用了正则匹配,*是通配符,代表任意字符,m只匹配一次(非贪婪匹配)
    testerhome
    $ echo ${s##*m}  #采用了正则匹配,*是通配符,代表任意字符,m匹配多个(贪婪匹配)
    e
    $ echo ${s%home}  #将指定的字符/字符串去掉(默认包含了前后空格,从尾部开始),然后输出
    hello from tester
    $ echo ${s%h*}  #采用了正则匹配,*是通配符,代表任意字符,h只匹配一次(非贪婪匹配),从尾部开始匹配
    hello from tester
    $ echo ${s/from/to}  #替换字符串,第一个斜杠后边是被替换的字符,第二个斜杠后边是要替换的字符,只匹配到识别的第一个字符。贪婪匹配模式可以参照上面的例子。
    hello to testerhome

    字符串比较

    $ a=testerhome
    $ b="testerhome"
    $ [ "$a" = "$b"]
    $ echo $?
    1
    $ [ "$a" != "$b"]
    0
    $ [ -n $a]  #如果字符串不为空,则结果为真 
    $ echo $?
    0
    $ [ -z $a]  #如果字符串为空,则结果为真 
    $ echo $?
    1

    字符串替换

    ${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”/”表示。

    $ test='c:/windows/boot.ini'
    $ echo ${test///\}
    c:windows/boot.ini
    $ echo ${test////\}
    c:windowsoot.ini
    $ x=abcdabcd
    $ echo ${x/a/b} # 只替换一个
    bbcdabcd
    $ echo ${x//a/b} # 替换所有
    bbcdbbcd
    #举例
    $ test='liu.'
    $ echo ${test//'.'/'.'}
    liu.

    #使用 awk 或 sed 命令表示
    $ a="1234567"
    $ echo $a | awk '{print substr($0,2,3)}'
    234
    $ echo $a | sed 's/3/c/g' # g 表示进行全局匹配
    12c4567

    grep 命令详解

    grep [OPTIONS] "PATTERN" [FILE...]
    Options:
        -E, --extended-regexp  # equal to "egrep"
        -i, --ignore-case      # 忽略大小写
        -n, --line-number      # 显示行号
        -v, --invert-match   
        -o, --only-matching    # show only the part of a line matching PATTERN,精准匹配
        -r "PATTERN" DIR    # 根据文件内容, 查找文件
        -A NUM, --after-context=NUM
        -B NUM, --before-context=NUM
        -C NUM, --context=NUM
        --color

    “|” 管道命令

    管道前面是内容,管道后面是命令,前面命令的输出作为'|'后面的输入
    $ echo adbc | grep -o c 前面的 adbc 通过后面的精准匹配 c 符号,然后输出
    c

    双竖线‘||’,用双竖线‘||’分割的多条命令,执行的时候遵循如下规则,如果前一条命令为真,则后面的命令不会执行,如果前一条命令为假,则继续执行后面的命令。可以表示为“或”

    “&” 同时执行多条命令,不管命令是否执行成功

    “&&” 可同时执行多条命令,当碰到执行错误的命令时,将不再执行后面的命令。如果一直没有错误的,则执行完毕。

    curl 命令

    status=$(curl -I -m 10 -o /dev/null -s --head -w %{http_code} $url)
    status=$(curl -s --head $url | head -n 1 | awk '{print $2}')

    以上两句都是匹配某个 URL 进行请求后返回的状态码,并赋值给 status 变量,部分命令解释:

    # -I 只显示http response的头信息
    # -m 10 最大传输时间10s
    # -o /dev/null 屏蔽原有输出信息
    # -s silent 模式,不输出任何东西
    # -w %{http_code} 控制额外输出
    # --head 显示http response的头信息,不包含网页代码
    # head -n 1 指定需要输出的文本行数量

    您对以上内容有何建议或意见,请写下来告诉我,谢谢!!!
  • 相关阅读:
    [CF666E] Forensic Examination
    [BZOJ3739] DZY loves math VIII
    [BZOJ3561] DZY Loves Math VI
    VS中的类模板
    php中的this,self,parent
    js中的 Table 对象
    CEF中弹出窗口的处理
    VC禁止或允许拖拽改变窗口尺寸
    MFC系统自动生成的停靠窗格关掉后,如何重新显示?
    VS2010 如何自动生成UML图
  • 原文地址:https://www.cnblogs.com/chenri/p/11139697.html
Copyright © 2020-2023  润新知