zoukankan      html  css  js  c++  java
  • shell script简单笔记

    变量

    shell script是一种脚本语言,变量的定义是通过

    myName=HYB
    

    这样的形式定义的。
    当存在空格时,可以通过双引号或单引号将其变为字符串。双引号不进行转义,单引号将内容进行转义为一般字符。会进行转义。

    执行命令

    通过小括号$(command)或者是`command`可以执行指令,将执行结果返回。
    ?为上一个指令返回的值

    命令

    export

    可以显示或增添变量,仅在当前会话中有效。
    比如 export PATH=$PATH:/bin/bash
    还可以将父进程中的自定义变量传递到子进程中。
    export myName

    echo

    将变量进行输出
    echo ${PATH}

    unset

    删除变量 unset myName

    read

    通过read可以接收键盘输入,如
    read name
    即可将键盘输入存入name变量中。
    参数-t为限时,-p为提示文字。

    declare

    可以设置变量。declare [-aixr] variable 。-a为数组,-i为整形,-x为将其变为环境变量,-r将其设为不可改变。

    test

    可以对文件属性进行测试。
    test -d file -a -w file 对file是否为目录并且具有w权限进行测试

    控制符

    删除

    #为从前开始懒惰的匹配删除
    ##为从前开始贪婪的匹配删除
    echo ${path##/*:}为只保留path的最后一个的删除操作

    %为从后开始懒惰的匹配删除
    %%为从后开始贪婪的匹配删除
    echo ${path%%/*:}为只保留path的最后一个的删除操作

    替换

    ${变量/旧字符串/新字符串}替换第一个匹配项
    ${变量//旧字符串/新字符串}替换所有匹配项

    值的计算

    ${var-default}通过使用-可以设置变量默认值,变量var不存在时就会将default值赋予变量。
    ${var:-default}变量为空是也会设置默认值。
    值的计算

    正则表达式

    通配符

    字符 含义
    [:alnum:] 0-9, AZ, az
    [:alpha:] A-Z, a-z
    [:blank:] 空格及tab
    [:cntrl:] 代表键盘上面的控制按键,亦即包括CR, LF, Tab, Del.. 等等
    [:digit:] 0-9
    [:graph:] 空格与tab外的其他所有按键
    [:lower:] a-z
    [:print:] 所有能被打印的字符
    [:punct:] 标点符号
    [:upper:] A-Z
    [:space:] 空白字符,包括空格键, [Tab], CR 等等
    [:xdigit:] 代表16 进位的数字类型,因此包括: 0-9, AF, af 的数字与字符

    控制符

    ‘[char]’为char中的任意一个字符
    ‘[^char]’为不在char中的任意一个字符
    ^表示行首,$表示行尾
    .为任意一个字符,*为重复0到无限次前一个字符
    +为1个或以上前一个字符,?为0个或一个前一个字符
    {a,b}为重复前一个字符的a到b次,()为组群
    |为或符号

    命令的执行

    cmd;cmd可以按顺序从前到后执行命令
    &&和||为逻辑运算符,遵循短路原则,对命令返回结果是否正确进行判断,也就是&&要两个都成功执行,||要最起码一个成功执行

    管线

    |为管线,前面的标准输出会作为下一个指令的标准输入。

    减号

    在管线中,可以用-代替在指令中代替stdin和stdout

    管线命令

    cut

    从每行输出中切分出一部分
    cut [-bn] [file]
    cut [-c] [file]
    cut [-df] [file]
    -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
    -c :以字符为单位进行分割。
    -d :自定义分隔符,默认为制表符。
    -f :与-d一起使用,指定显示哪个区域。
    -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除
    echo ${PATH} | cut -d ':' -f 3,5 将PATH变量按:进行分割,取出来第3-5项

    grep

    从输出中提取部分行
    grep [-acinv] [--color=auto] '搜寻字串' filename
    选项与参数:
    -a :将binary文件以text文件的方式搜寻资料
    -c :计算找到'搜寻字串'的次数
    -i :忽略大小写的不同
    -n :输出行号
    -v :反向选择,亦即显示出没有'搜寻字串' 内容的那一行!
    last | grep 'root'

    sort

    排序,按照字典序排序
    sort [-fbMnrtuk] [file or stdin]
    选项与参数:
    -f :忽略大小写的差异,例如A 与a 视为编码相同;
    -b :忽略最前面的空白字元部分;
    -M :以月份的名字来排序,例如JAN, DEC 等等的排序方法;
    -n :使用『纯数字』进行排序(预设是以文字型态来排序的);
    -r :反向排序;
    -u :就是uniq ,相同的资料中,仅出现一行代表;
    -t :分隔符号,预设是用[tab] 键来分隔;
    -k :以那个区间(field) 来进行排序的意思
    cat /etc/passwd | sort -t ':' -k 3,3 以:切分,以第三列排序

    uniq

    输出仅显示一次uniq [-ic]
    选项与参数:
    -i :忽略大小写字元的不同;
    -c :进行计数

    wc

    统计字数。wc [-lwm]
    选项与参数:
    -l :仅列出行;
    -w :仅列出多少字(英文单字);
    -m :多少字元;

    tee

    可以将stdout输出到文件中。tee [-a] file
    选项与参数:
    -a :以累加(append) 的方式,将资料加入file 当中

    tr

    将文本替换或删除。tr [-ds] SET1 ...
    选项与参数:
    -d :删除讯息当中的SET1 这个字串;
    -s :取代掉重复的字元!
    last|tr [a-z] [A-Z] 将小写替换成大写
    last|tr -d :从输出中删除:

    col

    将输出按列切分,并将列间tab分隔符改为一个“ ”。
    last||col -x

    join

    将两个文件以行为单位拼接到一起。join [-ti12] file1 file2
    选项与参数:
    -t 预设以空白字元分隔资料,并且比对『第一个栏位』的资料,
    如果两个档案相同,则将两笔资料联成一行,且第一个栏位放在第一个!
    -i :忽略大小写的差异;
    -1 :这个是数字的1 ,代表『第一个档案要用那个栏位来分析』的意思;
    -2 :代表『第二个档案要用那个栏位来分析』的意思。

    paste

    将两个文件的行直接拼合,以tab分割
    paste test1 teatime2

    expand

    将tab键转换为空格键

    split

    split [-bl] file PREFIX
    选项与参数:
    -b :后面可接欲分割成的档案大小,可加单位,例如b, k, m 等;
    -l :以行数来进行分割。

    xargs

    xargs [-0epn] command
    选项与参数:
    -0 :如果输入的stdin 含有特殊字符,例如`, , 空白键等等字元时,这个-0 参数
    可以将它转义。
    -e :这个是EOF (end of file) 的意思。后面可以接一个字符串,当xargs分析到这个字串时,
    就会停止继续工作!
    -p :在执行每个指令的argument时,都会询问使用者的意思;
    -n :后面接次数,每次command指令执行时,要使用几个参数的意思
    cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs -p -n 1 id 将/etc/passwd中的:前的第一部分的前三行取出来,每次作为1个参数交由id指令处理

    sed

    sed [-nefr] [动作]
    选项与参数:
    -n :使用安静(silent)模式。在一般sed 的用法中,所有来自STDIN 的资料一般都会被列出到萤幕上。
    但如果加上-n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
    -e :直接在指令列模式上进行sed 的动作编辑;
    -f :直接将sed 的动作写在一个档案内, -f filename 则可以执行filename 内的sed 动作;
    -r :sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
    -i :直接修改读取的档案内容,而不是由萤幕输出。

    动作说明: [n1[,n2]]function
    n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作
    是需要在10 到20 行之间进行的,则『 10,20[动作行为] 』

    function 有底下这些咚咚:
    a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
    c :取代, c 的后面可以接字串,这些字串可以取代n1,n2 之间的行!
    d :删除,因为是删除啊,所以d 后面通常不接任何咚咚;
    i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
    p :列印,亦即将某个选择的资料印出。通常p 会与参数sed -n 一起运作~
    s :取代,可以直接进行取代的工作哩!通常这个s 的动作可以搭配正规表示法!
    例如1,20s/old/new/g
    nl /etc/passwd | sed '2,5d' 打印出来passwd然后删除第2-5行

    脚本的编写

    参数的传递

    $# 表示传入脚本参数的个数
    $@ 表示传入参数的数组
    $* 表示传入参数的字符串
    $0 $1 $2 $3 分别代表执行的脚本/函数名,传入的第1,2,3个参数
    shift 指令可以从前到后移走参数

    脚本的运算

    var=$((运算内容))

    脚本的判断

    []可对脚本内的表达式进行判断
    []内的内容要使用空格进行分割,内容粘连会导致逻辑出错。

    脚本的流程控制

    判断语句

    多个条件判断(if ... elif ... elif ... else)分多种不同情况执行

    if [条件判断式一]; then
    	当条件判断式一成立时,可以进行的指令工作内容;
    elif [条件判断式二]; then
    	当条件判断式二成立时,可以进行的指令工作内容;
    else
    	当条件判断式一与二均不成立时,可以进行的指令工作内容;
    fi
    

    分支语句

    case $变量名称in    <==关键字为case ,还有变量前有钱字号 
      "第一个变量内容" )    <==每个变量内容建议用双引号括起来,关键字则为小括号)
    	程序段
    	;;             <==每个类别结尾使用两个连续的分号来处理!
      "第二个变量内容" )
    	程序段
    	;; 
      * )                   <==最后一个变量内容都会用*来代表所有其他值
    	不包含第一个变量内容与第二个变量内容的其他程序执行段
    	exit 1
    	;; 
    esac
    

    循环

    while [ condition ]   <==中括号内的状态就是判断式 
    do             <==do是循环的开始!
    	程序段落
    done           <==done是循环的结束
    
    until [ condition ]
    do
    	程序段落
    done
    
    for var in con1 con2 con3 .../for var in $(seq 1 100)
     do
    	程序段
    done
    
    for ((初始值;限制值;执行步阶))
    do
    	程序段
    done
    

    函数

    function fname () {
    	程序段
    }
    

    执行与debug

    sh [-nvx] scripts.sh
    选项与参数:
    -n :不要执行script,仅查询语法的问题;
    -v :再执行sccript 前,先将scripts 的内容输出到萤幕上;
    -x :将使用到的script 内容显示到萤幕上,这是很有用的参数!

    执行方式的区别

    使用sh或.直接执行时,系统会进入脚本子线程运行脚本
    当使用source 指令执行脚本时,会直接在当前线程执行脚本

  • 相关阅读:
    Eclipse '《》'operator is not allowed for source level below 1.7
    eclipse怎么在包里建一个包
    java jdk environment variables
    甲骨文中国 / Oracle 提供的技术资源
    在Eclipse中使用log4j配置实例听
    StringBuilder的常用方法
    mediasoup-demo公网安装部署
    使用NodeJs新建一个https服务器,并可以发布静态资源
    使用shell脚本批量执行adb命令,卸载安装apk
    这 5 个前端组件库,可以让你放弃 jQuery UI
  • 原文地址:https://www.cnblogs.com/CoveredWithDust/p/LinuxShellScript.html
Copyright © 2011-2022 走看看