zoukankan      html  css  js  c++  java
  • Linux shell学习

    最近找了一些linux shell方面的资料学习,对学习总结如下

    一、语法基础

    1.变量

    变量分为系统变量和用户变量
    系统变量
    如 [vigorski@localhost ~]$ set 会打印出系统所有的环境变量
    [vigorski@localhost ~]$ pwd
    /home/vigorski
     [vigorski@localhost ~]$ $HOME
    bash: /home/vigorski: is a directory
    用户变量
    默认在shell中编写的变量全部是局部变量,如果重新打开console的话,那么这些变量将全部丢失,全局的变量可以写在文件~/.bashrc文件.
    变量的定义:var=value变量的使用:${var}

    * 单引号 '
    由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。
    * 双引号 "
    由双引号括起来的字符,除$  `这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。
    tip: 是转义字符, 它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可

    变量的真面目:
    通常写的$a,其实际上是${a}的简写。完整的形式实际上还提供了更多的实用功能,如替换和模式匹配
    替换:

    ${varname:-word}  :如果varname存在且非null,则返回varname的值,否则返回word
    ${varname:=word}  :如果varname存在且非null,则返回varname的值,否则将varname赋值为word,并返回
    ${varname:?message} :如果varname存在且非null,则返回varname的值,否则打印message并exit
    ${varname:+word} : 如果varname存在且非null,则返回word,否则返回null.

    模式匹配:

    ${varname#pattern} : 从开头开始匹配最短的并删除,返回剩下的。
    ${varname##pattern} : 从开头开始匹配最长的并删除,返回剩下的。
    ${varname%pattern} : 从结尾开始匹配最短的并删除,返回剩下的。
    ${varname%%pattern} : 从结尾开始匹配最长的并删除,返回剩下的。
    ${varname/pattern/string}: 匹配最长的并替换为string,只替换第一个。
    ${varname//pattern/string}: 匹配最长的并替换为string,替换全部匹配。

    特定变量

    参数 含义
    $# 传递到脚本的参数个数
    $* 传递到脚本的参数, 即将所有参数作为一个字符串
    $$ 脚本运行的当前进程号,常用作临时变量后缀
    $@ 与$#相同,使用时加引号,并在引号中返回参数个数
    $- 上一个命令的最后一个参数
    $? 命令执行后返回的状态 一般为0(没有错误)
    $! 后台运行的最后一个进程的进程ID

    2.逻辑运算

    数学运算:
    a -eq b :a == b
    a -ne b : a != b
    a -lt b : a < b
    a -le b : a <= b
    a -gt b : a > b
    a -ge b : a >= b

    string比较:
    string1 = string2
    string1 != string2
    string1 : string1 不是NULL,或者是没有定义

    逻辑运算符:

    ! : not
    exp1 -a exp2 : a && b
    exp1 -o exp2 : exp1 || exp2

    3.条件控制

    if语句:
    测试条件{用test 或[[ ]] (或[],在不引起歧义的情况下)引用起来}
    整数比较: -eq -ne -gt -ge -lt -le
    字符串比较:    = == != < > -z(字符串为空) -n(字符串非空)
    文件测试: -e -f -s -d    -h -r -w -x
    语句结构: 
       if/then[/else]/fi
       if/then/elif/then/fi

    #!/bin/bash 
    x=5 ; y=6
    if [[ $x -eq $y ]]
    then
    echo "$x equals to $y"
    else
    echo "$x doesn't equals to $y"
    fi

    if test -e test.sh ; then
    echo "File Exists"
    fi

    case结构:

    #!/bin/bash 
    var=2
    case "$var" in
    0) echo "This is 0" ;;    #其中0可以是形如 [0-9] 或是 [a-zA-Z] 及 用 | 等连接起来的表达式
    1) echo "This is 1" ;;
    2) echo "This is 2" ;;
    *) echo "This is not 0, 1, 2" ;; # *表示默认匹配项,即上面都不匹配的时候。
    esac
    exit  

    循环结构
    while循环: while 测试条件 ; do ... ; done
    for循环: for/in/do/done 通过指定变量范围进行循环。
    --------------
    #!/bin/bash
    for var in 1 2 3 4 5    # or like this for ((var=1 ; var <=5 ; var++))
    do
       echo -n "$var "
    done
    exit

    示例:批量去掉指定文件夹下的文件后缀

    ls ben/*.txt |while read file; do mv $file ${file%.*}; done

    首先,将ben文件夹下的所有txt文件 通过管道重定向输入,然后在while循环中从管道中读出到file变量中,早do循环体中通过mv重命名文件。因为${varname%pattern} : 从结尾开始匹配最短的并删除,返回剩下的。所以会去掉文件后缀。

    --------------

    函数

    function <name> () {
    sequence of command
    }
    同C语言一样,在调用函数前应该申明它。
    -----------
    #!/bin/bash
    function sum ()
    {
    if [ $# -ne 2 ] ; then
    echo "Usage is sum <param1> <param2>"
    exit
    fi
    return $(( $1 + $2 ))
    }
    sum 5 10
    ret=$?
    echo $ret
    ------------

    二、其它命令

    1.&& 与 ;
    &&与;都支持执行多个command意思。其区别:
    ; 或类似c语言中的||
    && 与和C语言中的&&相同
    比如要编译、安装 Linux ,您需要执行一串命令:'make dep'、'make clean'、'make bzImage'、'make modules'、'make modules_install'和'make install'。如果使用;,前面>一个操作失败后,但不影响后续的命令,最后会导致生成一个有问题的的文件

    2.& 与|
    &命令可以实现任务调度jobbing和后台backgrouding,比如你想在目前的终端中启动node.js服务,但启动完后你不想另外开一个终端,只想在当前的终端继续其他操作,这样你就可>以
    sudo node mynode.js & ,将任务切换到后台,这样是不是不用切换terminal了。
    停止服务:node
    >
    (^C again to quit)
    >
    [1]-  Stopped                 sudo node mynode.js

    [2]+  Stopped                 node
    关闭backgroud服务
    | 命令识连接多个命令进行重定向,就是递进的表达式
    比如 ls -l |less
    首先列出目录内容,然后翻页显示
    rpm -qa | grep ^x | less
    首先列出已安装的rpm包,然后过滤(grep乃filter)只展示首字母为X的,最后分页显示

    3.通配符
    linux下的shell可以使用*、?、[]等通配符
    *匹配任意字符,?匹配单个字符,[]匹配在某一范围的字符

    4.more less
    more命令功能:让画面在显示满一页时暂停,此时可按空格健继续显示下一个画面,或按Q键停止显示。
    less命令功能:less命令的用法与more命令类似,也可以用来浏览超过一页的文件。所不同的是less命令除了可以按空格键向下显示文件外,>还可以利用上下键来卷动文件。当要结束浏览时,只要在less命令的提示符“:
    ”下按Q键即可。
    5.< 与 >
    <就是input输入的命令
    >就是output输出的命令
    比如上一个命令rpm -qa | grep ^x | less我们想把结果保存到文件中,可以使用
    rpm -qa | grep ^x > rpmlist,将文件保存到rpmlist中。
    比如
    sort < dirlist > sdirlist
    将文件'dirlist'的内容送到命令'sort',然后再将排序后的结果送到文件'sdirlist'。
    另外一种变换
    ls | sort > sdirlist
    排序后输出
    echo "vigorski" >> myfile
    追加模式将字符串存入myfile,如果myfile不存在,将会创建。

    但是我们有这样的需求,我们需要将一个文件排序后然后将排序好的数据追加到源文件中。
    用 command < sortfile > sortfile会删除掉文件
    而 command < sortfile >> sortfile 就可以完美解决

    参考文献:

    1.http://www.cnblogs.com/shipfi/articles/377367.html

    2.http://www.cnblogs.com/hzl6255/archive/2013/02/23/2923850.html

    3.http://www.cnblogs.com/xuqiang/archive/2011/04/27/2031034.html

    4.http://www.cnblogs.com/simpman/archive/2013/06/09/3127993.html

    5.http://www.cnblogs.com/louis-sherren/articles/linux-shell-init.html

  • 相关阅读:
    P1363-幻象迷宫
    P1582-倒水
    P2123-皇后游戏
    P1233-木棍加工
    P1052-过河
    P1541-乌龟棋
    P1736-创意吃鱼法
    P1417-烹调方案
    LeetCode--043--字符串相乘(java)
    LeetCode--041--缺失的第一个整数(java)
  • 原文地址:https://www.cnblogs.com/keily/p/3346205.html
Copyright © 2011-2022 走看看