欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 05_04 _bash脚本编程之三 条件判断及算术运算 有大用

提示:"引用"一个命令的执行结果,要使用命令引用,比如 RESAULTS=`wc -l /etc/passwd | cut -d' ' -f1`;

使用一个命令的执行状态结果,要直接执行此命令,一定不能引用: 比如: if id user1 一句中的id命令就一定不能加反引号;

如果想把一个命令的执行结果赋值给某变量,要使用命令引用,比如 USERID=`id -u user1`;

如果想把一个命令的执行状态结果保存下来,并作为命令执行成功与否的判断条件,则需要先执行此命令,而后引用其状态结果,如

    id -u user1

    RETVAL=$?        (如果使用了 给状态 赋值的话,那么,就只能使用 if [ $RETVAL -eq 0 ]  不能使用 if $RETVAL )

    此句绝对不可以写为 RETVAL=`id -u user1`


练习:写一个脚本

判断当前系统上是否有用户的默认shell为bash:

    如果有,就显示有多少个这类用户,否则就显示没有这类用户:

grep "\<bash$" /etc/passwd &> /dev/null

RETVAL=$?

if [ $RETVAL -eq 0 ]; then


if grep "\<bash$" /etc/passwd &> /dev/null; then


练习:写一个脚本

给定一个文件,比如 /etc/inittab (我测试的是 ~/aaa.txt 它有7行空白行)

判断这个文件中是否有空白行:

如果有,则显示其空白行数,否则,显示没有空白行.


#!/bin/bash

AAA=~/aaa.txt

if grep "^$" $AAA &> /dev/null; then

  LINE=`grep "^$" $AAA |wc -l`

  echo $LINE

fi


练习:写一个脚本

给定一个用户,判断其UID与GID是否一样

如果一样,就显示此用户为"good guy":否则,就显示此用户为"bad guy"

#!/bin/bash 一定为脚本的第一行,#!/bin/bash 上面加个空白行都不行

#!/bin/bash 

USERNAME=user1   

USERID=`id -u $USERNAME`  #千成不能叫UID,它是系统的环境变量在用 可以用 export env printenv 看看哪些环境变量在用,千万在命名上不要重复

GROUPID=`id -g $USERNAME`  #千成不能叫GID,它是系统的环境变量在用

if [ $USERID -eq $GROUPID ]; then  #在引用变量名的时候才需要加个美元符$

    echo "Good guy."

else 

    echo "Bad guy"

fi



#!/bin/bash

USERNAME=root

USERID=`id -u $USERNAME`

GROUPID=`id -g $USERNAME`

if [ $USERID -eq $GROUPID ]; then

  echo "good guy"

else

  echo "bad guy"

fi


进一步要求: 不使用id命令获得其id号:

#!/bin/bash

USERNAME=root

USERID=`id -u $USERNAME`

GROUPID=`id -g $USERNAME`

if [ $USERID -eq $GROUPID ]; then

  echo  "good guy. $USERNAME id is $USERID"

else

  echo "bad guy. $USERNAME id is $USERID"

fi


练习:写一个脚本

给定一个用户,获取其密码警告期限:

而后判断用户密码剩余使用期限是否已经小于警告期限:

    提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限如果小于警告期限,则显示|"Warning";否则,就显示"OK"


#!/bin/bash

USERNAME=user17

RESULT=`grep "^$USERNAME\>" /etc/shadow | cut -d: -f3,5,6`

RESULT_MAKE_TIME_FROM_70=`echo $RESULT | cut -d: -f1`

let TODAY_TIME_FROM_70=`date +%s`/86400

let RESULT_USERD_TIME=TODAY_TIME_FROM_70-RESULT_MAKE_TIME_FROM_70

RESULT_EXPIRED_TIME=`echo $RESULT | cut -d: -f2`

RESULT_WARNING_TIME=`echo $RESULT | cut -d: -f3`

let RESULT_EXPIRED_USERD_DIFF_TIME=RESULT_EXPIRED_TIME-RESULT_USERD_TIME

if [ $RESULT_EXPIRED_USERD_DIFF_TIME -lt $RESULT_WARNING_TIME ]; then

  echo "warning"

else

  echo "ok"

fi


练习:写一个脚本

判定命令历史中历史命令的总条目是否大于1000,如果大于,则显示"some command will gone.".否则显示ok

#!/bin/bash

NUM=`history | tail -1 | cut -d' ' -f2`  

echo $NUM  #为什么在命令行执行有 多少条命令输出,但是放在bash里,这里确输出空

#if [ $NUM -gt 1000 ]; then

 # echo "some command gone!"

#else

 # echo "ok"

#fi



shell中如何进行算术运算  以1,2,3,种最为常见 计算

A=3

B=6

1,let 算术运算表达式  相加

    let C=$A+$B

2, $[算术运算表达式]

    C=$[$A+$B]

