linux编程 ——shell编程脚本常用语法总结 【学习笔记】

    科技2022-07-10  121

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。


    笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。 作者:Aliven888

    1、简述

    shell脚本编程严格的来说就是 BASH 编程。我们在进行shell脚本编程时不需要变以及,也不需要什么集成开发环境(linux系统中),通常所使用的都是文本编辑器(VIM 或者 Emacs等)。

    2、语法介绍

    2.1、编程声明

      告诉 shell运行当前脚本该使用那个 shell 程序。 格式:   #! /bin/bash : 指定脚本运行环境为 /bin/bash

    2.2、注释

      在编程中,必要的注释,有利于提高我们编程的可读性,而 shell编程也不例外。

    格式:   # + 注释描述文本

    eg:   # this is a comment

    2.3、 输入/输出打印

    shell程序虽然并不经常和用户进行大量的交互,但是有些时候必要的输入还是必须的。这里简单介绍下输入和输出的常用指令—— readecho

    2.3.1、 输入

    在linux中使用shell进行脚本编程时,输入参数使用read指令。

    格式:   read + 变量名(变量可以有多个,使用空格隔开)

    注意事项:

    阻塞型的命令,遇到 enter 键终止阻塞,开始执行下一条指令。

    演示实例:

    #! /bin/bash read num1 num2 echo "current input value is $num1 - $num2"

    结果输出:

    2.3.2、 输出打印

      我们在进行编程开发的目的就是输出打印结果值,echo 命令把其参数传递给标准输出(显示器);echo指令打印输出参数后会自动换行,因此不必再添加换行符。如果是输出某个变量,需要使用 “$”符号配合。

    格式:   echo “hello word” //输出字符串。

    #! /bin/bash # this is a comment echo "hello world"

    结果输出:

    2.4、 变量与运算符定义

      变量 和 运算符 时所有编程语言都必须所具备的元素。

    2.4.1、 变量的定义与使用

    shell编程中定义一个变量不需要使用数据类型来进行声明,直接使用 “=” 赋予初始值就可以使用了。

    格式:   value = “shell is very good”

    #! /bin/bash # this is a comment echo "hello world" value="shell is very good" echo $value iValue=100 echo $iValue

    注意事项:

    “=” 前后不能有空格,否则会编译失败(错误写法:value = “ok”)

    结果输出:

    2.4.2、 变量替换

      因为"$"是输出提示符,所以当我们想输出该符号时,可以考虑使用转义字符 ‘/’ 来实现。   同时,shell也提供了 “{}” 来限定一个变量的开始与结束;在紧跟变量输出字母后缀时可以使用该功能。

    演示实例:

    #! /bin/bash # this is a comment value=100 echo "current \$value is $value" good="1234" echo "num is ${good}56789"

    结果输出:

    2.4.3、变量的位置

      有时我们启动shell脚本时需要传入参数,这时我们就可以使用位置变量来实现。在shell编程中系统为我们提供了[$0 - $n];其中$0比较特殊,里面存放的是当前脚本的名称;而在需要传递的参数超过10的时候,需要使用 “{}” (例如: ${11}, ${12} …)。

    演示实例:

    #! /bin/bash echo "\$0 = $0" echo "\$1 = $1" echo "\$2 = $2" echo "\$3 = $3" echo "\$4 = $4"

    结果输出:

    2.4.4、BASH 引导规则

    格式:

    双引号 —— 阻止shell对大多数的特殊字符进行解释(例如:#);但是 ‘ $ ’、‘ ` ’、 ‘ " ’、仍然保持其特殊含义。单引号 —— 阻止 shell 对所有的字符进行解释。到引号 —— ‘ ` ’这个符号通常位于 Esc 键的下方;当用改符号括起一个shell命令时,这个命令会被执行,执行后的输出结果作为这个表达式的值。改符号内的特殊字符一般都会被解释的

    演示实例:

    #! /bin/bash value="good" # 双引号会对 $ 进行解释 echo "today is $value" # 单引号不会对 $ 进行解释 echo 'today is $value' # 倒引号 会对其中的 shell 命令进行解释 echo "current path is `pwd`"

    结果输出:

    2.4.5、运算符

    shell脚本中的运算符合其他语言的差不多,接下来以表格的形式进行介绍。

    运算符含义+, -单目正,单目富!, ~逻辑非,按位取反*, /, %乘,除,取余+,-加, 减<< , >>按位左移, 按位右移<=, >=, <, >小于等于,大于等于,小于,大于==, !=等于, 不等于&按位与^按位异或|按位或&&逻辑与||逻辑或=, +=, -+, *=, /=, %=, &=, |=, <<=, >>=赋值,运算并赋值

    注意事项:

    shell编程中,表示相等时, “==” 和 “=” 在大部分情况下不存在差异,这和其他编程语言是由差异的。

    2.5、表达式求值

      在shell编程中,表达式求值一般使用 “$[]” 实现;如果想实现按照某种进制参数运算,可以在中括号中添加 base#n(表示n是按照base进制显示的,例如 $[16#20] 表示20是按照16进制显示的。)。   其中expr的功能增加的强大,这个命令可以使用在更加复杂的算式中,使用起来也更加的灵活;该命令在计算表达式后,会直接把结果输出。   如果我们仅仅是用来计算整数类型的算式,还可以使用let指令。

    格式:   $[num1 + num2] 或者 $[10#20 + num2]

      expr 1 + 2 : 计算并输出 1 + 2 的值。

      let sum = num1+num2

    演示实例:

    #! /bin/bash num1=10 num2=22 echo $[$num1+ $num2] echo $[16#10 + $num2] echo $[8#10 + $num2] expr 1 + 2 sum=0 let sum=$num1+$num2 echo "sum = $sum"

    注意事项:

    在linux7.0版本中演示时发现按进制参数运算时,base#n 中的 n 必须是个常数,否则会报错。在使用expr时,数字,运算符之间必须要有空格,否则系统会默认为字符串。

    结果输出:

    2.6、脚本编程语法

    2.6.1、if 条件语句

    if命令用于判断条件是否成立,进而决定是否执行相关语句。该语法在编程中可以说是使用频率比较高的一个了。 格式:

    # 用法1 if [ 条件 ] then 执行体1 else 执行体2 fi # 用法2 if [ 条件1 ] then 执行体1 elif [ 条件2 ] then 执行体2 elif [ 条件3 ] then 执行体3 else 执行体4 fi

    注意事项:

    在条件语句中, “[”、"]" 、条件语句三者之间都有有空格隔开;而且条件中运算符号与变量(常量)之间也要有空格,否则将会报错。

    演示实例:

    ################### 用例1################### #! /bin/bash if [ "1" = $1 ] then echo "current value is 1" else echo "current value is not 1" fi ################### 用例2 ################### #! /bin/bash if [ "1" = $1 ] then echo "current value is 1" elif [ "2" = $1 ] then echo "current value is 2" elif [ "3" = $1 ] then echo "current value is 4" else echo "current value is unknow." fi

    结果输出:

    2.6.2、case 多选语句

    shell中还有另外一种控制结构,那就是case,用于在一系列的模式中匹配某个变量的值。

    格式:

    case word in 类型1) 执行体1 ;; #结束符,类似于C语言中的 break 类型2) 执行体2 ;; 类型3) 执行体4 ;; ... *) # 匹配全部,类似于c语言中的 default 执行体5 ;; esac # case 单词反写

    演示实例:

    #! /bin/bash case "$1" in "1") echo "current input value is 1" ;; "2") echo "current input value is 2" ;; "3") echo "current input value is 3" ;; *) echo "current input others value..." ;; esac

    注意事项:

    在linux中,case没有默认执行体,执行完条件体后就会推出,如果想设置一个默认执行体,可以使用 “*)”做条件,但是之能放在最后一个位置。

    结果输出:

    2.7、循环结构

      循环结构用于反复执行某一段语句,这也是程序设计中比较中要的一个语法之一。在 shell中常用的循环结构有 whileuntilfor三种。

    2.7.1、while 循环

    while语句重复执行指令;遇到条件为真(值为0),则执行循环体;而如果遇到条件为假(值非0),退出循环。

    格式:

    while 执行条件 do 循环体 done

    演示实例:

    #! /bin/bash sum=0 number=1 while test $number -le 100 do sum=$[ $sum + $number ] let number=$number+1 done echo "1+2+3+4+...+100 = $sum";

    注意事项:

    结果输出:

    2.7.2、until 循环

    untilwhile的另一种写法,但是执行条件与while相反。until是遇到条件为假(值非0),则执行循环体(即执行循环体直到条件为真【值为0】)。

    格式:

    until 执行条件 do 循环体 done

    演示实例:

    #! /bin/bash sum=0 number=1 until ! test $number -le 100 do sum=$[ $sum + $number ] let number=$number+1 done echo "1+2+3+4+...+100 = $sum";

    注意事项:

    while test $number -le 100 和 until ! test $number -le 100 是等价的。

    结果输出:

    2.7.3、for 循环

      与前两中循环相比较,for的优点在于可以从集合中逐一遍历集合的值。

    格式:

    for value [ in list ] do 循环体 done

    演示实例:

    #! /bin/bash for i in 1 2 3 4 5 6 7 8 do echo "print --- $i" done

    结果输出:

    2.8、exit 命令

    exit 用于强制退出一个脚本,并且向调用这个脚本的进程返回一个整数值。

    格式:   exit num

    注意事项:

    在一个进程成功运行之后,总是向其父进程返回数值 0 ;而其他非 0 的返回值都表示发生了异常

    演示实例:

    #! /bin/bash read num1 num2 echo "current input value is $num1 - $num2" exit 0
    Processed: 0.013, SQL: 8