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

    shell

    1、shell中的特殊变量

    1-1、特殊变量

    1-2、$* 和 $@

    $* 和 $@ 的区别为: $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

    1-3、$?

    $? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

    2、echo 的选项

    2-1、-e

    用后面的内容对转义字符进行替换

    例:echo -e "\"                                                  结果:

             echo -e "\\"                                              结果:

             echo -e "1abc\de\2fgh\\ijklmn"      结果:1abcde2fghijklmn

    2-2、-n

    禁止插入换行符(包括echo自带的换行符也将失效)

    2-3、-E

    禁止转义字符,但对"\"无效

    3、变量

    3-1、只读变量

    readonly 变量

    3-2、删除变量

    unset 变量

    4、替换

    4-1、命令替换

    把一个命令的输出赋值给一个变量,方法为把命令用反引号(在Esc下方)引起来

    例:

    result=`pwd`

    echo $result

    结果:

    /home/sl

    4-2、变量替换

    5、运算符

    5-1、算术运算符

    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr. 下面使用expr进行;  expr是一款表达式计算工具,使用它可以完成表达式的求值操作;

    注意:

             1. 在expr中的乖号为:*

             2. 在 expr中的 表达式(或者变量)与运算符之间要有空格,否则错误;

             3. 在[ $a == $b ]与[ $a != $b ]中,要需要在方括号与变量以及变量与运算符之间也需要有空格, 否则为错误的。

             4、表达式必须用反引号括起来

    5-2、关系运算符

    5-3、布尔运算符

    5-4、字符串运算符

    5-5、文件测试运算符

    6、字符串

    6-1、单引号的限制:

    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
    • 双引号里可以有变量
    • 双引号里可以出现转义字符

    6-2、双引号的优点:

    6-3、字符串操作

    1、字符串长度

    ${#str}

    2、子串

    ${str:1:4}

    3、字符串是否包含子串

    expr index "$str" substr

    4、路径字符串

    4-1、basename

    得到文件名

    例:

    result=`basename /home/sl/a.sh`

    echo $result

    结果:a.sh

    result=`basename /home/sl `

    echo $result

    结果:sl

    4-2、dirname

    得到路径名

    例:

    result=`basename /home/sl/a.sh`

    echo $result

    结果:/home/sl

    result=`basename /home/sl `

    echo $result

    结果:/home

    7、数组

    7-1、定义

    1、在shell中用括号表示数组,元素用空格分开

    2、下标从0开始,可以使用不连续的下标,而且下标的范围没有限制,但不许是自然数

    7-2、读取数组的全部元素,用@或*

    ${array_name[*]}或者${array_name[@]}

    7-3、数组的长度

    ${#array_name[*]}或者${#array_name[@]}

    7-4、获取数组的所有下标

    ${!array_name[*]}或者${#array_name[@]}

    7-5、获取数组元素的长度

    ${#array_name[i]}

    8、函数

    8-1、printf

    • printf 命令不用加括号
    • format-string 可以没有引号,但最好加上,单引号双引号均可。
    • 参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换。
    • arguments 使用空格分隔,不用逗号。
    Ø  如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替

    8-2、exit

    退出shell

    8-3、read

    从键盘读取

    -p:输入提示

    -t:输入等待计时

    -n:输入字符个数控制

    -s:输入不显示在监视器上(实际上数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色)

    read line:读文件

    • 可以使用read命令读取Linux系统上的文件。
      每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。
      读取文件的关键是如何将文本中的数据传送给read命令。
      最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令

    #!/bin/bash

    count=1    //赋值语句,不加空格

    cat test | while read line        //cat 命令的输出作为read命令的输入,read读到的值放在line中

    do

       echo "Line $count:$line"

       count=$[ $count + 1 ]          //注意中括号中的空格。

    done

    echo "finish"

    exit 0

    8-4、

    9、语句

    9-1、if语句

    if [ 表达式] then 语句  elif[ 表达式 ] then 语句 elif[ 表达式 ] then 语句   ……else 语句 fi

    例:

    if [ $a == $b ]

         then

             echo "a等于b"

    else

         echo "a!=b"

    fi

    或者

    if [ $a == $b ]; then echo "a==b"; else echo "a!=b"; fi;

    9-2、case语句

    取值后面必须为关键字 in,每一模式必须以右括号结束。

    ;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。2. 如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

    read -t 30 -p "please input your digit:" a

    case $a in

    1)

         echo "a==1";;

    2)

         echo "a==2";;

    3)

         echo "a==3";;

    *)

         echo "a > 3";;

    esac

    9-3、循环语句

    1、for

    for 变量 in 列表
    do
        ……
    done
    列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。
    for FILE in $HOME/*.sh
    do
       echo $FILE
    done

    2、while

    while command
    do
       Statement(s) to be executed if command is true
    done
    i=0
    while [ $i -lt 5 ]
    do
        i=`expr $i+1`
        echo $i
    done

    3、until

    until command
    do
    ……
    done

    command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

    until [ $i -gt 10 ]

    do

         echo $i

         i=`expr $i + 1`

    done

    10、函数

    1、定义

    function_name () {
        list of commands
        [ return value ]
    }

    也可以加上function关键字:

    function function_name () {
        list of commands
        [ return value ]
    }

    1. 调用函数只需要给出函数名,不需要加括号。

    2. 函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。

    3. Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。

    4. 函数的参数可以通过 $n

    5、定义的时候不用写参数

    2、调用

    function_name 参数列表(空格分开)

    3、删除函数

    unset .f function_name

    11、引入外部脚本

    . filename
    #或
    source filename

    1. 两种方式的效果相同,简单起见,一般使用点号(.),但是注意点号(.)和文件名中间有一空格。

    2. 被包含脚本不需要有执行权限。

  • 相关阅读:
    UVA 254 Towers of Hanoi
    UVA 701 The Archeologists' Dilemma
    UVA 185 Roman Numerals
    UVA 10994 Simple Addition
    UVA 10570 Meeting with Aliens
    UVA 306 Cipher
    UVA 10160 Servicing Stations
    UVA 317 Hexagon
    UVA 10123 No Tipping
    UVA 696 How Many Knights
  • 原文地址:https://www.cnblogs.com/archimedes-euler/p/9970366.html
Copyright © 2011-2022 走看看