Shell编程 算数和字符串运算(Ubuntu)

  • Post author:
  • Post category:其他



目录


前序:shell中的输入和输出


1.输入


2.输出 —–> echo


1.shell中的算数运算


1.(()) 进行算数运算


2.$[]


3.let


expr


字符串的运算


if语句


case in


While


for


select in


shell 函数


前序:shell中的输入和输出

1.输入

read var

read var1 var2        两个值之间用空格或者tab键

不能用回车

read -p “提示字符串” var

read -t 秒 var                  多少秒后如果没有输入就结束

read -n num var                  输入num个字符后结束输入

read -s var 输入的内容不回显 类似于输入密码

2.输出 —–> echo

1.shell中的算数运算

shell进行算数运算效率不如C语言高

shell兼容C语言的所有算数运算,同时进行了扩展

**(幂运算)      *(通配符)    \*(乘法)      ()(数组)           \(\)括号


某些运算符需要进行转义才能使用

shell中所有变量都是字符串,所以要进行转换

1>(())

2>$ []

3>let

4>expr

1.(()) 进行算数运算

格式:((表达式1,表达式2,表达式3 ……))




最后一个表达式的结果是输出的结果

获取输出的结果

var=$((表达式1,表达式2,表达式3 ……))

注:

1>括号中表达式使用变量时,$可加可不加,建议加

2>运算符的前后的空格     可加可不加



3>括号内可以写C语言的任何运算,甚至更复杂的运算

2.$[]

1>格式:ret=[表达式1,表达式2,………]

最后一个表达式的结果作为整个表达式的结果

2>$[]进行运算时,必须有一个变量来接收其返回值

3>在运算符内使用变量时,$可加可不加

4>运算符前后的空格     可加可不加

3.let

1>格式:let sum=var1运算符var2

2>let必须放到最前边

3>运算符两边

不可以

有空格

4>使用变量时,$可加可不加

expr

1>格式

expr     表达式

2>使用变量时,必须加$

3>运算符的前后必须加空格expr $var1 + $var2


expr   是一个     命令

$var1  +  $var2   是命令的3个参数

4>expr不能进行自增自减的运算

expr  $var1++         #Error

expr     $var1   +   1       #OK

5>expr使用部分运算符必须进行转义

\*        \>        \<              \(\)        …..

需要转义的运算符也可以加单引号”

6>expr中使用变量时,最好使用双引号将变量括起来

expr          $var1″   运算符    “$var2”

7>如何将expr的结果赋值给一个变量

ret=`expr    “$var1”   运算符   “$var2”  `

8>算数运算符

$arg1   \>   $arg2成立返回1,不成立返回0

$arg1   \<   $arg2

$arg1   \>=   $arg2

$arg1   \<=   $arg2

$arg1   !=   $arg2

$arg1   =   $arg2

$arg1    +|-|\*|/|%    $arg2

以上运算符使用变量时可以不加双引号

“$arg1”   \|    “$arg2”   只要两个变量有一个不为空或者非0,就会返回arg1的值,否则返回0

“$arg1”    \&    “$arg2″只有两个变量都为真(变量不为空或者0),才会返回arg1的值,否则返回0

进行|和&运算时,使用变量时必须使用双引号。

字符串的运算

expr match STRING REGEXP

从STRING字符串中第一个字符开始匹配REGEXP字符串,匹配成功返回匹配的字符的个数,失败返回0

expr substr STRING POS LENGTH:从STRING字符串中第POS位置开始截取,截取的长度为LENGTH,将截取的字符串返回,

(注:字符串的第一个字符从1开始)

expr index STRING CHARS:查找CHARS字符在STRING字符串出现的位置,返回值是字符串的下边(注:字符串的第一个字符从1开始)如果一个字符串中有多个相同字符,

匹配到第一个就会结束

expr length STRING:计算STRING字符串的长度

