Liunx Shell基础题十道

Liunx Shell基础题十道


一、使用多种方式实现 num1 + num2

1)、使用 $(())

运行文件时传入 num1 与 num2 数值,并在程序内部实现相加并打印

#!/bin/bash
sum=$(($1+$2))
echo $sum

2)、使用 $[]

运行文件时传入 num1 与 num2 数值,并在程序内部实现相加并打印

#!/bin/bash
sum=$[$1+$2]
echo $sum

3)、使用 let 数值运算命令

let 数值符号可以直接进行计算,且不带返回,其语法格式 let 结果=数值1+数值2

#!/bin/bash
let sum=$1+$2
echo $sum

4)、使用 expr 数值运算命令

expr 命令即可以用于整数运算,也可以用于相关字符串长度、匹配等运算处理,会将计算后的结果返回,语法格式 结果=expr 数值1+数值2

#!/bin/bash
sum=`expr $1 + $2`
echo $sum

使用expr 命令时,需要注意运算符及用于计算的数字两边必须有空格,否则会执行失败

5)、使用 awk 文本处理工具

awk 用于在 Liunx/UNIX 下处理文本和数据,数据可以来自标准输入、一个或多个文件,或其他命令的输出

#!/bin/bash
echo $1 $2 | awk '{sum=$1+$2} END {print "Sum = ", sum}'

二、 字符串变量判断

符号含义
-z判断字符串长度是否为0
-n判断字符串长度是否为非0
!=判断两个字符串是否不相等
=判断两个字符串是否相等

1)、判断变量是否为空

#!/bin/bash
variable1=""
variable2="内容"
if [ -z "$variable1" ];then
    echo "变量1为空"
else
    echo "变量1不为空"
fi

if [ -z "$variable2" ];then
    echo "变量2为空"
else
    echo "变量2不为空"
fi

2)、判断变量是否不为空

#!/bin/bash
variable1=''
variable2='内容'
if [ -n "$variable1" ];then
    echo "变量1不为空"
else
    echo "变量1为空"
fi

if [ -n "$variable2" ];then
    echo "变量2不为空"
else
    echo "变量2为空"
fi

3)、判断两个字符串是否相等

相等情况

#!/bin/bash
name1="张三"
name2="张三"

if [ "$name1" = "$name2" ];then
    echo "名称相等"
else
    echo "名称不相等"
fi

不相等情况

#!/bin/bash
name1="张三"
name2="罗翔"

if [ "$name1" = "$name2" ];then
    echo "名称相等"
else
    echo "名称不相等"
fi

4)、判断两个字符串是否不相等

相等情况

#!/bin/bash
name1="张三"
name2="张三"

if [ "$name1" != "$name2" ];then
    echo "名称不相等"
else
    echo "名称相等"
fi

不相等情况

#!/bin/bash
name1="张三"
name2="罗翔"

if [ "$name1" != "$name2" ];then
    echo "名称不相等"
else
    echo "名称相等"
fi

三、统计男女生性别人数 「注意」

给定一个 sex.txt 文件,每一行第一个内容为姓名,第二个内容为性别,以空格分隔,格式如下:
在这里插入图片描述
1)、理想情况下

所谓理想情况下,是指 sex.txt 这个文件里,没有多余的空格以及换行,能够对txt内容直接进行处理,但如果出现了换行以及空格,那么此程序将不能运行,会出现错误

原理:👇

  1. 在看代码之前,先来讲一下原理,程序的逻辑很简单,先通过 while read 循环将 txt 文本数据读入存储到关联数组里,以姓名为 键Key,性别为 值Value
  2. 先定义两个普通数组,分别存储各自 malefemale 的姓名
  3. 循环步骤一的关联数组的索引 ${!arr[*]},并通过索引访问各自的 value 值,使用 case 语句判断 value值内容,再分别以 姓名(key) 添加进 步骤二 定义的两个普通数组里
  4. 打印数组内容#{arr[@]},以及数组长度${#arr[@]}

代码:

#!/bin/bash

declare -A sexs
while read line
do
    name=`echo $line | awk '{print $1}'`
    sex=`echo $line | awk '{print $2}'`
    sexs[$name]=$sex
done < sex.txt

declare -a male
declare -a female

