shell知识点

shell知识点,第1张

一些经典的 Shell 脚本面试问题 - CSDN博客

1 如何在脚本中使用参数

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

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

/copysh file1txt /tmp/

cat copysh

#!/bin/bash

cp $1 $2

2 如何计算传递进来的参数

$#

3 如何检查之前的命令是否运行成功

$

4 如何获取文件的最后一行

tail -1

5 如何获取文件的第一行

head -1

6 如何获取一个文件每一行的第三个元素

awk'{print $3}'

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

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

8 如何调试 bash 脚本

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

例子:

#!/bin/bash –xv

9 举例如何写一个函数

function example {

echo "Hello world!"

}

10 如何向连接两个字符串

V1="Hello"

V2="World"

V3=${V1}${V2}

echo $V3

输出

HelloWorld

11 如何进行两个整数相加

V1=1

V2=2

let V3=$V1+$V2

echo $V3

输出

3

12 如何检查文件系统中是否存在某个文件

if [ -f /var/log/messages ]

then

echo "File exists"

fi

13 写出 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

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

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

15 如何获取文本文件的第 10 行

head -10 file|tail -1

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

#

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

0

18 如何在后台运行脚本

nohup command&

19 "chmod 500 script" 做什么

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

20  ">" 做什么

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

21 & 和&& 有什么区别

& - 希望脚本在后台运行的时候使用它

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

22 bash shell 脚本中哪个符号用于注释

#

23 ' 和 " 引号有什么区别

' - 当我们不希望把变量转换为值的时候使用它。

" - 会计算所有变量的值并用值代替。

24 如何在脚本文件中重定向标准输出和标准错误流到logtxt 文件

在脚本文件中添加 "exec >logtxt2>&1" 命令。

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

echo ${variable:x:y}

x - 起始位置

y - 长度

例子:

variable="My name is Petras, and I amdeveloper"

echo ${variable:11:6} # 会显示 Petras

26 如何使用 awk 列出 UID 小于 100 的用户

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

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

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

28 如何获取变量长度

${#variable}

29 如何打印变量的最后 5 个字符

echo ${variable: -5}

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

echo ${variable//pattern/replacement}

31 如何计算本地用户数目

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

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

set ${string}

echo $#

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

ls -d [ab]

34 如何将整数 a 加到 b 并赋值给 c

c=$((a+b))

c=`expr $a + $b`

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

35 如何去除字符串中的所有空格

echo $string|tr -d " "

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

for i in {01003}; do echo $i; done

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

37 如何打印传递给脚本的所有参数

echo $

echo $@

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

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

[ $a -eq $b ] - 用于数字比较

39 = 和 == 有什么区别

= - 用于为变量赋值

== - 用于字符串比较

40 写出测试 $a 是否大于 12 的命令

[ $a -gt 12 ]

41 如何检查字符串是否以字母"abc" 开头

[[ $string == abc ]]

42 [[ $string == abc ]] 和 [[ $string == "abc" ]] 有什么区别

[[ $string == abc ]] - 检查字符串是否以字母 abc 开头

[[ $string == "abc" ]] - 检查字符串是否完全等于 abc

43 如何列出以 ab 或 xy 开头的用户名

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

44 bash 中 $! 表示什么意思

后台最近执行命令的 PID

45 $ 表示什么意思

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

46 如何输出当前 shell 的 PID

echo $$

47 $ 和 $@ 有什么区别

$ - 以一个字符串形式输出所有传递到脚本的参数

$@ - 以 $IFS 为分隔符列出所有传递到脚本中的参数

48 如何在 bash 中定义数组

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

49 如何打印数组的第一个元素

echo ${array[0]}

50 如何打印数组的所有元素

echo ${array[@]}

51 如何输出所有数组索引

echo ${!array[@]}

52 shell 脚本如何获取输入的值

a) 通过参数

/script param1 param2

b) 通过 read 命令

read -p "Destination backup Server :" desthost

首先脚本命令必须能够接收标准输入流命令。管道数据来自stdin,直接用变量接收即可:

cmdresult=`cat /dev/stdin`

也可以用数组和read循环读出来:

declare -a cmdresult

i=0

while read cmdresult[$i]

do

echo ${cmdresult[$i]}

let i+=1

done

read。在Shell中用来从标准输入中读取数据并赋值给变量的关键字是read。没有进行重定向,默认就是从键盘读取用户输入的数据,进行了重定向,那么可以从文件中读取数据。编程是编定程序的中文简称,就是让计算机代码解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。

写个大概吧

#!/bin/bash

while ;

do

read -p "请输入你要查询的目录,注意需要用绝对路径" a

if [ -d ${a} ]

then echo “目录存在"

num= `ll -a $a | wc -l` %> /dev/null

if [ ${num} -eq 0 ]

then echo "目录为空"

esle read -p "目录非空,是否清空目录,清空请按y,不清空按n" b

if [ "${b}" == "y" ]

then rm -rf ${a}\/

fi

fi

else echo "目录不存在"

fi

done

没测试 可能有点小错误 大概是这个样子的

Shell脚本基本知识

概述:shell其实是内核与用户之间的一个接口,

shell脚本

如果有一系列经常使用的linux命令,你可以把它们存储在一个文件肿。shenll可以读取这个文件,并执行其中的命令。这样的文件成为脚本文件。

执行shell脚本

要创建一个shell脚本,你要使用任何编辑器比如vi在文本文件中编写他。

为了使用bashshell赖执行脚本magic,其命令是:bashmagic或者/magic

echo命令:

echo“thisisanexampleoftheechocommand!”

屏幕上就会回显“thisisanexampleoftheechocommand!”

#符号

用于在shell脚本肿可以包含注解入口

echo“hello”

#thisisacommentlinethiswouldnotproduceanyoutput!

echo“world!”

第二行是一个注解的例子。它将被shell忽略,而且不产生任何消息

变量:

可以在任何时间通过简单的赋值来创建。

语法:

<variablename>-<value>

Linux中的所有变量都被当作字符串

引用变量:

$符号用于引用一个变量的内容

variable1=${variable2}

读入值给变量

在执行shell脚本时,shell还允许用户直接从键盘读入一个值给变量,还可以使用read命令来作。

$readfname

本地和全局shell变量

局部变量

当引用shell时,只有创建它的shell能够知道变量的存在

全局变量

称为子shell

shell中创建的变量局部于创建它的shell,除非使用export命令特别指出是全局的。

环境变量:

通过改变这些变量的值,用户能够定制此环境

一些环境变量的例子是HOME,PATH,PS1,PS2,LOGNAME,SHLVL,及SHELL

HOME变量

Linux系统中的每个用户都有一个相关的称作HOME的目录

当一个用户登录后,进入相应的HOME的目录

$echo$HOME

PATH变量

包含一列用冒号定界的目录的路径名字,便于可执行程序的搜索。

PS1变量

PS1(PromptString1)变量包含了shell提示符,$符号

$PS1=“HELLO>”

HELLO>

PS2变量

是为第二个提示符设置值的环境变量

LOGNAME变量

包含用户的注册名字

$echo“${LOGNAME}”

SHLVL变量

该变量包含当前工作的shelllevel

SHELL变量

环境变量存储了用户缺省的shell

env命令

可用来查看所有的已移出的环境变量表和它们各自的值!

命令替换

在单个命令行中使用多个命令的另外一种方法(非Pipes)是通过命令替换

echo“thedatais`date`”

expr命令

用于求之算术表达式。该命令的输出被送到标准输出

$expr4+5

将在屏幕上显示9

算术展开:

你可以在$((…))中括一个表达式,用下面的命令来计算它的值;

$((expression))

example1

编写一个shell脚本用于计算呼叫中心未应答的询问的数量。该脚本应该接受一天那所报告的询问的总数和应答的询问的数量,以便计算未应答的询问的数量。

所有未应答的询问总数=所有询问的总数-应答的询问的数量

<!--[if!supportLists]-->※<!--[endif]-->※※※※※※※※※※※※※※※※※※※※※※※

条件执行

test和[]

求值表达式,并返回true(0)或false()

数值测试:

-eq等于则为真

-ne不等于则为真

-gt大于则为真

-ge大于等于则为真

-lt小于则为真

-le小于等于则为真

if构造

Linuxshell提供了循环和判定的构造,可以在shell脚本中使用

算术测试

结合if构造,它可以用于测试变量的数字值

串测试

test命令也可以用于字符串

=等于则为真

!=不相等则为真

-z字符串长度为零则为真

-n字符串长度不为零则为真

文件测试

test命令也可以用于检查文件的状态

-e文件存在则为真

-r文件存在并且可读则为真

-w文件存在并且可写则为真

-x文件存在并且可执行则为真

-s文件存在并且至少有一个字符则为真

-d文件存在并且为目录则为真

-f文件存在并且为普通文件则为真

-c文件存在并且为字符型文件则为真

-b文件存在并且为块特殊文件则为真

-a并且-o或者!非

exit命令

用于终止shell脚本的执行并返回到$提示符下

case。。。esac

shell脚本中使用的这个构造依据变量的值而执行一组特定指令

当变量的值和其中的一个值匹配的时候,就执行写在该值下的一组命令。

example3

迭代

while构造

while<条件>

do

<命令(s)>

done

只有条件为真的时候,才能执行do与done之间的命令

until构造

until循环构造的求值模式于while循环相反

until循环将继续执行直到求值的条件为真的时候

for构造

forvariable_namein<list_of_values>

do

done

for循环取一列值作为输入并对循环中每个值执行循环

break和contineu命令

同其他语言中的用法

example4

控制进程的执行

请求后台处理

用于请求后台进程的符号是(&)

$wctempfile&

[1]2082

$vinewfile

检查后台进程

ps(进程状态)命令为每个当前的活动的每个进程产生一行入口。

终止后台进程

可用kill,如下所示

kill278

查看完成一个命令所花的时间

你可以使用time命令来查看一个命令从开始到结束所花的时间

timefine/etc–name“passwd”2>/dev/null/dev/null表明忽略错误信息。

管道的介绍

垂直条(|)是管道字符

它只是shell:“|”前面命令的输出作为“|”之后命令的输入发送

ls–l|more

用管道组合命令,功能强大

我们知道在shell脚本中,可以通过 {xy} 这样的表达式来表示一个从x到y的数列

这个用法在shell脚本里叫做 Brace Expansion 。

因此我们常利用这个表达式来作为循环的次数,如:

可以得到从1到10的输出结果。

但是如果我们想输出从1到一个变量的结果,这个变量从其他地方获取:

得到的结果却是

放弃使用 {xy} 这样的表达式:

seq 命令的原理就不说了,这里说说为什么不能在 { } 中使用变量。其实原因写在bash的man手册中:

Brace expansion is performed before any other expansions, and any characters special to other expansions are preserved in the result It is strictly textual Bash does not apply any syntactic interpretation to the context of the expansion or the text between the braces

大意是说,Bash中会最先展开 { } 中的内容,这个时候 $NUM 还不会被具体的值替代,所以是 i 在循环中读取的是 ‘{1$NUM}’ 的一个完整的字符串,输出时 $NUM 会被10替代,就有了 '{110}' 这样的结果。

关于Bash中的展开 (expansion) 顺序,其实有不少值得注意的地方,一不留神可能就会踩坑,还是老前辈那句:脚本猛于虎。

以上就是关于shell知识点全部的内容,包括:shell知识点、shell脚本如何从管道里读取数据、shell编程中从键盘上读取变量的关键字为等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9752216.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存