Bash Shell 中 常见的面试题:(理论基础 及 脚本编写)

文章目录

      • 理论基础篇:
        • ①、如何向脚本内传递参数!
        • ②、[ ] 和 [[ ]] 的区别! 以及 整数运算符 使用什么?
        • ③、() 和 { } 的共同点 及 区别:
        • ④、列举几个 环境变量,并且 说出他们的作用:
        • ⑤、关于 变量 的命令:
        • ⑥、关于 语法结构 的:
        • ⑦、写一个 shell 函数:
        • ⑧、求 10 + 10 的和:
        • ⑨、' 和 " 的区别:
        • ⑩、 判断 目录 或 文件 、字符串 :
      • 写脚本篇:
        • ①、输出 1 -100 所有数、奇数、偶数,并且求和:
        • ②、打印 正三角、倒三角:
        • ③、打印 等腰三角形:
        • ④、打印 九九乘法表:


 

        此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:


理论基础篇:

 

①、如何向脚本内传递参数!

不要看见这个问题就感觉懵,就不知道是啥意思!换句话说就是: 如何在脚本内调用外部的参数!

答:使用位置变量 : $1$2...$n

 

②、[ ] 和 [[ ]] 的区别! 以及 整数运算符 使用什么?

[ ] : bash 的内部命令!与 test 命令是等同的!

[[ ]] :是 bash 程序语言的关键字;并不是一个命令!

证明如下:

root@zhengzelin:~\# type [ 
[ is a shell builtin
root@zhengzelin:~\# type [[ 
[[ is a shell keyword

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

区别: [ ] 逻辑测试使用: -a(双方都为 true,结果才为 true) 
                       -o(一方为 true,结果就为 true)
                       
      [[ ]] 逻辑测试使用: && (双方都为 true,结果才为 true)
                        || (一个为 true,结果就为 true)
                        
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

整数运算符:[ ]  [[ ]] 都使用相同的:

-eq : 等于
-ne : 不等于

-lt : 小于
-le : 小于等于

-gt : 大于
-ge : 大于等于

注意: [ ] 中使用 <> 的时候,必须使用转义字符: \< 或 \> ,因为 [ 是一个内部命令! 
< : 标准输入
> : 标准重定向输出(覆盖原内容)

而 [[ ]] 却不需要!

 

③、() 和 { } 的共同点 及 区别:

共同点: 两个括号都可以用做 : 命令组


区别:
1、() 会开一个 子shell进程 来执行() 内的命令!而 { } 在当前shell进程执行其中命令!

2、() 内的命令中间使用";"隔开,末尾不需要";"  并且 () 与 cmd 之间不需要 空格隔开! 

   eg: (cmd1;cmd2)    { cmd1;cmd2;}    # 看开头的空格
   
   {} 中 命令之间使用 ";" 隔开,结尾需要;
  
如果你的命令组中 有 exit 命令,你使用 exit 是想退出脚本,建议您使用 { },因为你使用 () 只会退出 () 开启的那个 子shell !

 

④、列举几个 环境变量,并且 说出他们的作用:

$PATH :  命令路径

$Shell: 当前 shell 类型

$SHLVL : 当前 shell 嵌套层次!(就是有几个shell进程)

$USER: 当前用户

$HOME : 当前用户的家目录

$? : 查看上一条命令是否执行成功(0为成功,非0为失败)

$HISTSIZE : 历史命令条数

$LANG : 当前系统语言

$PS1 : 登录系统时候的提示符!

 

⑤、关于 变量 的命令:

赋值: 1、局部变量赋值: varname=值;  
      2、全局变量赋值: export varname=值 或 declare x varname=值
      3、只读变量赋值: readonly varname=值 或 declare i varname=值
      

查看变量:  set : 查看所有已定义的变量
          exportenvdeclare -x 查看 所有环境变量!
          readonly -p 查看只读变量!

删除变量: unset varname  删除变量!
          只读变量无法删除,重启消失!

清空位置变量: set--  清空 set-- 后面所有的位置变量

左移位置变量: shift 

 

⑥、关于 语法结构 的:

if  条件表达式;then
   cmd 
elif 条件表达式;then
    cmd
else  
    cmd
fi

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

for varname in 取值列表
do
  cmd(循环体)
done


for((表达式1;表达式2;表达式3;))
do
  cmd(循环体)
done


嵌套:

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

   for((表达式1;表达式2;表达式3;))
   do
    cmd(循环体)
   done
   
 cmd(循环体)
done

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

while  表达式
do
 cmd (循环体)
done

嵌套: 与上面的 for 一样!

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

until 表达式
do
 cmd(循环体)
done

# until 是当 表达式为假时,开始执行循环体,当表达式为 true 时,停止执行。刚好与 while 相反!

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

case varname in 
   条件1)
   cmd1...
   ;;
   条件2)
   cmd2...
   ;;
   条件3)
   cmd3...
   ;;
   *)          # *表示上面的条件没有符合的时候,执行这个;类似于 if 中的 else ;* 可以不写
   cmd4.. 
   ;;
esac

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

select varname in 表达式
do 
    cmd..
done

 

⑦、写一个 shell 函数:

方法1:

function functionname {
  cmd
}

functionname  # 调用函数

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

方法2:

functionname() {
  cmd...
}

functionname  # 调用函数

 

⑧、求 10 + 10 的和:

方法1:
root@zhengzelin:~# a=10;b=10
root@zhengzelin:~# let c=a+b
root@zhengzelin:~# echo $c
20


方法2:
root@zhengzelin:~# a=10;b=10
root@zhengzelin:~# c=$(expr $a + $b )
root@zhengzelin:~# echo $c
20

 

⑨、’ 和 " 的区别:

root@zhengzelin:~# a=10
root@zhengzelin:~# echo "$a"
10
root@zhengzelin:~# echo '$a'
$a

'' 相当于转义, "" 将变量变成它的值

 

⑩、 判断 目录 或 文件 、字符串 :

-d : 判断 是否为目录(目录 是否存在)
-f : 判断 是否为 普通文件(普通文件 是否存在)
-b : 判断 是否为 块设备文件 (块设备文件 是否存在)
-c : 判断 是否为 字符设备文件 (字符设备文件 是否存在)
-l : 判断 是否为 软链接文件 (软链接文件 是否存在)

-z : 判断 是否为 空字符串
-n : 判断 是否为 非空字符串
! -z : 判断 是否为 非空字符串

 


 

写脚本篇:

 

①、输出 1 -100 所有数、奇数、偶数,并且求和:

输出 1 -100 中的所有数:

输出1 - 100:

使用 forfor i in $(seq 1 100);do echo $i;done  

for((i=1;i<=100;i++));do echo $i;done 


使用 while :
a=1;while [ $a -le 100 ];do echo $a;let a++;done

a=1;while true;do echo $a;let a++;if [[ $a -gt 100 ]];then break;fi;done

a=1;while :;do echo $a;let a++;if [[ $a -gt 100 ]];then break;fi;done
# true 和 : 都是内部命令,执行都为true,你可以使用 type true 来查看命令类型,然后执行 true | echo $?


使用 until :
a=1;until [ $a -gt 100 ];do echo $a;let a++;done:

输出 1 - 100 中的 奇偶数:

for 列表格式:

奇数:for i in `seq 1 100`;do let a=$i%2;if [[ $a -eq 0 ]];then continue;fi;echo $i;done

偶数:for i in `seq 1 100`;do let a=$i%2;if [[ $a -eq 1 ]];then continue;fi;echo $i;done

# 解释: 当 i = 3 的时候,a=3%2, a=1,这为奇数,当 1 = 1 时(if条件判断句) 跳出此次循环(不输出奇数),所以就为 打印 偶数!

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

for 类C风格:

奇数: for((i=1;i<=100;i+=2));do echo $i;done

偶数: for((i=0;i<=100;i+=2));do echo $i;done

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

求和:

1-100 :

a=0;for i in $(seq 1 100);do let a=$a+$i;done;echo $a
a=0;for((i=1;i<=100;i++));do let a=$a+$i;done;echo $a
a=0;b=1;while [ $b -le 100 ];do let a=$a+$b;let b++;done;echo $a
a=0;b=1;until [ $b -gt 100 ];do let a=$a+$b;let b++;done;echo $a

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

奇数和:

b=0;for i in `seq 1 100`;do let a=$i%2;if [[ $a -eq 0 ]];then continue;fi;let b=$i+$b;done;echo $b
a=0;for((i=1;i<=100;i+=2));do let a=a+i;done;echo $a
a=0;for i in {1..100..2};do let a=$a+$i;done;echo $a

a=0;b=1;while [ $b -le 100 ];do let a=a+b;let b+=2;done;echo $a


——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————


偶数和:

b=0;for i in `seq 1 100`;do let a=$i%2;if [[ ! $a -eq 0 ]];then continue;fi;let b=$i+$b;done;echo $b
a=0;for((i=0;i<=100;i+=2));do let a=a+i;done;echo $a
a=0;for i in {0..100..2};do let a=$a+$i;done;echo $a

a=0;b=0;while [ $b -le 100 ];do let a=a+b;let b+=2;done;echo $a

 

②、打印 正三角、倒三角:

root@zhengzelin:~# for((i=1;i<=5;i++));do for((a=1;a<=$i;a++));do echo -n "*";done;echo;done
*
**
***
****
*****

root@zhengzelin:~# for((i=5;i>=1;i--));do for((a=$i;a>=1;a--));do echo -n "*";done;echo;done
*****
****
***
**
*

 

③、打印 等腰三角形:

for((i=1;i<=$1;i++))
do

  let a1=$1-$i
  for((a=1;a<=$a1;a++))
  do
  echo -n " "
  done 


  let b1=2*$i-1
  for((b=1;b<=$b1;b++))
  do 
  echo -n "*"
  done
 echo
 done

root@zhengzelin:~# ./while1.sh 5
    *
   ***
  *****
 *******
*********

root@zhengzelin:~# ./while1.sh 6
     *
    ***
   *****
  *******
 *********
***********


 

④、打印 九九乘法表:

root@zhengzelin:~# for((i=1;i<=9;i++));do for((a=1;a<=$i;a++));do let c=$a*$i;echo -n "$a*$i=$c ";done;echo;done
1*1=1 
1*2=2 2*2=4 
1*3=3 2*3=6 3*3=9 
1*4=4 2*4=8 3*4=12 4*4=16 
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 

你可能感兴趣的:(shell)