# ${sexs[@]}  是访问数组所有值   values
# ${!sexs[@]} 是访问数值所有索引 keys
for i in ${!sexs[@]}
do
    case ${sexs[$i]} in
    "m")
        male[${#male[*]}]=$i
        ;;
    "f")
        female[${#female[*]}]=$i
        ;;
    esac
done

echo "M: ${male[@]}, 共${#male[@]}人"
echo "F: ${female[@]}, 共${#female[@]}人"

2)、处理开头结尾空白字符

原理:👇

上面讲了如果存在多余的空格以及换行,程序将会报错,那将代码进行改进,把每行开头与结尾的空白字符进行处理,替换成空,这需要使用到 sed 流编辑器,再通过判断不为空的情况下添加数据即可,其余部分与之前一样

代码:

#!/bin/bash

declare -A sexs
while read line
do
    # 删除开头空格
    line=`echo $line | sed 's/^[ \t\n]*//g'`
    # 删除结尾空格
    line=`echo $line | sed 's/[ \t\n]*$//g'`
    # 判断是否为非空
    if [ -n "$line" ];then
        name=`echo $line | awk '{print $1}'`
        sex=`echo $line | awk '{print $2}'`
        sexs[$name]=$sex
    fi
done < sex.txt

declare -a male
declare -a female

# ${sexs[@]}  是访问数组所有值   values
# ${!sexs[@]} 是访问数值所有索引 keys
for i in ${!sexs[@]}
do
    case ${sexs[$i]} in
    "m")
        male[${#male[*]}]=$i
        ;;
    "f")
        female[${#female[*]}]=$i
        ;;
    esac
done

echo "M: ${male[@]}, 共${#male[@]}人"
echo "F: ${female[@]}, 共${#female[@]}人"

四、输出等腰三角形 「注意」

首先先想两个问题:👇

  • 最大行和最小行 星星数各应该是多少

    先来看最小行,也就是第一行,很明显,因为是第一行所以星星的数量理所当然的为 1

    知道最小行后,我们不断往下递增行数,会发现每一行的行数就是星星的数量,那么最后一行的星星数 就应该为 最长的行数数量

  • 怎么才能输出等腰

    在想这个问题之前,我们先来看一下成品代码的输出结果图。图片中红框框圈起来的地方,那些空白是什么?难道是凭空产生的空白吗?,答案肯定是否的,这些空白是代码输出的空格,它的最主要作用就是将 * 号往中间挤,从而实现等腰三角形
    在这里插入图片描述

代码:

#!/bin/bash

read -p "请输入等腰三角形的行数: " lines

for i in `seq 1 $lines`
do
    # 输出空白字符   
    for n in `seq 1 $[$lines-$i]`
    do
        echo -n " "
    done
    # 输出 “* ” 内容  
    for d in `seq 1 $i`
    do
        echo -n "* "
    done
    # 换行
    echo 
done

五、判断奇偶数

题目比较简单,这里就不过多讲解了,重点是只有当是偶数时与 2 求余会为 0

#!/bin/bash

read -p "请输入一个整数(判断奇偶):" num
if [ `expr $num % 2` -eq 0 ];then
    echo "${num}为偶数"
else
    echo "${num}为奇数"
fi

如果想做升级,比如判断是非为整数,那就需要使用到正则

#!/bin/bash
while true
do
    read -p "请输入一个整数(判断奇偶):" num
    if [[ ! $num =~ ^[0-9]+$ ]];then
        continue
    fi
    if [ `expr $num % 2` -eq 0 ];then
        echo "${num}为偶数"
    else
        echo "${num}为奇数"
    fi
    break
done

六、判断是否质数

判断某个数是否为质数

原理:👇

原理其实很简单,先通过read 命令获取用户输入数值,通过正则判断用户输入是否为整数,如果不为整数则通过外层 while 循环再次调用 read 命令,直至输入正确,再通过循环 2-用户输入值 数值区间,不断将循环中与 用户输入值进行求余数,如果结果为0,即不为质数,循环结束则为质数

代码:

#!/bin/bash
while true
do
    read -p "请输入一个数:" num
    let n=num-1
    if [[ "$num" =~ ^[0-9]+$ ]];then
        for i in `seq 2 $n`
        do
            # 如果是偶数, 取余时为0
            if [ `expr $num % $i` -eq 0 ];then
                echo "$num 不是质数"
                exit
            fi
        done
        echo "$num 是质数"
        break
    else
        echo "请输入整数"
    fi
done

七、函数封装加分运算 「注意」

这个问题,就是 一、使用多种方式实现 num1 + num2 的升级版,只需要多加一个函数即可
因为 return 只能返回 0-255 之间的范围值,所以使用 echo 变量的方式返回值

1)、新建函数方法一

#!/bin/bash
function add {
    echo `expr $1 + $2`
    # echo $[$1+$2]
}
sum=`add 333 333`
echo $sum

2)、新建函数方法二

#!/bin/bash
add() {
    echo `expr $1 + $2`
    # echo $[$1+$2]
}
sum=`add 333 333`
echo $sum

在调用函数时一定记得加上反引号 `


八、case 语句的多重判断 「注意」

主要考察对case 语法的熟悉程度,代码本身并不难

原理:👇

  1. 最外层设置一个 while true 的死循环,以供不断输入
  2. 使用echo命令打印提示,并且调用 read 命令供用户输入
  3. 对输入的结果使用 case 语句进行判断,如果都不是目标值则直接退出
  4. 如果用户使用了 2 方法,则再调用 read 命令供用户输入,并且将输入结果去空白字符化(使用到 sed 流编辑器),再使用 case 语句各自判断

代码:

#!/bin/bash
while true
do
    echo "===============================
1. 显示当前登录的用户          |
2. 输入命令, 并显示命令帮助    |
键入 <ctrl+c> 结束             |
==============================="
    read -p "请输入选项:" enter
    case $enter in
    1)
        who
        ;;
    2)
        read -p "请输入需要显示帮助的命令" command
        command=`echo $command | sed 's/[ \t\n]*//g'`    # 对空白字符进行删除
        # echo ${#command}                                 # 打印处理后字符长度
        if [ -n "$command" ];then
            man $command
        else
            echo "不能输入空命令"
        fi
        ;;
    *)
        exit
    esac
done

九、批量新增用户 「注意」

使用 while read line 循环读取文件

#!/bin/bash
while read line
do
    user=`echo $line | awk '{print $1}'`
    pass=`echo $line | awk '{print $2}'`
    if [ -n $user ] && [ -n $pass ];then   # 判断用户名以及密码是否非空
        id $user &>/dev/null
        if [ $? -eq 0 ];then
            echo "该用户已存在"
        else
            useradd $user
            echo $pass | passwd -stdin $user &>/dev/null
            if [ $? -eq 0 ];then
                echo "$user 已创建"
            fi
        fi
    fi
done < user.txt
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值