• shell基础命令


    一、    变量赋值

    (1)    

     

    (2)   语句给变量赋值

     

    (3)   只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变

     

    (4)   删除变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变

     

    二、    Shell字符串

    (1)    单引号

    单引号字符串的限制:

    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

     

    (2)    双引号

    双引号的优点:

    • 双引号里可以有变量
    • 双引号里可以出现转义字符

     

    (3)    拼接字符串

    双引号

     

    单引号

     

    (4)    获取字符串长度

     

    (5)    提取子字符串

     

    (6)    查找字符串

    查找支付b或c的位置(哪个字母先出现就计算哪个)

    string="abc123jbc"

    echo `expr index "$string" bc`

    (注意是反引号”`”)

     

    三、    Shell数组

    (1)    定义数组

    在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。

     

    或者:

     

    (2)    读取数组

    读取数组元素值的一般格式是:${数组名[下标]}

     

    使用“@”符号可以获取数组中的所有元素:

     

    (3)    获取数组的长度

     

    或者

     

    四、    注释

    (1)    单行注释

    以 # 开头的行就是注释,会被解释器忽略。

     

    (2)       多行注释

     

    五、    传递参数

    (1)    传递参数

    以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:

     

    (2)    几个特殊字符用来处理参数:

    参数处理

    说明

    $#

    传递到脚本的参数个数

    $*

    以一个单字符串显示所有向脚本传递的参数。
    如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

    $$

    脚本运行的当前进程ID号

    $!

    后台运行的最后一个进程的ID号

    $@

    与$*相同,但是使用时加引号,并在引号中返回每个参数。
    如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

    $-

    显示Shell使用的当前选项,与set命令功能相同。

    $?

    显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

     

    $* 与 $@ 区别:

    相同点:都是引用所有参数。

    不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

     

     

    六、    运算符

    (1)    算数运算符

    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

    expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

    例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

     

    或者

     

    或者

     

     

    (2)    关系运算符

    关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

    下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

    运算符

    说明

    举例

    -eq

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

    [ $a -eq $b ] 返回 false。

    -ne

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

    [ $a -ne $b ] 返回 true。

    -gt

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

    [ $a -gt $b ] 返回 false。

    -lt

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

    [ $a -lt $b ] 返回 true。

    -ge

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

    [ $a -ge $b ] 返回 false。

    -le

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

    [ $a -le $b ] 返回 true。

     

    (3)    布尔运算符

    下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20

    运算符

    说明

    举例

    !

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

    [ ! false ] 返回 true。

    -o

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

    [ $a -lt 20 -o $b -gt 100 ] 返回 true。

    -a

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

    [ $a -lt 20 -a $b -gt 100 ] 返回 false。

     

    (4)    逻辑运算符

    假定变量 a 为 10,变量 b 为 20:

    运算符

    说明

    举例

    &&

    逻辑的 AND

    [[ $a -lt 100 && $b -gt 100 ]] 返回 false

    ||

    逻辑的 OR

    [[ $a -lt 100 || $b -gt 100 ]] 返回 true

     

    (5)    字符串运算符

    下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":

    算符

    说明

    举例

    =

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

    [ $a = $b ] 返回 false。

    !=

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

    [ $a != $b ] 返回 true。

    -z

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

    [ -z $a ] 返回 false。

    -n

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

    [ -n "$a" ] 返回 true。

    $

    检测字符串是否为空,不为空返回 true。

    [ $a ] 返回 true。

     

    (6)    文件测试运算符

    文件测试运算符用于检测 Unix 文件的各种属性。

    属性检测描述如下:

    操作符

    说明

    举例

    -b file

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

    [ -b $file ] 返回 false。

    -c file

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

    [ -c $file ] 返回 false。

    -d file

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

    [ -d $file ] 返回 false。

    -f file

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

    [ -f $file ] 返回 true。

    -g file

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

    [ -g $file ] 返回 false。

    -k file

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

    [ -k $file ] 返回 false。

    -p file

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

    [ -p $file ] 返回 false。

    -u file

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

    [ -u $file ] 返回 false。

    -r file

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

    [ -r $file ] 返回 true。

    -w file

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

    [ -w $file ] 返回 true。

    -x file

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

    [ -x $file ] 返回 true。

    -s file

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

    [ -s $file ] 返回 true。

    -e file

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

    [ -e $file ] 返回 true。

     

    七、    echo

     

    参数说明:

    •  -p 输入提示文字
    •  -n 输入字符长度限制(达到6位,自动结束)
    •  -t 输入限时
    •  -s 隐藏输入内容

     

     

    八、    test 命令

    Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

     

    九、    流程控制

    (1)    if else

    if else 语法格式:

    if condition

    then

        command1

        command2

        ...

        commandN

    else

        command

    fi

    写成一行(适用于终端命令提示符):

    if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

    (2)    if else-if else

    if else-if else 语法格式:

    if condition1

    then

        command1

    elif condition2

    then

        command2

    else

        commandN

    fi

    末尾的fi就是if倒过来拼写,后面还会遇到类似的。

     

    以下判断两个变量是否相等:

     

    (3)    for循环

    for循环一般格式为:

    for var in item1 item2 ... itemN

    do

        command1

        command2

        ...

        commandN

    done

    写成一行:

    for var in item1 item2 ... itemN; do command1; command2… done;

    当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。

    in列表是可选的,如果不用它,for循环使用命令行的位置参数。

     

    顺序输出当前列表中的数字:

     

    顺序输出字符串中的字符:

     

    (4)    while循环

    while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

    while condition

    do

        command

    done

     

    使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,

     

    while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。

     

    echo '按下 <CTRL-D> 退出'

    echo -n '输入你最喜欢的网站名: '

    while read FILM

    do

        echo "是的!$FILM 是一个好网站"

    done

     

    (5)    无限循环

    无限循环语法格式:

    while :
    do
        command
    done

    或者

    while true
    do
        command
    done

    或者

    for (( ; ; ))

    (6)    until 循环

    until 循环执行一系列命令直至条件为 true 时停止。

    until 循环与 while 循环在处理方式上刚好相反。

    一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

    until 语法格式:

     

    until condition
    do
        command
    done

     

     

    (7)    case

    case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

    case 值 in

    模式1)

        command1

        command2

        ...

        commandN

        ;;

    模式2)

        command1

        command2

        ...

        commandN

        ;;

    esac

    case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。

    取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

     

    (8)    break命令

    break命令允许跳出所有循环(终止执行后面的所有循环)。

     

    (9)    continue命令

    continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

    运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo "游戏结束" 永远不会被执行。

     

     

    (10)   esac

    case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。

    十、    函数

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

    shell中函数的定义格式如下:

    [ function ] funname [()]

     

    {

     

        action;

     

        [return int;]

     

    }

     

    (1)    带return函数

     

    (2)    函数参数

    在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

     

    注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

     

    另外,还有几个特殊字符用来处理参数:

    参数处理

    说明

    $#

    传递到脚本的参数个数

    $*

    以一个单字符串显示所有向脚本传递的参数

    $$

    脚本运行的当前进程ID号

    $!

    后台运行的最后一个进程的ID号

    $@

    与$*相同,但是使用时加引号,并在引号中返回每个参数。

    $-

    显示Shell使用的当前选项,与set命令功能相同。

    $?

    显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

     

    十一、     输入/输出重定向

    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

    重定向命令列表如下:

    命令

    说明

    command > file

    将输出重定向到 file。

    command < file

    将输入重定向到 file。

    command >> file

    将输出以追加的方式重定向到 file。

    n > file

    将文件描述符为 n 的文件重定向到 file。

    n >> file

    将文件描述符为 n 的文件以追加的方式重定向到 file。

    n >& m

    将输出文件 m 和 n 合并。

    n <& m

    将输入文件 m 和 n 合并。

    << tag

    将开始标记 tag 和结束标记 tag 之间的内容作为输入。

    需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

     

    (1)    输出重定向

    重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

    command1 > file1

    上面这个命令执行command1然后将输出的内容存入file1。

    注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。

     

    (2)    输入重定向

    和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

    command1 < file1

    这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

    注意:输出重定向是大于号(>),输入重定向是小于号(<)。

     

     

    注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。

     

     

    同时替换输入和输出,执行wc,从文件infile读取内容,然后将输出写入到outfile中。

     

    十二、     文件包含

    和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

    Shell 文件包含的语法格式如下:

    . filename   # 注意点号(.)和文件名中间有一空格

    source filename

     

    为 test2.sh 添加可执行权限并执行

    注:被包含的文件 test1.sh 不需要可执行权限。

     

     参考资料:

    https://www.runoob.com/linux/linux-shell.html

  • 相关阅读:
    智能资产构建去中心化的资产管理系统
    以太坊—开放的智能合约完整解决方案
    去中心化的域名系统Namecoin
    bootstrap-内联文本元素-小号文本
    MySQL重新初始化安装数据库
    MySQL重新初始化安装数据库
    MySQL重新初始化安装数据库
    MySQL重新初始化安装数据库
    PHP模拟登录并获取数据
    PHP模拟登录并获取数据
  • 原文地址:https://www.cnblogs.com/lemon-feng/p/11249285.html
Copyright © 2020-2023  润新知