${#str}—》计算字符串的长度

if语句

1.格式

if [ 表达式 ]                          写到一行:        if [ 表达式 ]   ; then

then

语句

elif [ 表达式 ]                         写到一行:        elif [ 表达式 ]   ; then

then

语句

else

语句

fi

[]       本质是 调用test命令,man test     里边的变量或参数要用变量隔开

if [ 表达式 ]          <====>            if test 表达式

(1)字符串对象(⼀定要注意在进⾏字符串的判断的时候都需要加上“”,“$a” “hello”)

-z 判断字符串是否为空

-n 判断字符串是否为⾮空

=或== 都是⽤来判读字符串是否相等

!= 不等于

\> ⼤于 (防⽌误认为重定向)

\< ⼩于

​ (2)数字对象

-eq : 等于

-ne : 不等于

-gt : ⼤于

-lt : ⼩于

-ge : ⼤于等于

-le : ⼩于等于 ​

(3)⽂件属性

-b filename 判断⽂件是否存在,是否是块设备

-c filename 判断⽂件是否存在,是否是字符设备

-d filename 判断⽂件是否存在,是否是⽬录

-f filename 判断⽂件是否存在,是否是普通⽂件

-p filename 判断⽂件是否存在,是否是管道⽂件

-L filename 判断⽂件是否存在,是否是链接⽂件 (经测试链接⽂件也是普通⽂件)

-S filename 判断⽂件是否存在,是否是套接字⽂件

-e filename 判断⽂件是否存在

-s filename 判断⽂件是否存在,判断⽂件是否为空

(4)⽂件权限

-r filename 判断⽂件是否存在,是否有可读权限

-w filename 判断⽂件是否存在,是否有可写权限

-x filename 判断⽂件是否存在,是否有可执⾏权限

(5)⽂件⽐较

-nt ⽂件是否更新

-ot ⽂件是否更旧

-ef ⽂件的inode是否⼀致

[ filename1 -nt filename2 ]

(6)逻辑运算

-a 与 &&

-o 或 ||

! ⾮ !

case in

等价于C语言的switch case 语句

case $var in

表达式)

语句

;;                      <==============>      break

表达式)

语句

;;

*)                     <==============>      default

语句

;;

esac

表达式的形式:

[a-zA-Z]                  ====>a-z和A-Z 之间的所有字符


(通配一个)

[1-9]                       ====>数字1-9

*                             ====>所有

a|b|t|i                       ====>a b t i 任意一个字符

Y|y|Yes| yEs            ====>通配任意一个字符串

While

while [ 表达式 ]

do

语句

done

for


方式1:

for ((表达式1;表达式2;表达式3))

do

语句

done


方式2:

for var in 单词列表    单词列表每个以空格隔开的字符赋值给var,直到全部赋值

do

语句

done

select in

为了更好的提高代码的交互性

select var in 选项列表

do

语句

done

常和case连用

shell 函数

1.shell中函数的语法格式

function 函数名(){

函数体

}

注:

1> shell中的函数使用function进行修饰,function可写可不写,建议写

2> shell中的函数没有返回类型,如果接收shell函数的返回值呢?

2.1> shell中定义的变量默认就是全局的变量,可以直接使用

2.2>如果shell中的变量使用local定义为局部的变量

可以使用return进行返回,return返回只能返回0-255之间的数。接收返回值使用$?

$?可以获取上一条指令的执行结果

2.3>在函数中可以使用echo命令输出函数的返回值

接收函数的返回值时,使用命令置换符“,获取函数的返回结果。

3>函数的形参

shell的函数不需要形参列表,但是可以给函数传递实参

在shell函数内如何获取给shell函数传递的实参值呢?使用位置变量

4> shell中的函数依然要向c中的函数遵循先声明定义,后使用的原则

但是shell中的函数都是声明和定义写到一起

及she17中的函数的定义应该写到函数调用的前边

5. shell中的函数的调用

函数名       实参列表

#!/bin/bash

function arr_sum(){
    local sum=0
    for p in $*
    do
        ((sum=sum+$p))
    done
    echo $sum
}

read -p "请输入一个数组:>"  -a  arr   #-a是输入一个数组的参数
value=`arr_sum ${arr[*]}`
echo $value



版权声明:本文为weixin_44074730原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。