zoukankan      html  css  js  c++  java
  • Bash基本语法

         Bash语法非常的简单,Bash是一个命令解释程序,单使用Bash做不了什么,但是Bash结合Linux命令就很强大了,几乎可以完成Linux所有的事情,早年第一个接触Bash的时候,可以追溯到2010年了,当时在一家互联网虚产品的公司,那是个时候WEB虚机还很流行的,底层WEB虚机的创建,开户都用Shell脚本实现。当时我作为Java开发人员,但有幸参与到shell脚本开发中,当时对Shell并不是很熟,从那个时候算是对Shell第一次试水,并没有进行深入的学习,之后工作重点后来又转向Java开发,但从那个时候就起就感觉shell这个东西很好玩,最近想重新把这块东西捡起来,一点一滴的记录下来,学习shell一定要把学习Linux命令分开,要不然一开始学可能会一头雾水,这是我的一点建议,随着对Linux命令的掌握,再加上shell脚本的威力,就可以在Linux的高手。   

    1 标准输入、输出与标准错误输出

    系统为这三个文件分配了文件标识符fd(file descripter),在Linux系统下,一切皆是文件,对文件的操作,一般要用到文件标识符。它们的文件标识符,分别为0,1,2,关系如下表:

    文件描述符 名称 通用缩写 默认值
    0 标准输入 stdin 键盘
    1 标准输出 stdout 屏幕
    2 标准错误 stderr 屏幕

    1.1 输出重定向 
    语法 说明
    > 把标准输出重定向到一个新文件,”>” 会覆盖原有的内容。
    >> 把标准输出重定向到一个文件中,不覆盖原有的内容(追加)。
    2 > 把标准错误重定向到一个文件中
    2 >> 把标准错误重定向到一个文件中(追加)
    2 > &1 把标准输出和错误重定向到一个文件(追加)

    1.2 输入重定向

    语法 说明
    < filename文件作为标准输入
    << delimiter 从标准输入中读入,知道遇到delimiter分界符

    1.3 绑定重定向

    语法 说明
    > &m 把标准输出重定向到文件描述符m中
    < &- 关闭标准输入
    > &- 关闭标准输出

    2 变量

    2.1 环境变量

    通过使用printenv可以显示当前的环境变量

    [root@IDC-D-1699 ~]# printenv
    HOSTNAME=IDC-D-1699
    TERM=xterm
    SHELL=/bin/bash
    HISTSIZE=1000
    SSH_CLIENT=111.200.23.36 31752 22
    QTDIR=/usr/lib64/qt-3.3
    QTINC=/usr/lib64/qt-3.3/include
    SSH_TTY=/dev/pts/3
    USER=root
    MAIL=/var/spool/mail/root
    PATH=/usr/local/java/jdk1.8.0_101/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    PWD=/root
    JAVA_HOME=/usr/local/java/jdk1.8.0_101
    LANG=zh_CN.UTF-8
    HISTCONTROL=ignoredups
    SHLVL=1
    HOME=/root
    LOGNAME=root

    2.2 本地变量

    Shell不需要明确定义类型,事实上Shell变量的值都是字符串,比如我们定义var=45,其实var的值是字符串而非整数,shell变量不需要事先定义就可以使用,如果使用没有定义的变量,这字符串取值为空字符串。

    变量名称=”变量Value”,“=”的两边不能有空格,否则shell解释成名称和命令参数。

    获取变量使用 $变量名称

    a="ywq"
    echo $a

    2.2.1 文件名代换

    可以使用*、?、[]对文件名代换

    匹配符 说明
    * 匹配0个多个任意字符
    ? 匹配一个任意字符
    [] 匹配方括号中任意一个字符的一次出现

    2.2.2 命令代换

    将命令替换为命令输出,所有的shell支持使用反引号的方式进行命令替换,命令替换可以嵌套,需要注意的是如果使用反引号的形式,在内部反引用前必须使用反斜杠转移

    匹配符 说明
    `` 例如 echo ${pwd}
    $() 例如 echo `pwd`

    2.2.3 算术代换

    匹配符 说明
    $(()) 例如 echo $((4 + 6))

    3 符号

    3.1 转义字符

    ‘’用作转义字符。

    3.2 单引号

    单引号内的所有字符都保持它本身字符的意思,而不会被bash进行解释。

    3.3 双引号

    除了$、``、/外,双引号内所有的字符保持字符本身的含义。

    4 逻辑判断

    4.1 if

    在shell中用if,then,elif,else,fi这几条命令实现分支控制,这种流程控制语句本质上也是由若干个逻辑判断组成,需要注意的是。

    • if/then结束都离不开fi
    • if和[]注意用空格隔开,]后面紧跟;
    • []内的条件与都有一个空格隔开

    例如:

        if [ -f $a ];then  
                echo "hello world!"  
        fi  

    4.2 case

    case结构用于多种情况的条件判断,类似于其它语言的switch/case,但从语法结构上有很大的不同,常用格式。

    case 字符串 in
        模式)
            语句
            ;;
        模式2 | 模式3)
             语句
            ;;
        *)
         默认执行的 语句
             ;;
    esac
    例如
    #!/bin/bash
    read -p "请输入要查查询的区号:" num
    case $num in
    
       *)echo -n "中国";;&
         03*)echo -n "河南省";;&
            ??71)echo "郑州市";;
            ??72)echo "安阳市";;
            ??73)echo "新乡市";;
            ??73)echo "许昌市";;
         07*)echo -n "江西省";;&
            ??91)echo "南昌市";;
            ??92)echo "九江市";;
            ??97)echo "赣州市";;
    esac

    image

    注意

    当程序指定到条件语句;;&时,不会停止,直到执行到;;esac

    不管是if还是case,他们的结尾都很有意思,if的结尾是fi,而case的结尾是easc,首位和尾部正好相反。

    5. 循环

    5.1 for

    例如:

    打印目录下所有的文件

    #!/bin/bash
    for i in $( ls ); do
        echo item: $i
    done

    打印序列

    #!/bin/bash
    for n in $(seq 1 10);
    do
       echo $n
    done

    5.2 while

    例如:

    #!/bin/bash
    counter=$1
    while [ $counter -lt 10 ];
    do
        echo the counter is $counter
        counter=$(($counter+1))
    done

    5.3 until

    例如:

    #!/bin/bash
    counter=$1
    until [ $counter -lt 10 ];
    do
       echo the counter:$counter
       let counter=counter-1
    done

    6 比较运算

    6.1 比较符

    比较符 说明 举例
    -e filename 如果filename存在,则为真 [ -e /var/log/syslog ]
    -d filename 如果filename为目录,则为真 [ -d /tmp/mydir ]
    -f filename 如果filename常规文件,则为真 [  -f /usr/bin/grep ]
    -L filename 如果filename为符号链接,则为真 [ –L /usr/bin/grep ]
    -r filename 如果filename可读,则为真 [ –r /var/log/syslog ]
    -w filename 如果filename可写,则为真 [ –w /varmytmp.txt ]
    -x filename 如果filename可执行,则为真 [ –x /usr/bin/grep ]
    -s filename 如果filename不是空白文件,则为真  
    -u filename 如果filename有SUID属性,则为真  
    -g filename 如果filename有SGID属性,则为真  
    -k filename 如果filename有stickybit属性,则为真  
    file1 –nt file2 如果file1比file2新,则为真  
    file1 –ot file2 如果file1比file2旧,则为真  

    6.2 字符串比较运算符

    比较符 说明 举例
    -z string 如果string长度为零,则为真  
    -n string 如果string长度不为零,则为真  
    str1 = str2 如果str1与str2相同,则为真  
    str1 != str2 如果str1与str2不相同,则为真  

    6.3 算数比较符

    比较符 说明 举例
    -eq 等于  
    -ne 不等于  
    -lt 小于  
    -le 小于或等于  
    -gt 大于  
    -ge 大于或等于  
  • 相关阅读:
    redis学习教程三《发送订阅、事务、连接》
    redis学习教程二《四大数据类型》
    redis学习教程一《Redis的安装和配置》
    java架构《并发编程框架篇 __Disruptor》
    java架构《并发线程高级篇四》
    java架构《并发线程高级篇三》
    java架构《并发线程高级篇二》
    java架构《并发线程高级篇一》
    java架构《并发线程中级篇》
    java架构《并发线程基础二》
  • 原文地址:https://www.cnblogs.com/ywqbj/p/5773033.html
Copyright © 2011-2022 走看看