linux shell 学习之旅第二篇

309 阅读3分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。

一、运算符

1、基本语法

  • “$((运算式))”或“$[运算式]”
  • expr  + , - , \*,  /,  %    加,减,乘,除,取余
  • 注意:expr运算符间要有空格

2、案例实操

  • 计算3+2的值

    [root@localhost ~]# expr 2 + 3
    5
    
  • 计算3-2的值

    [root@localhost ~]# expr 3 - 2
    1
    
  • 计算(2+3)X 4的值

    • expr一步完成计算
    [root@localhost ~]# expr `expr 2 + 3` \* 4
    20
    
  • 采用$[运算式]方式

    [root@localhost ~]# S=$[(2+3)*4]
    [root@localhost ~]# echo $S
    20
    
  • 采用$((运算式))方式

    [root@localhost ~]# R=$(((2+3)*4))
    [root@localhost ~]# echo $R
    20
    

二、条件判断

1、基本语法

[ condition ](注意condition前后要有空格

注意:条件非空即为true,[ moe ]返回true,[] 返回false。

2、常用判断条件

  • 两个整数之间比较

    = 字符串比较

    -lt 小于(less than) -le 小于等于(less equal)

    -eq 等于(equal) -gt 大于(greater than)

    -ge 大于等于(greater equal) -ne 不等于(Not equal)

  • 按照文件权限进行判断

    -r 有读的权限(read) -w 有写的权限(write)

    -x 有执行的权限(execute)

  • 按照文件类型进行判断

    -f 文件存在并且是一个常规的文件(file)

    -e 文件存在(existence) -d 文件存在并是一个目录(directory)

3、案例实操

  • 23是否大于等于22

    [root@localhost ~]# [ 23 -ge 22 ]
    [root@localhost ~]# echo $?
    0
    
  • helloworld.sh是否具有写权限

    [root@localhost moe]# [ -w helloword.sh ]
    [root@localhost moe]# echo $?
    0
    
  • /root/moe/text.txt目录中的文件是否存在

    [root@localhost moe]# [ -e test.txt ]
    [root@localhost moe]# echo $?
    0
    
  • 多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)

    [root@localhost moe]# [ 1 -eq 1 ] && [ 1 = 1 ]
    [root@localhost moe]# echo $?
    0
    [root@localhost moe]# [ 1 -eq 1 ] && [ 1 = 2 ]
    [root@localhost moe]# echo $?
    1
    [root@localhost moe]# [ 1 -eq 1 ] || [ 1 = 2 ]
    [root@localhost moe]# echo $?
    0
    [root@localhost moe]# [ 1 -eq 2 ] || [ 1 = 1 ]
    [root@localhost moe]# echo $?
    0
    

三、流程控制

1、if 判断

1.1、基本语法

if [ 条件判断式 ];then

  程序

fi

或者

if [ 条件判断式 ]

  then

    程序

fi

注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if后要有空格

1.2、案例实操

输入一个数字,如果是1,则输出moe,如果是2,则输出zoe,如果是其它,什么也不输出。

[root@localhost moe]# vim if.sh 
[root@localhost moe]# cat if.sh 
#!/bin/bash

if [ $1 -eq 1 ]
then
	echo "moe"
elif [ $1 -eq 2 ]
then
	echo "zoe"
fi
[root@localhost moe]# bash if.sh 1
moe
[root@localhost moe]# bash if.sh 2
zoe
[root@localhost moe]# bash if.sh 3
[root@localhost moe]# 

2、case 语句

2.1、 基本语法

case $变量名 in

  "值1")

    如果变量的值等于值1,则执行程序1

    ;;

  "值2")

    如果变量的值等于值2,则执行程序2

    ;;

  …省略其他分支…

  *)

    如果变量的值都不是以上的值,则执行此程序

    ;;

esac

注意事项:

1) case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

2) 双分号“ **;;** ”表示命令序列结束,相当于java中的break。

3) 最后的“*)”表示默认模式,相当于java中的default。

2.2、案例实操

输入一个数字,如果是1,则输出moe,如果是2,则输出zoe,如果是其它,输出mzoe。

[root@localhost moe]# vim case.sh 
[root@localhost moe]# cat case.sh 
#!/bin/bash

case $1 in
1)
	echo "moe"
;;
2)
	echo "zoe"
;;
*)
	echo "mzoe"
;;
esac
[root@localhost moe]# sh case.sh 1
moe
[root@localhost moe]# sh case.sh 2
zoe
[root@localhost moe]# sh case.sh 3
mzoe
[root@localhost moe]#

3、for 循环

3.1、基本语法1

for (( 初始值;循环控制条件;变量变化 ))

  do

    程序

  done

3.2、案例实操1

从1加到100

[root@localhost moe]# vim for.sh 
[root@localhost moe]# cat for.sh 
#!/bin/bash
S=0
for ((i=0;i<=100;i++))
do
	S=$[$S+$i]
done

echo $S
[root@localhost moe]# chmod u+x for.sh 
[root@localhost moe]# ./for.sh 
5050

3.3、基本语法2

for 变量 in 值1 值2 值3…

  do

    程序

  done

3.4、案例实操2

  • 打印所有输入参数

    [root@localhost moe]# vim for2.sh
    [root@localhost moe]# cat for2.sh 
    #!/bin/bash
    
    for i in $*
            do
                    echo "moe love $i"
            done
    [root@localhost moe]# bash for2.sh zoe1 zoe2 zoe3
    moe love zoe1
    moe love zoe2
    moe love zoe3
    
  • 比较$*和$@区别

    • $*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数。
    [root@localhost moe]# vim for2.sh 
    [root@localhost moe]# cat for2.sh 
    #!/bin/bash
    
    for i in $*
            do
                    echo "moe love $i"
            done
    
    for j in $@
            do
                    echo "moe love $j"
            done
    [root@localhost moe]# sh for2.sh zoe1 zoe2 zoe3
    moe love zoe1
    moe love zoe2
    moe love zoe3
    moe love zoe1
    moe love zoe2
    moe love zoe3
    [root@localhost moe]#
    
    • 当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数。
    [root@localhost moe]# vim for3.sh 
    [root@localhost moe]# cat for3.sh 
    #!/bin/bash
    
    for i in "$*"
            do
                    echo "moe love $i"
            done
    
    for j in "$@"
            do
                    echo "moe love $j"
            done
    [root@localhost moe]# bash for3.sh zoe1 zoe2 zoe3
    moe love zoe1 zoe2 zoe3
    moe love zoe1
    moe love zoe2
    moe love zoe3
    

    $*中的所有参数看成是一个整体,所以这个for循环只会循环一次

    $@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次

4、while 循环

4.1、基本语法

while [ 条件判断式 ]

  do

    程序

  done

4.2、案例实操

从1加到100

[root@localhost moe]# vim while.sh
[root@localhost moe]# cat while.sh 
#!/bin/bash

s=0
i=1

while [ $i -le 100 ]
do
	s=$[$s+$i]
	i=$(($i+1))
done

echo $s
[root@localhost moe]# bash while.sh 
5050

四、总结

本篇介绍了shell中运算符语法、条件语法、常用的流程控制语法以及案例操作,是shell编程最基础的部分。

友情链接:linux shell 小白入门第一篇