美文网首页学习
shell面试题

shell面试题

作者: 肉包君 | 来源:发表于2021-01-08 17:30 被阅读0次

    2021-01-06

    1. 计算向脚本传递的参数个数
    $#
    
    1. 在脚本中获取脚本的名称
    $0
    
    1. 检查上一条命令是否执行成功
    $?     # 值为0说明执行成功,非0则执行失败
    
    1. 获取文件最后一行
    tail  -1     # tail 为显示最后10行
    
    1. 获取文件第一行
    head -1     # head 为显示前10行
    
    1. 向脚本传递参数
    ./test.sh  file.txt
    cat test.sh
    #!/bin/bash
    echo $1
    ######
    输出为:file.txt
    
    1. 在脚本中使用传进来的参数
    bash  copy.sh  file.txt  /home/
    cat copy.sh
    #!/bin/bash
    cp $1 $2
    
    1. 获取一个文件每一行的第三个元素
    awk { print $3 }     # -F" "  指定分隔符,不写-F的时候默认分隔符为空格
    
    1. 找出以“FIRST”开头的行,并获取这些行的第四个元素
    awk { if ( $1 == "FIRST") print $4 }    #注意{}前后有空格,在命令行使用if时用(),在脚本中用[]
    
    1. 调试脚本的方式
    # 在解释器后面加  -xv
    cat test.sh
    #!/bin/bash -xv
    
    1. 定义函数,并调用函数
    cat aa.sh
    #!/bin/bash
    function test {
        echo "The first func!"  
    }
    test
    ######
    输出结果为:The first func!
    
    1. 连接两个字符串
    #  变量在赋值时,等号左右两边不能有空格,与python的格式有区别
    a='haha '
    b='kk'
    c=$a$b
    echo $c
    ######
    输出结果为:haha kk
    
    1. 两数相加
    a=5
    b=6
    法1:let c=$a+$b
    echo $c
    法2:echo $[$a+$b]  (常用)
    ######
    输出结果为:11
    
    1. 检查文件系统是否存在某个文件
    if [ -f /var/log/messages ]
    then
      echo "file exists"
    fi
    ######
    输出结果为:file exists
    
    1. for循环语法
    for i in $(ls);
    do
      echo "item:$i"
    done
    例子:循环输出1到10
    法1:
    for j in {1..10};
    do
        echo $j
    done
    法2:
    for k in `seq 1 10`;
    do 
        echo $k
    done
    # seq 产生指定两个数之间的所有整数,默认间隔为1
    seq -5 2 5   # 换行输出-5 到 5 之间的整数,间隔为2
    
    1. while循环语法
    #!/bin/bash
    a=0
    while [ $a -lt 10 ];
    do
      a=$[ $a+1 ]
      echo $a
    done
    # a 的值小于10就+1,并打印+1之后a的值
    
    1. until循环语法
    # until与while相反,当满足条件时停止循环,不满足条件则执行循环
    #!/bin/bash
    a=10
    until [ $a -lt 5 ];
    do
      let a-=1
      echo $a
    done
    
    1. 常用解释器
    #!/bin/bash
    #!/usr/bin/python
    
    1. 获取文件第10行
    head -10 file | tail -1
    
    1. bash 脚本文件的第一个符号是什么 #
    2. 命令[ -z "" ] && echo 0 || echo 1的解释和输出是什么
    [-z ''''] 的长度为零则为真,&& 如果符号前面结果为真,就执行符号后面的命令,反之不执行,|| 如果符号前面的结果为真,就不执行后面的命令,反之则执行后面的命令,因此输出为 0
    
    1. 命令 “export” 有什么用 ?
    使变量在子shell中可用
    
    1. 在后台运行脚本
    (1)在脚本后面加 $
    (2)nohup command&
    
    1. chmod 500 test.sh 有什么用
    使test.sh 的所有者拥有读权限和执行权限
    
    1. ">" 作用
    重定向输出流到文件或另一个流
    
    1. & 与 && 的区别
    &:使脚本在后台运行
    &&:符号前一个命令执行成功,则执行符号后面的命令看,反之不执行
    
    1. name=kk && echo 'My name is $name' 输出是什么
    输出为:My name is $name
    正确写法:name=kk && echo "My name is $name",输出为,My name is kk
    
    1. echo ${num:-cc} 输出是什么
    输出为cc
    解析,若num有赋值,则使用num的值,否则使用-后的值,相当于设置默认值
    若num=2,则输出为2
    
    1. '"的区别
    ':强引用,在单引号内的所有内容都被当成字符串
    ":弱引用,在双引号中可获取变量的值,例子见27
    
    1. 在脚本文件中重定向标准输出和标准错误流到 log.txt文件
    exec > log.txt  2>&1
    
    1. 只用echo获取字符串的一部分
    a=variable
    echo ${a:0:3}
    输出为:vari(注意:空格也占一个位置)
    
    1. variable="User:123:321:/home/dir"用echo获取路径
    echo ${variable#*:*:*:}  输出为:/home/dir
    # 解析:从variable这变量的开头(#)往后截取,*表示任何数据,:表示字符串中的分隔符,需要截取的具体内容在表达式不需要占位符
    
    1. variable="User:123:321:/home/dir"用echo获取user这个字段
    echo ${variable%*:*:*:}   输出为:User
    # 解析:%表示从后面往前截取
    
    1. 列出UID小于100的用户
    awk -F":" '$3<100' /etc/passwd
    

    35. 写程序为用户计算主组数目 并显示次数和组名

    #!/bin/bash
    cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c g
    do
      { echo $c; grep :$g: /etc/group|cut -d: -f1;}|xargs -n 2
    done
    

    36. 如何在bash shell中更改标准的域分隔符为:

    IFS=":"
    
    1. 获取变量的长度
    a="abcd"
    echo ${#a}
    输出为:4
    
    1. 打印变量的最后5个字符
    a=abcd
    echo ${a: -3}   #注意分号后面有空格,没有空格则效果如例28
    输出为:bcd
    
    1. 用echo替换字符串的一部分
    a=aabcd
    echo ${a//aa/kk}
    输出为:kkbcd
    

    40. 哪个命令将命令替换成大写

    tr '[:lower:]' '[:upper:]'
    
    1. 计算本地用户数目
    cat /etc/passwd | wc -l
    
    1. 计算字符串中的单词数量
    a="abc kkk lij uh xsjg yugdfc d dsc"
    法1:echo $a | wc -w
    法2:set ${a}
             echo $#
    
    1. export $abc 和 export abc 哪种写法正确
    export abc
    解析:export用于设置和显示环境变量
    export -p:列出所有环境变量
    
    1. 列出第二个字母是a或b的文件
    ls -d ?[ab]*
    
    1. 去除字符串中的所有空格
    a='jsad iuwef i jgibkh ljv'
    echo $a | tr -d " "
    解析: tr 命令用于转换(替换)或删除文件中的字符,-d 删除
    
    1. 输出数字0到100中3的倍数,用命令行来写
    法1:for i in {0..100..3}; do echo $i; done
    法2:for (( i=0; i<=100; i=i+3 )); do echo "$i"; done
    
    1. 打印传递给脚本的所有参数
    echo $*  或  echo $@
    
    1. [ a ==b ] 和[ a -eqb ]的区别
    [ $a == $b ]:用于字符串比较
    [ $a -eq $b ]:用于数字比较
    
    1. = 和 == 的区别
    =:用于变量赋值
    ==:用于字符串比较
    
    1. 测试$a是否大于10
    [ $a -gt 10 ]
    解析:-gt 大于    -lt 小于     -le 小于等于     -eq 等于
    
    1. 检查字符串是否以“abc”开头
    [ $string == abc* ]
    
    1. [[ string == abc* ]] 和 [[string == "abc" ]] 有什么区别
    1.检查字符串是否以字母abc开头
    2.检查字符串是否完全等于abc
    
    1. 列出以ab 或xy 开头的用户名
    egrep "^ab|^xy" /etc/passwd | cut -d: -f1
    解析:egrep是grep的扩展,支持更多re规则,若改用grep输出为空
    
    1. 判断文件夹是否为空
    #!/bin/sh
    ##方法一 判断输出字符数统计为0
    is_empty_dir(){ 
        return `ls -A $1|wc -w`
    }
    ##方法二 判断输出string为空
    is_empty_dir(){ 
       return $[ -z `ls -A $1` ]
    }
    
    if is_empty_dir $1
    then
        echo " $1 is empty"
    else
        echo " $1 is not empty"    
    fi
    
    1. 判断文件是否为空,不为空则打印文件大小
    #! /bin/bash
    if [ -s ./file.sh ] ; then    #当文件大于0时,返回True
      echo 'ths file is not empyt and file size:'
      du -sh file.sh  #打印文件大小
    else
      echo 'empty!'
    fi
    
    1. $! 表示什么
    后台最近执行命令的pid
    
    1. $?表示什么
    前台最近命令的结束状态
    
    1. 显示当前shell的pid
    echo $$
    
    1. * 和@ 有什么区别
    $*:以一个字符串形式输出所有传递到脚本的参数
    $@:以$IFS为分隔符列出所有传递到脚本的参数
    
    1. 在bash中定义数组
    list=("a" "b" "c")
    
    1. 打印数组的第一个元素
    echo ${list[0]}
    
    1. 打印数组的所有元素
    echo ${list[@]}
    
    1. 输出所有数组索引
    echo ${!list[@]}
    
    1. 移除数组中索引为2的元素
    unset list[2]
    
    1. 添加id为3的元素
    list[3]="kk"
    
    1. 列出shell脚本获取输入的值的方法
    法1:bash test.sh a b     #a b 为参数传入脚本
    法2:read -p "请输入:"  variable
    执行命令或脚本时需要键盘输入一个参数,这个参数将赋值给variable
    
    1. expect的使用(自动交互方法)
    /usr/bin/expect << EOD
    spawn rsync -ar ${line} ${desthost}:${destpath}
    expect "*?assword:*"
    send "${password}\r"
    expect eof
    EOD
    
    1. 用户登录Linux需要执行的文件(有顺序)
    /etc/profile--->(~/.bash_profile )  ---> ~/.bashrc  ---> /etc/bashrc
    
    1. 获取系统当前时间(年月日时分秒)
    date +%Y-%m-%d_%H:%M:%S
    

    相关文章

      网友评论

        本文标题:shell面试题

        本文链接:https://www.haomeiwen.com/subject/mvrnoktx.html