Liunx Shell基础题十道
Posted XianZhe_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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内容直接进行处理,但如果出现了换行以及空格,那么此程序将不能运行,会出现错误
原理:👇
- 在看代码之前,先来讲一下原理,程序的逻辑很简单,先通过
while read
循环将 txt 文本数据读入存储到关联数组里,以姓名为 键Key,性别为 值Value - 先定义两个普通数组,分别存储各自
male
与female
的姓名 - 循环步骤一的关联数组的索引
${!arr[*]}
,并通过索引访问各自的 value 值,使用case
语句判断 value值内容,再分别以 姓名(key) 添加进 步骤二 定义的两个普通数组里 - 打印数组内容
#{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
语法的熟悉程度,代码本身并不难
原理:👇
- 最外层设置一个
while true
的死循环,以供不断输入 - 使用
echo
命令打印提示,并且调用read
命令供用户输入 - 对输入的结果使用
case
语句进行判断,如果都不是目标值则直接退出 - 如果用户使用了
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
九、批量新增用户 「注意」
在这里插入代码片
以上是关于Liunx Shell基础题十道的主要内容,如果未能解决你的问题,请参考以下文章