shell基础+面试问题笔记

shell介绍

  1. 自动化可以通过两种方式来实现: 工具 和 脚本

  2. 常见的脚本有两种:shell脚本、其他脚本, 诸如python脚本等

  3. shell 是一个 命令解释器 , shell是位于应用程序和操作系统之间的有效命令翻译工具.

  4. shell分为两大类:

    1. 图形化的shell , 如我们常说的操作系统的桌面
    2. 命令行的shell
  5. 查看系统shell类型: echo $SHELL

  6. 查看当前系统环境支持的shell : cat /etc/shells

  7. shell手工执行的时候有一个重要的特点:
    逐行输入命令, 逐行解释执行

shell脚本的基础知识

  1. 概念
    常用编辑工具 vim vi
    命名: 见名知义
  2. 注释
    1. 单行注释:除了首行加#不是注释外, 其他在行首加#均表示此行是单行注释
    2. 多行注释
        :<<!
        ...  #这里表示注释掉的内容
        !
      
  3. 脚本执行
    注意: 要修改文件的可执行权限 chmod +x script-name.sh
    1. 强烈推荐的方式: 写完整的路径名:/bin/bash /path/script-name.sh
    2. 当前路径下执行脚本:path/to/script-name.sh 或 ./script-name.sh
    3. 点 执行:source script-name.sh 或 . script-name.sh
  4. 脚本开发规范
    1. 命名要见名知义, 脚本后缀是 .sh
    2. 脚本首行是且必须是#!/bin/bash
    3. 第二行开始一般先写脚本的描述信息:
      1. 脚本名称, 功能, 版本, 作者, 联系信息等
      2. 注释不推荐中文, 避免不同的操作系统出现中文乱码的问题
    4. 脚本的执行也是从上到下依次执行, 但是可以通过 &灵活的使其中 部分阻塞式的命令在后台执行
    5. 代码书写规范
      1. 成对内容一次写出防止遗漏, 比如 ()等
      2. [ ]中括号内部的 两端要有空格
      3. 内部流程控制语句一次性书写完, 再添加内容.
      4. 通过缩进提高代码的 可读性, 即该有空格的地方要有空格

语法

变量

  1. 变量 包含变量名 (不变的部分)和变量值 (可变的部分)

  2. 本地变量:在当前系统的某个环境下才能生效的变量, 作用范围小
    本地变量包含两种普通变量命令变量 (必须掌握)

    1. 普通变量 的定义方式(三种)

      1. 方式一: 变量名=变量值 变量值必须是一个整体,中间没有特殊字符
      2. 方式二:变量名='变量值'
      3. 方式三: 变量名="变量值"
      4. 习惯: 数字不加引号、原样输出使用单引号、其他默认加双引号
    2. 命令变量 定义有两种方式:
      1.方式一: 变量名=命令
      2.方式二: 变量名=$(命令)

  3. 全局变量:在当前系统所有环境都能生效得变量

    1. 查看全局变量: env 命令查看系统的所有环境变量
    2. 定义全局变量:export 变量名=变量值
  4. 变量查看和取消
    查看:"${变量名}"
    取消: unset 变量名

和脚本文件有关

符号 意义
$0 获取当前执行的shell脚本文件名,包括脚本路径
$n 获取当前执行的shell脚本的第n个参数值,n=1…9,如果n大于9就要用大 括号括起来${10}
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(0为成功 , 非0为失败)

字符串精确截取相关

格式: ${变量名:起始位置:截取长度}

  #示例代码:
  ${file:0:5}     从第1个字符开始,截取5个字符
  ${file::5}          从第1个字符开始,截取5个字符
  ${file:5:5}     从第6个字符开始,截取5个字符
  ${file:5}           从第6个字符开始,截取后面所有的字符
  ${file:0-5}     从倒数第5个字符开始,截取后面所有的字符
  ${file:0-6:3}       从倒数第6个字符开始,截取之后的3个字符

表达式

  1. 测试语句形式:[ 条件表达式 ] 条件成立, 状态返回值是0, 条件不成立, 状态返回值是1
    注意:[] 的内部两端与条件表达式之间至少有一个空格
  2. 条件表达式
    1. 逻辑表达式:&& 和 ||

    2. 文件表达式

      1. -f 判断输入内容是否是一个文件
         [ -f test.sh ] && echo "是一个文件"
         [ -f test.sh ] || echo "不是一个文件"
        
      2. -d 判断输入内容是否是一个目录
      3. -x 判断输入内容是否可行
    3. 数值操作符

        n1 -eq n2  相等
        n1 -gt n2  大于
        n1 -lt n2  小于
        n1 -ne n2  不等于
      
    4. 字符串比较 == 、!=

  3. 计算表达式
    $((计算表达式)) 注:$(())中只能用+-*/运算符,并且只能做整数运算
    let 计算表达式
    例子:
    i=0
    while [ $i -lt 5 ]
    do
    	echo $i
    	i=$((i+1))
    done
    echo $((100/5))
      ​
    j=10
    let j=j-1
    echo "j 的结果是: ${j}"
    