3, $((算术运算表达式))

    C=$(($A+$B))

4,expr 算术运算表达式,表达式中各操作数及操作符之间要有空格,而且要使用命令引用

    C=`expr $A + $B`

[root@skLinux rootCodeFiles]# expr 3 \* 5  要用 斜线和乘号      #相乘

否则 # expr 3 * 5 会报 expr 语法错误



shell 算术运算

在Shell中进行算术运算有多种方法,以下是几种常见的:

  1. expr 命令: 使用 expr 命令可以执行基本的整数算术运算。例如:

    Bash
    1result=$(expr 5 + 3)
    2echo $result  # 输出: 8

    注意:在 expr 中使用乘法时,因为星号 (*) 是通配符,所以需要转义:

    Bash
    1result=$(expr 4 \* 5)
  2. $(( )) 或 ${#} 结构: 这是Bash shell中的内置算术扩展,支持整数和一些简单的表达式计算:

    Bash
    1result=$(( 7 - 2 )) 2echo $result  # 输出: 5 3 4# 或者 5result=$[ 7 - 2 ] 6echo $result  # 输出: 5 ($[ ] 在较老的bash版本中可用,新版本推荐使用 $(( )))
  3. let 命令: 可以用 let 来执行算术运算,同样支持整数:

    Bash
    1let result=7-2
    2echo $result  # 输出: 5
  4. bc 命令: 如果你需要进行浮点数计算或更复杂的数学运算,可以使用 bc(Basic Calculator)命令:

    Bash
    1result=$(echo "scale=2; 5/3" | bc)
    2echo $result  # 输出: 1.67 (结果保留两位小数)
  5. 双括号 (( )) 内部运算: 在脚本中可以直接利用双括号进行复杂的逻辑判断和算术运算:

    Bash
    1(( result = 7 * 3 ))
    2echo $result  # 输出: 21

总的来说,在shell中做算术运算时,要根据实际需求选择合适的工具或语法,并注意不同方式对数据类型的支持。对于仅涉及整数且不复杂的场景,通常使用 $(( )) 更为方便快捷;若需处理浮点数,则首选 bc






练习:写一个脚本

判断当前系统上是否有用户的默认shell为bash:

    如果有,就显示其中一个的用户,否则就显示没有这类用户:



[root@ebs-22618 ~]# nano bash.sh

image.png


[root@ebs-22618 ~]# chmod +x bash.sh

[root@ebs-22618 ~]# ./bash.sh

image.png

[root@ebs-22618 ~]# nano bash.sh

image.png


#!/bin/bash

if grep "\<bash$" /etc/passwd &> /dev/null; then

  NUM=` grep "\<bash$" /etc/passwd | wc -l`

  echo "users count id $NUM"

else

 echo "No such user"

fi



[root@ebs-22618 ~]# nano bash.sh

[root@ebs-22618 ~]# ./bash.sh

image.png


[root@ebs-22618 ~]# cp bash.sh bash2.sh

[root@ebs-22618 ~]# nano bash2.sh

image.png

#!/bin/bash

if grep "\<bash$" /etc/passwd &> /dev/null; then

  FIRST=` grep "\<bash$" /etc/passwd | head -1 | cut -d: -f1`

  echo "first user id $FIRST"

else

 echo "No such user"

fi


[root@ebs-22618 ~]# ./bash2.sh

image.png


[root@ebs-22618 ~]# bc

image.png

[root@ebs-22618 ~]# date +%s

image.png


[root@ebs-22618 ~]# history

image.png

[root@ebs-22618 ~]# echo $HISTSIZE  命令大小是1000个

image.png

shell 退出后 此前的命令是保存在文件里面的 下次登录时,文件中存在的历史命令会被读进来

它保存在内存中的时候 是不会考虑此前从文件中读进来的这些 拿以前文件中的1000个加现在

的可能有1000个,总共有可能2000个 假如此时退出shell重新登录的话,可能只有1000个


[root@ebs-22618 ~]# A=3  这里是字符3 不是数字3

[root@ebs-22618 ~]# B=6   这里是字符6 不是数字6

[root@ebs-22618 ~]# C=$A+$B

[root@ebs-22618 ~]# echo $C

image.png


[root@ebs-22618 ~]# let C=$A+$B   let命令让其做算术运算

[root@ebs-22618 ~]# echo $C

image.png


[root@ebs-22618 ~]# help let

image.png


[root@ebs-22618 ~]# D=$[$A+$B]

[root@ebs-22618 ~]# echo $D

image.png


[root@ebs-22618 ~]# E=$(($A+$B))

[root@ebs-22618 ~]# echo $E

image.png


[root@ebs-22618 ~]# F=`expr $A + $B`

[root@ebs-22618 ~]# echo $F

image.png






[root@ebs-22618 ~]# date +%s

image.png


image.png














普通分类: