shell面试题

Q1. linux系统 /home目录下有一个文件test.xml,内容如下,

<configuration>

    <artifactItems>

        <artifactItem>

    <groupId>zzz</groupId>

    <artifactId>aaa</artifactId>

</artifactItem>

<artifactItem>

    <groupId>xxx</groupId>

    <artifactId>yyy</artifactId>

</artifactItem>

<!-- </artifactItem> <groupId>some groupId</groupId> <

    <version>1.0.1.2.333.555</version> </artifactItem> -->

    </artifactItems>

</configuration>


请写出shell脚本删除文件中的注释部分内容,获取文件中所有artifactItem的内容,并用如下格式逐行输出 artifactItem:groupId:artifactId

分析:这个文件比较特殊,但是却很有规律。注释部分内容其实就是<!-- -->中间的内容,所以我们想办法把这些内容删除掉就ok了。而artifactItem的内容,其实就是获取<artifactItem></artifactItem>中间的内容。然后想办法用提到的格式输出即可。

答案:

#!/bin/bash

egrep -v '<!--|-->' 1.txt |tee 2.txt  //这行就是删除掉注释的行

 

grep -n 'artifactItem>' 2.txt |awk '{print $1}' |sed 's/://' > /tmp/line_number.txt

n=`wc -l /tmp/line_number.txt|awk '{print $1}'`

 

get_value(){

    sed -n "$1,$2"p 2.txt|awk -F '<' '{print $2}'|awk -F '>' '{print $1,$2}' > /tmp/value.txt

    nu=`wc -l /tmp/value.txt|awk '{print $1}'`

    for i in `seq 1 $nu`

    do

        x=`sed -n "$i"p /tmp/value.txt|awk '{print $1}'`

        y=`sed -n "$i"p /tmp/value.txt|awk '{print $2}'`

        echo artifactItem:$x:$y

    done

}

 

n2=$[$n/2]

for j in `seq 1 $n2`

do

    m1=$[$j*2-1]

    m2=$[$j*2]

    nu1=`sed -n "$m1"p /tmp/line_number.txt`

    nu2=`sed -n "$m2"p /tmp/line_number.txt`

    nu3=$[$nu1+1]

    nu4=$[$nu2-1]

    get_value $nu3 $nu4

done

 

Q2. linux系统中,根目录/root/下有一个文件 ip-pwd.ini,内容如下

10.111.11.1,root,xyxyxy

10.111.11.1,root,xzxzxz

10.111.11.1,root,123456

10.111.11.1,root,xxxxxx

……

文件中每一行的格式都为linux服务器的ip root root密码 请用一个shell批量将这些服务器中的所有tomcat进程kill掉

讲解: 有了ip,用户名和密码,剩下的就是登录机器,然后执行命令了。批量登录机器,并执行命令,咱们课程当中有讲过一个expect脚本。所以本题就是需要这个东西来完成。

答案:

首先编辑expect脚本 kill_tomcat.expect

#!/usr/bin/expect

set passwd [lindex $argv 0]

set host [lindex $argv 1]

spawn ssh root@$host

expect {

"yes/no" { send "yes\r"; exp_continue}

"password:" { send "$passwd\r" }

}

expect "]*"

send "killall java\r"

expect "]*"

send "exit\r"

编辑完后需要给这个文件执行权限 chmod a+x kill_tomcat.expect

然后编辑shell脚本

#!/bin/bash

n=`wc -l ip-pwd.ini`

for i in `seq 1 $n`

do

    ip=`sed -n "$n"p ip-pwd.ini |awk -F ',' '{print $1}'`

    pw=`sed -n "$n"p ip-pwd.ini |awk -F ',' '{print $3}'`

    ./kill_tomcat.expect $pw $ip

done


Q3. 查看test.txt文件中已aaa结尾的所有行。

答案:grep 'aaa$' test.txt


Q4. 查找当前路径下文件名包含test的所有文件

答案:find ./  -name “*test*”


3. 进入/home/imix目录创建 testing目录 并拷贝testing目录到/tmp下,并删除源目录

答案:

cd /home/imix

mkdir testing

cp -r testing /tmp/

rm -rf /home/imix/testing


4. 输出当前路径下的文件详细信息并以空格分割打印第九个域并过滤包含agent字符串的结果

答案:ls -l |awk ‘{print $9}’ |grep ‘agent’


5. 给test.sh文件可执行权限 给 check.sh文件同组和非同组用户读权限

答案:  

chmod a+x test.sh        

chown g+r,o+r check.sh


6. 将当前服务器磁盘占用情况以GB的方式显示,并写入/tmp目录下的disk.txt文件

答案:df -h > /tmp/disk.txt


7. 输出当前服务器上的时间信息,格式为 YYYYMMDD-HH:MM:DD

答案:date +%Y%m%d-%H:%M:%S


8. 在当前服务器上查看远程服务器199.31.176.70上1521端口是否开通?

答案:telnet 199.31.176.70 1521


9. 在当前用户创建一个计划任务 每周一到周五凌晨3点执行/home/imix下的app.sh脚本

答案:0 3 * * 1-5 /bin/sh /home/imix/app.sh


10. 请使用条件函数if撰写一个shell函数 函数名为 f_judge,实现以下功能 当/home/log 目录存在时 将/home目录下所有tmp开头的文件或目录移至/home/log 目录。  当/home/log目录不存在时,创建该目录,然后退出。

答案:

#!/bin/bash

f_judge (){

    if [ -d /home/log ]

    then  

        mv /home/tmp* /home/log/

    else

        mkdir -p /home/log

        exit

    fi

}


统计ip访问情况,要求分析nginx访问日志,找出访问页面数量在前十位的ip

cat access.log | awk '{print $1}' | uniq -c | sort -rn | head -10

使用tcpdump监听主机为192.168.1.1,tcp端口为80的数据,同时将输出结果保存输出到tcpdump.log

 tcpdump 'host 192.168.1.1 and port 80' > tcpdump.log

如何将本地80 端口的请求转发到8080 端口,当前主机IP 为192.168.2.1

iptables -A PREROUTING -d 192.168.2.1 -p tcp -m tcp -dport 80 -j DNAT-to-destination 192.168.2.1:8080
实时抓取并显示当前系统中tcp 80端口的网络数据信息,请写出完整操作命令
tcpdump -nn tcp port 80

查看http的并发请求数与其TCP连接状态

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
还有ulimit -n 查看linux系统打开最大的文件描述符,这里默认1024

不修改这里web服务器修改再大也没用,若要用就修改很几个办法,这里说其中一个:

修改/etc/security/limits.conf

soft nofile 10240
hard nofile 10240
重启后生效
用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}'| sort | uniq -c | sort -nr |head -20
写一个脚本,实现判断192.168.1.0/24网络里,当前在线的IP有哪些,能ping通则认为在线
#!/bin/bash
for ip in seq 1 255
do

{

ping -c 1 192.168.1.$ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo 192.168.1.$ip UP
else
echo 192.168.1.$ip DOWN
fi
}&
done
wait

已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张

现在要求只能保留最近 7 天的访问日志!请问如何解决? 请给出解决办法或配置或处理命令

创建文件脚本:

#!/bin/bash

for n in seq 14

do

date -s "11/0$n/14"

touch accesswww(date +%F).log

done
解决方法:
pwd/application/logs
find /application/logs/ -type f -mtime +7 -name "*.log"|xargs rm –f
也可以使用-exec rm -f {} \;进行删除
请执行命令取出 linux 中 eth0 的 IP 地址(请用 cut,有能力者也可分别用 awk,sed 命令答)

cut方法1:

ifconfig eth0|sed -n '2p'|cut -d ":" -f2|cut -d " " -f1

192.168.20.130

awk方法2:

ifconfig eth0|awk 'NR==2'|awk -F ":" '{print $2}'|awk '{print $1}'

192.168.20.130

awk多分隔符方法3:

ifconfig eth0|awk 'NR==2'|awk -F "[: ]+" '{print $4}'

192.168.20.130

sed方法4:

ifconfig eth0|sed -n '/inet addr/p'|sed -r 's#^.ddr:(.)Bc.*$#\1#g'

192.168.20.130

1) 如何向脚本传递参数 ?

./script argument

例子: 显示文件名称脚本

./show.sh file1.txt
cat show.sh
#!/bin/bash echo $1

(LCTT 译注:谢谢某匿名访客的提醒,原题有误,修改之。)

2) 如何在脚本中使用参数 ?

第一个参数 : $1,第二个参数 : $2

例子 : 脚本会复制文件(arg1) 到目标地址(arg2)

./copy.sh file1.txt /tmp/ cat copy.sh #!/bin/bash cp $1 $2

3) 如何计算传递进来的参数 ?

$#

4) 如何在脚本中获取脚本名称 ?

$0

5) 如何检查之前的命令是否运行成功 ?

$?

6) 如何获取文件的最后一行 ?

tail-1

7) 如何获取文件的第一行 ?

head-1

8) 如何获取一个文件每一行的第三个元素 ?

awk'{print $3}'

9) 假如文件中每行第一个元素是 FIND,如何获取第二个元素

awk'{ if ($1 == "FIND") print $2}'

10) 如何调试 bash 脚本

将 -xv 参数加到 #!/bin/bash 后

例子:

#!/bin/bash –xv

11) 举例如何写一个函数 ?

function example {
echo "Hello world!" }

12) 如何向连接两个字符串 ?

V1="Hello"
V2="World" V3=${V1}${V2} echo $V3

输出

HelloWorld

13) 如何进行两个整数相加 ?

V1=1
V2=2 let V3=$V1+$V2 echo $V3

输出

3

据 @kashu 的意见,本题的更佳回答为:

两个整数相加,还有若干种方法实现:

A=5
B=6 echo $(($A+$B)) # 方法 2 echo $[$A+$B] # 方法 3 expr $A + $B # 方法 4 echo $A+$B | bc # 方法 5 awk 'BEGIN{print '"$A"'+'"$B"'}' # 方法 6

14) 如何检查文件系统中是否存在某个文件 ?

if [ -f /var/log/messages ] then echo "File exists" fi

15) 写出 shell 脚本中所有循环语法 ?

for 循环 :

foriin$(ls);do echo item:$i done

while 循环 :

#!/bin/bash
COUNTER=0 while [ $COUNTER -lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 done

until 循环 :

#!/bin/bash
COUNTER=20 until [ $COUNTER -lt 10 ]; do echo COUNTER $COUNTER let COUNTER-=1 done

16) 每个脚本开始的 #!/bin/sh 或 #!/bin/bash 表示什么意思 ?

这一行说明要使用的 shell#!/bin/bash 表示脚本使用 /bin/bash。对于 python 脚本,就是 #!/usr/bin/python

17) 如何获取文本文件的第 10 行 ?

head -10 file|tail -1

18) bash 脚本文件的第一个符号是什么

#

19) 命令:[ -z "" ] && echo 0 || echo 1 的输出是什么

0

20) 命令 “export” 有什么用 ?

使变量在子 shell 中可用。

21) 如何在后台运行脚本 ?

在脚本后面添加 “&”

据 @kashu 的意见,更好的答案是:

nohup command&

大部分时间我们可能是远程使用Linux,我碰到过由于网络断线使得在后台运行的command &没了...

22) "chmod 500 script" 做什么 ?

使脚本所有者拥有可执行权限。

23) ">" 做什么 ?

重定向输出流到文件或另一个流。

24) & 和 && 有什么区别

  • & - 希望脚本在后台运行的时候使用它
  • && - 当前一个脚本成功完成才执行后面的命令/脚本的时候使用它

25) 什么时候要在 [ condition ] 之前使用 “if” ?

当条件满足时需要运行多条命令的时候。

26) 命令: name=John && echo 'My name is $name' 的输出是什么

variable

27) bash shell 脚本中哪个符号用于注释 ?

#

28) 命令: echo ${new:-variable} 的输出是什么

variable

29) ' 和 " 引号有什么区别 ?

  • ' - 当我们不希望把变量转换为值的时候使用它。
  • " - 会计算所有变量的值并用值代替。

30) 如何在脚本文件中重定向标准输出和标准错误流到 log.txt 文件 ?

在脚本文件中添加 "exec >log.txt 2>&1" 命令。

31) 如何只用 echo 命令获取字符串变量的一部分 ?

echo ${variable:x:y} x - 起始位置 y - 长度

例子:

variable="My name is Petras, and I am developer."
echo ${variable:11:6} # 会显示 Petras

32) 如果给定字符串 variable="User:123:321:/home/dir",如何只用 echo 命令获取 home_dir ?

echo ${variable#*:*:*:}

echo ${variable##*:}

33) 如何从上面的字符串中获取 “User” ?

echo ${variable%:*:*:*}

echo ${variable%%:*}

34) 如何使用 awk 列出 UID 小于 100 的用户 ?

awk -F: '$3<100' /etc/passwd

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

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=":"

37) 如何获取变量长度 ?

${#variable}

38) 如何打印变量的最后 5 个字符 ?

echo ${variable: -5}

39) ${variable:-10} 和 ${variable: -10} 有什么区别?

  • ${variable:-10} - 如果之前没有给 variable 赋值则输出 10;如果有赋值则输出该变量
  • ${variable: -10} - 输出 variable 的最后 10 个字符

40) 如何只用 echo 命令替换字符串的一部分 ?

echo ${variable//pattern/replacement}

41) 哪个命令将命令替换为大写 ?

tr '[:lower:]' '[:upper:]'

42) 如何计算本地用户数目 ?

wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l

43) 不用 wc 命令如何计算字符串中的单词数目 ?

set ${string} echo $#

44) "export $variable" 或 "export variable" 哪个正确 ?

export variable

45) 如何列出第二个字母是 a 或 b 的文件 ?

ls -d ?[ab]*

46) 如何将整数 a 加到 b 并赋值给 c ?

c=$((a+b))

c=`expr $a + $b`

c=`echo "$a+$b"|bc`

47) 如何去除字符串中的所有空格 ?

echo $string|tr -d " "

48) 重写这个命令,将输出变量转换为复数: item="car"; echo "I like $item" ?

item="car"; echo "I like ${item}s"

49) 写出输出数字 0 到 100 中 3 的倍数(0 3 6 9 …)的命令 ?

for i in {0..100..3}; do echo $i; done

for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done

50) 如何打印传递给脚本的所有参数 ?

echo $*

echo $@

51) [ $a == $b ] 和 [ $a -eq $b ] 有什么区别

  • [ $a == $b ] - 用于字符串比较
  • [ $a -eq $b ] - 用于数字比较

52) = 和 == 有什么区别

  • = - 用于为变量赋值
  • == - 用于字符串比较

53) 写出测试 $a 是否大于 12 的命令 ?

[ $a -gt 12 ]

54) 写出测试 $b 是否小于等于 12 的命令 ?

[ $b -le 12 ]

55) 如何检查字符串是否以字母 "abc" 开头 ?

[[ $string == abc* ]]

56) [[ $string == abc* ]] 和 [[ $string == "abc*" ]] 有什么区别

  • [[ $string == abc* ]] - 检查字符串是否以字母 abc 开头
  • [[ $string == "abc" ]] - 检查字符串是否完全等于 abc

57) 如何列出以 ab 或 xy 开头的用户名 ?

egrep "^ab|^xy" /etc/passwd|cut -d: -f1

58) bash 中 $! 表示什么意思 ?

后台最近执行命令的 PID.

59) $? 表示什么意思 ?

前台最近命令的结束状态。

60) 如何输出当前 shell 的 PID ?

echo $$

61) 如何获取传递给脚本的参数数目 ?

echo $#

(LCTT 译注:和第3题重复了。)

*62) $* 和 $@ 有什么区别*

  • $* - 以一个字符串形式输出所有传递到脚本的参数
  • $@ - 以 $IFS 为分隔符列出所有传递到脚本中的参数

63) 如何在 bash 中定义数组 ?

array=("Hi" "my" "name" "is")

64) 如何打印数组的第一个元素 ?

echo ${array[0]}

65) 如何打印数组的所有元素 ?

echo ${array[@]}

66) 如何输出所有数组索引 ?

echo ${!array[@]}

67) 如何移除数组中索引为 2 的元素 ?

unset array[2]

68) 如何在数组中添加 id 为 333 的元素 ?

array[333]="New_element"

69) shell 脚本如何获取输入的值 ?

a) 通过参数

./script param1 param2

b) 通过 read 命令

read -p "Destination backup Server : " desthost

70) 在脚本中如何使用 "expect" ?

/usr/bin/expect << EOD spawn rsync -ar ${line} ${desthost}:${destpath} expect "*?assword:*" send "${password}\r" expect eof EOD


Q:1 Shell脚本是什么、它是必需的吗?

答:一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell脚本)来完成这些日常工作任务。

Q:2 什么是默认登录shell,如何改变指定用户的登录shell

答:在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的。使用chsh命令可以改变默认的shell。示例如下所示:

# chsh <username> -s <new_default_shell>
# chsh linuxtechi -s /bin/sh

Q:3 可以在shell脚本中使用哪些类型的变量?

答:在shell脚本,我们可以使用两种类型的变量:

  • 系统定义变量
  • 用户定义变量

系统变量是由系统系统自己创建的。这些变量通常由大写字母组成,可以通过“set”命令查看。

用户变量由系统用户来生成和定义,变量的值可以通过命令“echo $<变量名>”查看。

Q:4 如何将标准输出和错误输出同时重定向到同一位置?

答:这里有两个方法来实现:

方法一:

2>&1 (# ls /usr/share/doc > out.txt 2>&1 )

方法二:

&> (# ls /usr/share/doc &> out.txt )

Q:5 shell脚本中“if”语法如何嵌套?

答:基础语法如下:

if [ Condition ]
then
command1
command2
…..
else
if [ condition ]
then
command1
command2
….
else
command1
command2
…..
fi
fi

Q:6 shell脚本中“$?”标记的用途是什么? ?

答:在写一个shell脚本时,如果你想要检查前一命令是否执行成功,在if条件中使用“$?”可以来检查前一命令的结束状态。简单的例子如下:

root@localhost:~# ls /usr/bin/shar
/usr/bin/shar
root@localhost:~# echo $?
0

如果结束状态是0,说明前一个命令执行成功。

root@localhost:~# ls /usr/bin/share
ls: cannot access /usr/bin/share: No such file or directory
root@localhost:~# echo $?
2

如果结束状态不是0,说明命令执行失败。

Q:7 在shell脚本中如何比较两个数字 ?

答:在if-then中使用测试命令( -gt 等)来比较两个数字,例子如下:

#!/bin/bash
x=10
y=20
if [ $x -gt $y ]
then
echo “x is greater than y”
else
echo “y is greater than x”
fi

Q:8 shell脚本中break命令的作用 ?

答:break命令一个简单的用途是退出执行中的循环。我们可以在while和until循环中使用break命令跳出循环。

Q:9 shell脚本中continue命令的作用 ?

答:continue命令不同于break命令,它只跳出当前循环的迭代,而不是整个循环。continue命令很多时候是很有用的,例如错误发生,但我们依然希望继续执行大循环的时候。

Q:10 告诉我shell脚本中Case语句的语法 ?

答:基础语法如下:

case word in
value1)
command1
command2
…..
last_command
!!
value2)
command1
command2
……
last_command
;;
esac

Q:11 shell脚本中while循环语法 ?

答:如同for循环,while循环只要条件成立就重复它的命令块。不同于for循环,while循环会不断迭代,直到它的条件不为真。基础语法:

while [ test_condition ]
do
commands…
done

Q:12 如何使脚本可执行 ?

答:使用chmod命令来使脚本可执行。例子如下:

# chmod a+x myscript.sh

Q:13 “#!/bin/bash”的作用 ?

答:#!/bin/bash是shell脚本的第一行,称为释伴(shebang)行。这里#符号叫做hash,而! 叫做 bang。它的意思是命令通过 /bin/bash 来执行。

Q:14 shell脚本中for循环语法 ?

答:for循环的基础语法:

for variables in list_of_items
do
command1
command2
….
last_command
done

Q:15 如何调试shell脚本 ?

答:使用'-x'参数(sh -x myscript.sh)可以调试shell脚本。另一个种方法是使用‘-nv'参数( sh -nv myscript.sh)。

Q:16 shell脚本如何比较字符串?

答:test命令可以用来比较字符串。测试命令会通过比较字符串中的每一个字符来比较。

Q:17 Bourne shell(bash) 中有哪些特殊的变量 ?

答:下面的表列出了Bourne shell为命令行设置的特殊变量。

内建变量

解释

$0

命令行中的脚本名字

$1

第一个命令行参数

$2

第二个命令行参数

…..

…….

$9

第九个命令行参数

$#

命令行参数的数量

$*

所有命令行参数,以空格隔开

Q:18 How to test files in a shell script ?

Q:18 在shell脚本中,如何测试文件 ?

答:test命令可以用来测试文件。基础用法如下表格:

Test

用法

-d 文件名

如果文件存在并且是目录,返回true

-e 文件名

如果文件存在,返回true

-f 文件名

如果文件存在并且是普通文件,返回true

-r 文件名

如果文件存在并可读,返回true

-s 文件名

如果文件存在并且不为空,返回true

-w 文件名

如果文件存在并可写,返回true

-x 文件名

如果文件存在并可执行,返回true

Q:19 在shell脚本中,如何写入注释 ?

答:注释可以用来描述一个脚本可以做什么和它是如何工作的。每一行注释以#开头。例子如下:

#!/bin/bash
# This is a command
echo “I am logged in as $USER”

Q:20 如何让 shell 就脚本得到来自终端的输入?

答:read命令可以读取来自终端(使用键盘)的数据。read命令得到用户的输入并置于你给出的变量中。例子如下:

# vi /tmp/test.sh
#!/bin/bash
echo ‘Please enter your name'
read name
echo “My Name is $name”
# ./test.sh
Please enter your name
LinuxTechi
My Name is LinuxTechi

Q:21 如何取消变量或取消变量赋值 ?

答:“unset”命令用于取消变量或取消变量赋值。语法如下所示:

# unset <Name_of_Variable>

Q:22 如何执行算术运算 ?

答:有两种方法来执行算术运算:

使用expr命令(# expr 5 + 2) 2.用一个美元符号和方括号($[ 表达式 ])例如:test=$[16 + 4] ; test=$[16 + 4]

Q:23 do-while语句的基本格式 ?

答:do-while语句类似于while语句,但检查条件语句之前先执行命令(LCTT 译注:意即至少执行一次。)。下面是用do-while语句的语法

do
{
statements
} while (condition)

Q:24 在shell脚本如何定义函数呢 ?

答:函数是拥有名字的代码块。当我们定义代码块,我们就可以在我们的脚本调用函数名字,该块就会被执行。示例如下所示:

$ diskusage () { df -h ; }

Q:25 如何在shell脚本中使用BC(bash计算器) ?

答:使用下列格式,在shell脚本中使用bc:

variable=`echo “options; expression” | bc`

原文出处: linuxtechi   译文出处:LCTT


1sed修改test.txt23testtset

   sed–i ‘23s/test/tset/g’ test.txt

2查看/web.log25行第三列的内容。

   sed–n ‘25p’ /web.log | cut –d “ ” –f3

   head–n25 /web.log | tail –n1 | cut –d “ ” –f3

   awk–F “ ” ‘NR==23{print $3}’ /web.log

3删除每个临时文件的最初三行。

   sed–i ‘1,3d’ /tmp/*.tmp

4脚本编程:求100内的质数。

   #!/bin/bash

   i=1

   while[ $i -le 100 ];do

       ret=1

       for(( j=2;j<$i;j++ ));do

   if [ $(($i%$j))-eq 0  ];then

ret=0

break

   fi

       done

       if[ $ret -eq 1 ];then

           echo-n "$i "

       fi

       i=$((i+1 ))

   done

5晚上11点到早上8点之间每两个小时查看一次系统日期与时间,写出具体配置命令

   echo1 23,1-8/2 * * * root /tmp/walldate.sh >> /etc/crontab

6编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下

   #!/bin/bash

   fileinfo=($(du./*))

   length=${#fileinfo[@]}

   for((i=0;i<$length;i=$((i+2 ))));do

       if[ ${fileinfo[$i]} -le 10 ];then

   mv ${fileinfo[$((i+1 ))]} /tmp

       fi

   done

7如何将本地80端口的请求转发到8080端口,当前主机IP192.168.2.1

   /sbin/iptables-t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.2.1:8080

   /sbin/iptables-t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080

811月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh 怎么实现

   echo"1 6-12/2 * * * root /usr/bin/httpd.sh >> /etc/crontab"

9shell环境如何杀死一个进程?

   psaux  | grep | cut -f? 得到pid

   cat/proc/pid

   killpid

10shell环境如何查找一个文件?

   find/ -name abc.txt

11shell里如何新建一个文件?

   touch~/newfile.txt

12linux下面的sedawk的编写

1如何显示文本file.txt中第二大列大于56789的行?

  awk -F "," '{if($2>56789){print $0}}' file.txt

2显示file.txt1,3,5,7,10,15行?

  sed -n "1p;3p;5p;7p;10p;15p" file.txt

  awk 'NR==1||NR==3||NR==5||…||NR=15{print $0}' file.txt

3file.txt的制表符,即tab,全部替换成"|"

   sed-i "s#\t#\|#g" file.txt

13把当前目录(包含子目录)下所有后缀为“.sh”的文件后缀变更为“.shell”  

   #!/bin/bash

   str=`find./ -name \*.sh`

   fori in $str

   do

       mv$i ${i%sh}shell

   done

14编写shell实现自动删除50个账号功能,账号名为stud1stud50

  #!/bin/bash

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

      userdel stud$i

  done

15请用Iptables写出只允许10.1.8.179 访问本服务器的22端口。

  /sbin/iptables -A input -p tcp -dport 22 -s 10.1.8.179 -j ACCEPT

  /sbin/iptables -A input -p udp -dport 22 -s 10.1.8.179 -j ACCEPT

  /sbin/iptables -P input -j DROP

16shell中变量的赋值有四种方法,其中,采用name=12的方法称(   A  

A直接赋值                    B使用read命令

C使用命令行参数            D使用命令的输出

17有文件file1

1)查询file1里面空行的所在行号

  grep -n ^$ file1

2)查询file1abc结尾的行

  grep abc$ file1

3)打印出file1文件第1到第三行

  head -n3 file1

  sed "3q" file1

  sed -n "1,3p" file1

18假设有一个脚本scan.sh,里面有1000行代码,并在vim模式下面,请按照如下要求写入对应的指令

1shutdown字符串全部替换成reboot

  :%s/shutdown/reboot/g

2清空所有字符

  :%d

3不保存退出

  q!

19110数字相加,写出shell脚本

  #!/bin/bash

  j=0

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

      j=$[j+i ]

  done

  echo $j

20常见shell有哪些?缺省的是哪个?

  /bin/sh   /bin/bash   /bin/ash    /bin/bsh    /bin/csh   /bin/tcsh    /sbin/nologin

21Shell循环语句有哪些?

  for    while    until

22SHELL模拟LVS,脚本怎么写

  /sbin/iptable -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to192.168.1.11-192.168.1.12

23找出系统内大于50k,小于100k的文件,并删除它们。

  #!/bin/bash

  file=`find / -size +50k -size -100k`

  for i in $file;do

      rm -rf $i

  done

24脚本(如:目录dir1dir2dir3下分别有file1file2file2,请使用脚本将文件改为dir1_file1dir2_file2dir3_file3

  #!/bin/bash

  file=`ls dir[123]/file[123]`

  for i in $file;do

      mv $i ${i%/*}/${i%%/*}_${i##*/}

  done