6.流程控制

  1. if - elif - else - fi
  if [ 条件1 ]
  then
      指令1
  elif [ 条件2 ]
  then
      指令2
  else
      指令3
  fi
  1. for循环语句
  forin 列表
  do
      执行语句
  done
  1. while 循环语句
  while 条件
  do
      执行语句
  done
  1. 条件的类型
    命令 、[[字符串表达式]] 、((数字表达式))
  2. 例子
  #!/bin/bash
  # while的示例
  a=1
  while [ "${a}" -lt 5 ] 
  do
     echo "${a}"
     a=$((a+1))
  done

函数基础知识

  1. 定义函数
  函数名(){
     
      函数体
  }
  1. 函数体调用参数
  函数名(){
     
      函数体 $n
  }

Linux常用常考

  1. 重定向符号
> 覆盖方式输入到右侧文件中
>> 追加方式输入到右侧文件末尾行的下一行
  1. 管道符 |
    命令1 | 命令2 管道符左侧 命令1 执行后的结果 , 传递 给管道符右侧的命令2 使用.
  2. 其他符号
    1. 后台展示符号 &:将一个命令从前台转到后台执行
    2. 2>&1
      1 表示正确输出的信息
      2 表示错误输出的信息
      2>&1 表示所有的输出的信息
      
  3. grep
    1. 强大的文本搜索命令
    2. grep [参数][关键字] <文件名>
    3. 在查看某个文件的内容的时候, 是需要有<文件名>
      grep命令在结合 | 使用的情况下, 后面的后面的<文件名>是没有的
    4. 参数详解:
      -c 只输出匹配行的计数
      -n 显示匹配行及行号
      -v 显示不包含匹配文本的所有行
      
  4. sed 命令详解
    1. 行命令编辑工具. 编辑文件是以为单位的
    2. sed [参数] <匹配条件> [动作] [文件名]
    3. 参数详解:
      参数为空 表示se的操作效果实际上不对文件进行编辑
      -i 表示对文件进行编辑
    4. 动作详解 注意: 下面的动作应该在参数为 -i 的时候使用, 不然的话不会有效果
      -a 在匹配到的内容的下一行增加内容
      格式: sed -i '行号a\增加的内容' 文件名
      注意: 如果是增加多行, 可以在行号的位置写个范围值, 彼此之间用 , 隔开
      
      -i 在匹配到的内容的上一行增加内容
      格式: sed -i '行号i\增加的内容' 文件名
      
      -d 删除匹配到的内容
      格式: sed -i '行号d' 文件名
      如果删除多行, 在行号位置用逗号隔开.
      
      -s 替换匹配到的内容
      包含: 行号 列号 全体 3种替换方式
      命令格式: sed -i [替换格式] [文件名]
      
    5. 例子
      #1.替换 每行首个匹配到的内容:
       sed -i 's#原内容#替换后内容#' 文件名
      	  ​
      #2.替换 全部 匹配到的内容:  通过 g 来实现
      sed -i 's#原内容#替换后的内容#g' 文件名
      	  ​
      #3.指定 行号 替换 首个 匹配内容:
      #比如替换第2行
      sed -i '2s#原内容#新内容#' 文件名
      	  ​
      #4.首行 指定 列号 替换匹配内容
      替换第3列匹配到的内容的那一列
      sed -i 's#原内容#新内容#3' 文件名
      	  ​
      #5.指定 行号 列号 匹配内容
      sed -i '行号s#原内容#替换后的内容#列号' 文件名
      
  5. awk 命令详解
    1. awk 是一个功能强大的文档编辑工具, 不仅能以行为单位进行编辑还能以列为单位进行文件处理
    2. awk [参数] '[动作]' 文件名
    3. 常见参数:-F 指定行的分隔符
    4. 常见内置变量
      FILENAME 当前输入文件的文件名, 该变量是 只读 的
      NR 指定显示行的行号
      NF 输出 最后一列的内容
      OFS 输出格式的列分隔符, 默认是空格
      FS 输入文件的列分隔符, 默认是连续的空格和Tab
      
    5. 命令演示
        #1.打印指定列的内容
        awk '{print $1,$4,$6}' awk.txt
        #2.指定行打印内容
        awk 'NR==1 {print $1,$3}' awk.txt
        #3. 指定分隔符打印内容
        awk -F ':' '{print $1,$7}' awk.txt
        #4. 设置显示分隔符,显示内容
        awk 'BEGIN{OFS=":"} {print NR,$0}' awk.txt
      

shell基础面试题

  1. 如何在脚本中使用参数
    第一个参数 : $1,第二个参数 :$2
例子 : 脚本会复制文件(arg1) 到目标地址(arg2)
./copy.sh file1.txt /tmp/

cat copy.sh
#!/bin/bash
cp $1 $2
  1. 如何获取文件的最后一行和第一行
    tail -1
    head -1
  2. 如何获取一个文件每一行的第三个元素
    awk'{print $3}'
  3. 假如文件中每行第一个元素是FIND,如何获取第二个元素
    awk'{ if ($1 == "FIND") print$2}'
  4. 如何调试 bash 脚本
    将 -xv 参数加到#!/bin/bash 后
例子:
#!/bin/bash –xv
  1. **举例如何写一个函数 **
function example {
     
echo "Hello world!"
}
  1. 如何向连接两个字符串 ?
V1="Hello"
V2="World"
V3=${V1}${V2}
echo $V3
输出
HelloWorld
  1. 如何进行两个整数相加 ?
V1=1
V2=2
let V3=$V1+$V2
echo $V3
输出
3
  1. 如何检查文件系统中是否存在某个文件 ?
if [ -f /var/log/messages ]
then
echo "File exists"
fi
  1. 每个脚本开始的#!/bin/sh 或 #!/bin/bash 表示什么意思?
    这一行说明要使用的 shell。
    #!/bin/bash表示脚本使用 /bin/bash。
    对于 python 脚本,就是 #!/usr/bin/python。
  2. 如何获取文本文件的第 10 行 ?
    head -10 file|tail -1
  3. bash 脚本文件的第一个符号是什么

  1. 命令:[ -z"" ] && echo 0 || echo 1 的输出是什么
    0
  2. 如何在后台运行脚本 ?
    nohup command&
  3. "chmod 500 script" 做什么 ?
    使脚本所有者拥有可执行权限。
  4. ">" 做什么 ?
    重定向输出流到文件或另一个流。
  5. & 和&& 有什么区别
    & - 希望脚本在后台运行的时候使用它
    && - 当前一个脚本成功完成才执行后面的命令/脚本的时候使用它
  6. ’ 和 " 引号有什么区别 ?
    ’ - 当我们不希望把变量转换为值的时候使用它,即原样输出。
    " - 会计算所有变量的值并用值代替。
  7. 如何在脚本文件中重定向标准输出和标准错误流到log.txt 文件 ?
    在脚本文件中添加 “exec >log.txt 2>&1” 命令。
  8. 如何只用 echo 命令获取字符串变量的一部分 ?
    echo ${variable:x:y}
    x - 起始位置
    y - 长度
  9. 如何使用 awk 列出 UID 小于 100 的用户 ?
    awk -F: '$3<100' /etc/passwd
  10. 如何获取变量长度 ?
    ${#variable}
  11. 如何打印变量的最后 5 个字符 ?
    echo ${variable: -5}
  12. 如何只用 echo 命令替换字符串的一部分 ?
    echo ${variable//pattern/replacement}
  13. 如何计算本地用户数目 ?
    cat /etc/passwd|wc -l
  14. 不用 wc 命令如何计算字符串中的单词数目 ?
set ${string}
echo $#
  1. 如何列出第二个字母是 a 或 b 的文件 ?
    ls -d ?[ab]*
  2. 如何将整数 a 加到 b 并赋值给 c ?
    c=$((a+b))
  3. 如何去除字符串中的所有空格 ?
    echo $string|tr -d " "
  4. 写出输出数字 0 到 100 中 3 的倍数(0 3 6 9…)的命令 ?
for (( i=0; i<=100; i=i+3 ))
do
	echo"Welcome $i times"
done
  1. 如何打印传递给脚本的所有参数?
    echo $* 或 echo $@
  2. [ $a == $b ] 和[ $a -eq $b ] 有什么区别
    [ $a == $b ] - 用于字符串比较
    [ $a -eq $b ] - 用于数字比较
  3. = 和 == 有什么区别
    = - 用于为变量赋值
    == - 用于字符串比较
  4. 写出测试 $a 是否大于 12 的命令 ?
    [ $a -gt 12 ]
  5. 如何检查字符串是否以字母"abc" 开头 ?
    [[ $string == abc* ]]
  6. [[ $string == abc ]] 和 [[ $string == "abc" ]] 有什么区别**
    [[ $string == abc* ]] - 检查字符串是否以字母 abc 开头
    [[ $string == “abc” ]] - 检查字符串是否完全等于 abc
  7. 如何列出以 ab 或 xy 开头的用户名 ?
    "^ab|^xy" /etc/passwd | cut-d: -f1
  8. bash 中 $! 表示什么意思 ?
    后台最近执行命令的 PID.
  9. $? 表示什么意思 ?
    前台最近命令的结束状态。
  10. 如何输出当前 shell 的 PID ?
    echo $$
  11. ** $* 和 $@ 有什么区别**
    $* - 以一个字符串形式输出所有传递到脚本的参数
    $@ - 以 $IFS 为分隔符列出所有传递到脚本中的参数
  12. 如何在 bash 中定义数组 ?
    array=("Hi" "my""name" "is")
  13. 如何打印数组的第一个元素 ?
    echo ${array[0]}
  14. 如何打印数组的所有元素 ?
    echo ${array[@]}
  15. 如何输出所有数组索引 ?
    echo ${!array[@]}
  16. shell 脚本如何获取输入的值 ?
    a) 通过参数
    ./script param1 param2
    b) 通过 read 命令
    read -p "Destination backup Server :" desthost

shell面试进阶题

太累了,我就直接放链接了= =
https://qiemengdao.iteye.com/blog/1660205

你可能感兴趣的:(其他琐碎,shell,linux,面试,测试)