zoukankan      html  css  js  c++  java
  • Shell编程初步

     

    一:Hello World

    新建一个文件,命名时以 .sh 为后缀。每个bash文件开头第一行表名文件类型: #!/bin/bash

    然后在下面输入代码。

    比如输出hello world:

    #!/bin/bash
    echo "hello world"

    运行bash文件: ./文件名.sh

    (在终端创建的文件用vim编辑保存,ubuntu可以在图形化界面new一个空白文档,通过后缀名识别为bash文件)

    二:变量

    shell中定义变量,有以下规则:

    • 首个字符必须为字母(a-z,A-Z)。
    • 中间不能有空格,可以使用下划线(_)。
    • 不能使用标点符号。
    • 不能使用bash里的关键字
    • 变量名和等号之间不能有空格;

    使用对象:使用 ${变量名} 获取变量,如同EL表达式一样。如:${name}

    只读变量:在赋值后可以用readonly修饰变量成为只读,相当于final常量

    #!/bin/bash
    name=“ygj”
    readonly name

    变量类型:

    • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
    • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
    • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

    字符串:用 “”或‘’括起来

    字符串拼接:不需要运算符,直接连着写或者用 ${name} 把要拼接的内容直接写到新定义的字符串里。如:

    #!/bin/bash
    str1="i am str1"
    str2="you are str2,and"str1
    str3="she is str3,${str2}"

    获取字符串长度: #strname 即可,如:

    #!/bin/bash
    str1="i am str1"
    echo ${#str1}

    截取字符串: strname:beginindex:endindex,如:

    #!/bin/bash
    str1="i am str1"
    str2=${str1:0:2}

    字符串中查找子串或字符下标: `expr index "${strname}" 查找内容` (注意:前后两个反引号。在键盘的Esc下面按钮)

    #!/bin/bash
    str1="i am str1"
    echo `expr index "${str1}" am`

    Shell数组:

    定义数组:arrname=(value0 value1。。。)(注意:元素之间通过空格隔开,不是逗号!)也可以逐个赋值 arrname[i]=value_i。

    Shell数组没有范围限制,访问时只通过下标访问,下标从0开始。

    访问数组元素:${arrname[index]}

    访问全部元素:${arrname[@]}

    获得数组长:用 # 运算符:${#arrname[@]}

    获取单个元素内容的长:用 # 运算符:${#arrname[index]}

    Shell注释:用#开头的行都是注释

    三:向bash文件传递参数

    在终端启动bash文件时,可以在文件名后增加传入的参数值,如:

    ./test.sh ygj 0930 22

    在bash文件中获取参数: $n ,n指传进来的第几个参数,从1开始。如:

    #!/bin/bash
    echo “No.1 parameter is:$1

    统计参数个数:$#

    把所有参数以一个字符串形式返回:$*

    把所有参数单独逐个返回:$@

    显示运行当前脚本的进程ID:$$

    四:运算符

    运算符主要有以下几种:

    算术运算符:+-*/%,==,!=

    bash的运算表达式不能直接计算出数学运算的结果,需要用 `expr 表达式`(反引号)  命令解析表达式才可获取结果。另外,表达书写时要求数字、变量与运算符之间有空格,否则只是简单的字符串而已。如:

    #!/bin/bash
    echo `expr 1 + 1`

    下面的运算符使用不需要expr,但需要放在 [] 中,并且两边留空格,运算符与操作数之间也留空格。如:[ num1 op num2 ]

    关系运算符(关系运算符只支持数字,不支持字符串):

    -eq 检测两个数是否相等,相等返回 true。

    -ne 检测两个数是否相等,不相等返回 true。

    -gt 检测左边的数是否大于右边的,如果是,则返回 true。

    -lt 检测左边的数是否小于右边的,如果是,则返回 true。

    -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。

    -le 检测左边的数是否小于等于右边的,如果是,则返回 true。

    布尔运算符:

    -o 或运算,有一个表达式为 true 则返回 true。

    -a 与运算,两个表达式都为 true 才返回 true。

    ! 非运算,表达式为 true 则返回 false,否则返回 true。

    逻辑运算符:

    && 逻辑与

    || 逻辑或

    字符串操作运算符:

    = 检测两个字符串是否相等,相等返回 true。

    != 检测两个字符串是否相等,不相等返回 true。

    -z 检测字符串长度是否为0,为0返回 true。

    -n 检测字符串长度是否为0,不为0返回 true。

    文件操作运算符:

    -b file 检测文件是否是块设备文件,如果是,则返回 true。

    -c file 检测文件是否是字符设备文件,如果是,则返回 true。

    -d file 检测文件是否是目录,如果是,则返回 true。

    -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。

    -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。

    -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。

    -p file 检测文件是否是有名管道,如果是,则返回 true。

    -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。

    -r file 检测文件是否可读,如果是,则返回 true。

    -w file 检测文件是否可写,如果是,则返回 true。

    -x file 检测文件是否可执行,如果是,则返回 true。

    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。

    -e file 检测文件(包括目录)是否存在,如果是,则返回 true。

    Shell中可以test命令测试上述运算符组成的表达式是否成立,如:

    num1="ru1noob"
    num2="runoob"
    if test $num1 = $num2
    then
        echo '两个字符串相等!'
    else
        echo '两个字符串不相等!'
    fi

    五:输出

    1:echo:类似于C++中的cin。

    echo 内容

    2:printf:与C语音的printf类似,以 printf 格式 参数值  的形式格式化输出。

    printf "%-10s %-8s %-4.2f
    "张三  男 60.97

    格式里面的替代符与C语言中一样,用   %-数位限制 数据类型 来表示一个数据,后面参数值列表按顺序给前面的替代符赋值。

    六:流程控制

    1:if语句:结尾 fi  表示endif的意思

    if condition
    then
        command1 
        command2
        ...
        commandN 
    fi

    2:if-else

    if condition
    then
        command1 
        command2
        ...
        commandN
    else
        command
    fi


    3:if-elif-else

    if condition1
    then
        command1
    elif condition2 
    then 
        command2
    else
        commandN
    fi

    4:for-each语句

    for var in item1 item2 ... itemN//遍历的内容:可为数组,可为字符串
    do
        command1
        command2
        ...
        commandN
    done

    5:while

    while condition
    do
        command
    done

    5:until:相当于dowhile-until

    until condition
    do
        command
    done

    6:case:相当于switch-case

    case $变量 in
    模式1)  //变量的一种取值情况
        command1
        command2
        ...
        commandN
        ;;//每个case结尾用两个 ;; 表示结束
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac

    7:跳出循环、case:break、continue。

    七:函数

    定义函数:

    funname ()
    
    {
    
        action;
    
        [return int;]//可选
    
    }

    函数参数:调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值。

    funWithParam(){
        echo "第一个参数为 $1 !"
        echo "第二个参数为 $2 !"
        echo "第十个参数为 $10 !"
        echo "第十个参数为 ${10} !"
        echo "第十一个参数为 ${11} !"
        echo "参数总数有 $# 个!"
        echo "作为一个字符串输出所有参数 $* !"
    }
    funWithParam 1 2 3 4 5 6 7 8 9 34 73    //调用参数时传参


    八:输入/输出重定向(从文件输入,输出到文件)

    命令说明
    command > file 将内容输出到file,会覆盖file原有内容。
    command < file 从file获取输入。
    command >> file 将输出以追加的方式输出到 file,不会覆盖file原有内容
    n > file 将文件描述符为 n 的文件的内容赋值到 file,会覆盖file原有内容
    n >> file 将文件描述符为 n 的文件以追加的方式复制到 file。
    n >& m 将输出文件 m 和 n 合并。
    n <& m 将输入文件 m 和 n 合并。
    << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

    九:文件包含

    相当于JSP中的include命令。我们可以在一个bash文件中导入已存在的bash文件,达到重用效果。

    . filename   # 注意点号(.)和文件名中间有一空格
    
    或
    
    source filename
  • 相关阅读:
    STL之map UVa156
    STL之vector UVa101
    STL之set UVa10815
    无修改区间查询 BNU Can you answer these queries I
    区间修改点查询 HDU1556
    无废话ExtJs 入门教程九[数字字段:NumberField、隐藏字段Hidden、日期字段:DataFiedl]
    无废话ExtJs 入门教程七[登陆窗体Demo:Login]
    无废话ExtJs 入门教程六[按钮:Button]
    无废话ExtJs 入门教程五[文本框:TextField]
    无废话ExtJs 入门教程四[表单:FormPanel]
  • 原文地址:https://www.cnblogs.com/ygj0930/p/6507034.html
Copyright © 2011-2022 走看看