25BC目录下的文件A1A2A3文件,改名为AA1AA2AA3.使用shell脚本实现。

  #!/bin/bash

  file=`ls [ABC]/A[123]`

  for i in $file;do

      mv $i ${i%/*}/A${i#*/}

  done


每天晚上 12 点,打包站点目录/var/www/html 备份到/data 目录下(最好每次备份按时间生成不同的备份

cat a.sh
#/bin/bash
cd /var/www/ && /bin/tar zcf /data/html-date +%m-%d%H.tar.gz html/
crontab –e
00 00 * /bin/sh /root/a.sh
将/usr/local/test目录下大于100K 的文件转移到/tmp 目录下。
find /usr/local/test -type f -size +100k -exec mv {} /tmp \;
如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0:
# iptables -t nat -A PREROUTING -d 192.168.16.1 -p tcp --dport 80 -j DNAT --to 192.168.16.1:8080
或者:
# iptables -t nat -A PREROUTING -i eth0 -d 192.168.16.1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
这个月内,每天的早上 6 点到 12 点中,每隔 2 小时创建一个test.txt文件,内容为ok,如何实现?
a、crontab -e 进入编辑模式
b、添加以下内容 0 6-12/2 * 4 * /bin/touch test.txt   (以4月为例)
c、启动服务 service crontab start;chkconfig crontab on
linux系统中如何获取pid为100的进程所监听的tcp端口,请给出详细命令?
netstat -nlpt |grep 100
使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为:
root@oldboy oldboy]# sh /server/scripts/oldboy.sh  
[root@oldboy oldboy]# ls  
coaolvajcq_oldboy.html  qnvuxvicni_oldboy.html  vioesjmcbu_oldboy.html  
gmkhrancxh_oldboy.html  tmdjormaxr_oldboy.html  wzewnojiwe_oldboy.html  
jdxexendbe_oldboy.html  ugaywanjlm_oldboy.html  xzzruhdzda_oldboy.html  
qcawgsrtkp_oldboy.html  vfrphtqjpc_oldboy.html 
[root@cjy linux-20]# vim 2.sh  
#!/bin/bash  
  
WORK_DIR=/oldboy/  
  
create(){  
  
    i=1  
    while (($i<11))  
    do  
        cd $WORK_DIR && touch `tr -dc "a-z"</dev/urandom |head -c 10`_oldboy.html  
        i=$(($i+1))  
    done  
}  
  
check(){  
    if [ -d $WORK_DIR ];  
    then  
        create  
    else  
        mkdir $WORK_DIR  
        create  
    fi  
}  
  
check  
[root@cjy linux-20]# ./2.sh  
  
[root@cjy linux-20]# ls /oldboy/  
daijyyadst_oldboy.html  mjmcfvvjcq_oldboy.html  qmgbrihbco_oldboy.html  yrxovjbwlv_oldboy.html  
djfhdphvqf_oldboy.html  mohijpfehs_oldboy.html  xdtspqouln_oldboy.html  
gjczumsnfy_oldboy.html  nfwzssqtus_oldboy.html  yhqruiiota_oldboy.htm  
请用至少两种方法实现!
将以上文件名中的oldboy全部改成oldgirl(用for循环实现),并且html改成大写

[root@cjy linux-20]# vim 3_1.sh  
#!/bin/bash  
  
change_name(){  
DIR=/oldboy  
FILE=`ls /oldboy`  
GIRL=_oldgirl.HTML  
  
for i in $FILE  
do  
   c=`echo $i | cut -c 1-10`  
   mv $DIR/$c* $DIR/$c$GIRL  
done  
}  
  
change_name  
[root@cjy linux-20]# vim 3_2.sh  
#!/bin/bash  
  
change_name(){  
DIR=/oldboy  
FILE=`ls /oldboy`  
GIRL=_oldgirl.HTML  
  
for i in $FILE  
do  
   c=`echo $i | awk -F '_' '{print $1}'`  
   mv $DIR/$c* $DIR/$c$GIRL  
done  
}  
  
change_name  
[root@cjy linux-20]# ./3_1.sh  
[root@cjy linux-20]# ls /oldboy/  
daijyyadst_oldgirl.HTML  mjmcfvvjcq_oldgirl.HTML  qmgbrihbco_oldgirl.HTML  yrxovjbwlv_oldgirl.HTML  
djfhdphvqf_oldgirl.HTML  mohijpfehs_oldgirl.HTML  xdtspqouln_oldgirl.HTML  
gjczumsnfy_oldgirl.HTML  nfwzssqtus_oldgirl.HTML  yhqruiiota_oldgirl.HTML 
批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)。




















### 回答1: 以下是一些常见的shell面试题及答案: 1. 什么是shell? 答:Shell是一种用于访问操作系统内核服务的命令行界面,它允许用户与操作系统交互,并执行各种操作。 2.请描述一下Linux中的进程和线程? 答:进程是操作系统中独立运行的程序,它有自己的内存空间和系统资源。线程是进程中的一个执行单元,它可以独立运行并且可以共享进程的资源。 3.请描述一下如何使用grep命令来查找文件中的特定字符串? 答:使用grep命令可以在文件中查找特定字符串。语法如下:grep 'string' fileName.例如: grep 'hello' test.txt 4.请描述一下如何使用sed命令来替换文件中的文本? 答:使用sed命令可以替换文件中的文本。语法如下:sed 's/old-text/new-text/g' fileName.例如: sed 's/hello/world/g' test.txt 5.请描述一下如何使用awk命令来处理文本文件? 答:awk命令是一种强大的文本处理工具,可以用来解析和操作文本文件。语法如下:awk 'pattern { action }' fileName. 例如:awk '{print $1}' test.txt 6.请描述一下如何使用cut命令来剪切1. 什么是 shell? 答:shell 是一种用于访问操作系统服务的命令行界面。它提供了用于交互式访问和执行操作系统命令的方法。 2. 什么是 shell 脚本? 答:shell 脚本是一种使用 shell 命令编写脚本程序,可以在 shell 中执行。它可以包含一系列命令和流程控制结构,用于自动执行常见任务。 3. 什么是变量? 答:变量是存储值的占位符。在 shell 脚本中,变量可用于存储和引用值,如字符串或数字。 4. 怎样在 shell 中创建变量? 答:在 shell 中创建变量,需要使用等号 (=) 将变量名和值相关联。如: ``` name="John Doe" ``` 5. 怎样在 shell 中调用变量? 答:在 shell 中调用变量,需要在变量前面加上美元符号($)。如: ``` echo $name ``` 6. 怎么在 shell 中使用条件语句? 答:在 shell 中使用条件语句需要使用 if 关键字,并使用 test 命令或者 [] 来测试条件是否成立。如: ``` if [ $a -gt $b ] then echo "a is greater than b" fi ``` 7. 怎么在 shell 中使用循环语句? 答:在 shell 中使用循环语句可以使用 for 和 while 关1. 什么是 ShellShell 是一种命令解释器,它提供了在操作系统与用户之间进行交互的接口。 2. 常见的 Shell 类型有哪些? 常见的 Shell 类型有:bash, csh, ksh, tcsh, zsh 等。 3. Shell 中如何执行外部程序? 在 Shell 中可以使用 "./program_name" 或 "program_name" 的形式来执行外部程序。 4. Shell 中如何查看进程? 在 Shell 中可以使用 "ps" 命令来查看当前系统中的进程。 5. Shell 中如何查看磁盘使用情况? 在 Shell 中可以使用 "df" 命令来查看磁盘使用情况。 6. Shell 中如何查看文件或目录的权限? 在 Shell 中可以使用 "ls -l" 命令来查看文件或目录的权限。 7. Shell 中如何创建一个目录? 在 Shell 中可以使用 "mkdir directory_name" 命令来创建一个目录。 8. Shell 中如何删除一个文件? 在 Shell 中可以使用 "rm file_name" 命令来删除一个文件。 9. Shell 中如何重命名一个文件? 在 Shell 中可以使1. 什么是 shell? 答:shell 是一种操作系统的命令解释器,它提供了一种用户与操作系统进行交互的方式。 2. 什么是 shell 脚本? 答:shell 脚本是一种用来在 shell 中执行的脚本程序,它由一系列 shell 命令组成。 3. 如何查看当前使用的 shell? 答:使用命令 echo $SHELL 可以查看当前使用的 shell。 4. 如何执行一个 shell 脚本? 答:使用命令 sh script.sh 或者 bash script.sh 来执行一个 shell 脚本。 5. 什么是变量? 答:变量是一种存储值的容器,在 shell 中可以使用变量来存储和管理数据。 6. 如何设置和使用变量? 答:使用命令 variable_name=value 来设置变量,使用 $variable_name 来使用变量。 7. 什么是环境变量? 答:环境变量是一种特殊的变量,它在整个系统中都可以使用,用于存储系统相关的配置信息。 8. 什么是 $PATH? 答:$PATH 是一个环境变量,它存储了系统中可执行程序的搜索路径。 9. 什么是 $HOME? 答:$HOME 是一个环境变量,它存储了当前用户的主目录的路径。 10. 什么是条件语句? 答1. 什么是shell? 答:Shell是一种命令行界面的操作系统,它提供了一种简单的方式来交互和控制底层操作系统。 2. 你知道哪些常用的shell? 答:常用的shell有Bash,Zsh,Ksh和Csh。 3. 你能说出几个shell脚本常用的控制结构? 答:if-else, for, while, case, until。 4. 你能解释一下什么是环境变量? 答:环境变量是一种特殊类型的变量,可以在shell会话或者整个操作系统中共享,环境变量可以用来存储系统配置信息和用户设置信息。 5. 你能简单描述一下如何使用grep命令? 答:grep命令可以在文本文件中搜索指定的字符串。语法为 "grep [options] 'pattern' file" 。例如:“grep 'hello' test.txt” 会在test.txt文件中搜索hello。 ### 回答2: 随着Linux的普及和应用场景的不断扩大,越来越多企业对于拥有shell技能的人才的需求也越来越大。在面试中,关于shell技能相关的问题也逐渐增多。下面就让我们来详细了解一下常见的shell面试题及答案。 1. 什么是shellshell是操作系统的外壳,它是用户与系统内核之间的接口,提供了用户与操作系统交互的方法。shell可以接收用户的命令,并将其转换为操作系统的命令进行执行,同时还可以执行脚本文件,对一些复杂的任务进行自动化处理。 2. 如何查看当前使用的shell版本? 在Linux系统中,可以使用echo $SHELL命令来查看当前使用的shell版本。 3. 如何设置环境变量? 可以使用export命令来设置环境变量,比如: export PATH=$PATH:/usr/local/bin 表示将/usr/local/bin目录加入到PATH环境变量中。 4. 如何列出当前目录下的所有文件及目录? 可以使用ls命令来列出当前目录下的所有文件及目录,如: ls -al 其中,a表示显示所有文件及目录(包括隐藏文件),l表示以长格式显示。 5. 如何创建目录? 可以使用mkdir命令来创建目录,如: mkdir testdir 表示创建名为testdir的目录。 6. 如何删除文件? 可以使用rm命令来删除文件,如: rm test.txt 表示删除名为test.txt的文件。 7. 如何查找文件? 可以使用find命令来查找文件,如: find /home/user -name test.txt 表示在/home/user目录下查找名为test.txt的文件。 8. 如何在文件中搜索指定字符串? 可以使用grep命令来在文件中搜索指定字符串,如: grep "hello" test.txt 表示在test.txt文件中搜索包含字符串“hello”的行。 9. 如何使用sed命令替换文件中指定字符串? 可以使用sed命令来替换文件中指定字符串,如: sed 's/hello/world/' test.txt 表示将test.txt文件中所有的“hello”替换为“world”。 10. 如何使用awk命令对文件进行处理? 可以使用awk命令对文件进行处理,如: awk '{print $1,$3}' test.txt 表示输出test.txt文件中每行第一列和第三列的内容。 以上就是常见的shell面试题及答案,希望对于准备从事Linux运维或开发工作的朋友们有所帮助。同时还需要注意的是,除了掌握shell基础知识外,也需要具备系统、网络、编程等方面的知识和经验,才能够在企业中脱颖而出。 ### 回答3: Shell是一种命令语言和程序设计语言,用于控制操作系统及其应用程序。Shell被广泛用于Unix和Linux操作系统中,作为用户与操作系统交互的工具。Shell的优点是简单易学、灵活运用和快速调试,因此成为了运维人员不可或缺的技能之一。下面对几个常见的Shell面试题及答案进行介绍。 一、什么是ShellShell是一种命令语言和程序设计语言,它是一种可以理解用户请求并将其转换为操作系统内核所需要执行的命令的程序。 二、什么是Shell脚本Shell脚本是一种编写Shell程序的方法,它是一种用Shell语言编写的程序,可将一系列的Shell命令组织起来实现一定的功能。 三、如何定义一个Shell函数? 定义一个函数的方法如下所示: ``` 函数名() { 命令1; 命令2; ... } ``` 其中,函数名可以任意定义,函数体中可包含多个命令。 四、如何判断一个文件是否存在? 使用if语句可以实现对文件是否存在的判断,代码如下: ``` if [ -e "文件名" ] then 命令1; else 命令2; fi ``` 其中,-e表示文件是否存在的参数,如果文件存在,则执行命令1,否则执行命令2。 五、如何遍历一个目录下所有的文件及子目录? 使用for循环语句可以遍历一个目录下所有的文件及子目录,代码如下: ``` for file in `ls 目录名` do 命令1; done ``` 其中,ls用于列出目录下的所有文件名,for循环语句遍历每一个文件进行相应的操作。 六、如何实现两个字符串的比较? 使用if语句可以实现两个字符串的比较,代码如下: ``` if [ 字符串1 = 字符串2 ] then 命令1; else 命令2; fi ``` 其中,=表示比较两个字符串是否相等,如果相等,则执行命令1,否则执行命令2。 七、如何实现输入输出重定向? 使用重定向符号可以实现输入输出重定向,如下所示: ``` 命令 < 输入文件 > 输出文件 ``` 其中,<表示输入重定向,>表示输出重定向。 八、如何实现后台运行? 使用&运算符可以实现后台运行,如下所示: ``` 命令 & ``` 其中,&表示在后台运行该命令。 以上是Shell面试题及答案的简要介绍。在面试过程中,还需要具备一定的实际操作能力,熟练掌握Shell编程中的语法、操作符、变量、数组、函数等知识点,才能更好地应对面试题并达到求职的目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值