shell常见问题Word文件下载.docx
《shell常见问题Word文件下载.docx》由会员分享,可在线阅读,更多相关《shell常见问题Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
![shell常见问题Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/9/effaf8ee-56d3-432b-a3a5-5d40a9f9d377/effaf8ee-56d3-432b-a3a5-5d40a9f9d3771.gif)
|sed'
s/Bcast.*$//g'
NETMASK=`ifconfigeth0|grep'
s/^.*Mask:
$IP/$NETMASK"
exit
3、用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到/dev目录下。
参考程序:
/bin/sh
FILENAME=
echo“Inputfilename:
”
readFILENAME
if[-c"
$FILENAME"
]
cp$FILENAME/dev
4.请为下列shell程序添加注释,并说明程序的功能和调用方法:
#/etc/rc.d/rc.httpd
#Start/stop/restarttheApachewebserver.
#TomakeApachestartautomaticallyatboot,makethis
#fileexecutable:
chmod755/etc/rc.d/rc.httpd
case"
$1"
in
'
start'
)
/usr/sbin/apachectlstart;
;
stop'
/usr/sbin/apachectlstop;
restart'
/usr/sbin/apachectlrestart;
*)
usage$0start|stop|restart"
;
esac
参考答案:
(1)程序注释
/bin/sh定义实用的shell
#/etc/rc.d/rc.httpd注释行,凡是以星号开始的行均为注释行。
in#case结构开始,判断“位置参数”决定执行的操作。
本程序携带一个“位置参数”,即$1
)#若位置参数为start
#启动httpd进程
)#若位置参数为stop
#关闭httpd进程
#重新启动httpd进程
*)#若位置参数不是start、stop或restart时
#显示命令提示信息:
程序的调用方法
esac#case结构结束
(2)程序的功能是启动,停止或重新启动httpd进程
(3)程序的调用方式有三种:
启动,停止和重新启动。
5.设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。
i=1
groupaddclass1
while[$i-le30]
if[$i-le9];
USERNAME=stu0${i}
else
USERNAME=stu${i}
useradd$USERNAME
mkdir/home/$USERNAME
chown-R$USERNAME/home/$USERNAME
chgrp-Rclass1/home/$USERNAME
i=$(($i+1))
6.编写shell程序,实现自动删除50个账号的功能。
账号名为stud1至stud50。
while[$i-le50]
userdel-rstud${i}
i=$(($i+1))
7.某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:
(1)在下午4:
50删除/abc目录下的全部子目录和全部文件;
(2)从早8:
00~下午6:
00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的bak01.txt文件;
(3)每逢星期一下午5:
50将/data目录下的所有目录和文件归档并压缩为文件:
backup.tar.gz;
(4)在下午5:
55将IDE接口的CD-ROM卸载(假设:
CD-ROM的设备名为hdc);
(5)在早晨8:
00前开机后启动。
参考答案:
解决方案:
(1)用vi创建编辑一个名为prgx的crontab文件;
prgx文件的容:
5016***rm-r/abc/*
(2)、08-18/1***cut-f1/xyz/x1>
>
/backup/bak01.txt
(3)、5017***tarzcvfbackup.tar.gz/data
(4)、5517***umount/dev/hdc
(5)、由超级用户登录,用crontab执行prgx文件中的容:
rootxxx:
#crontabprgx;
在每日早晨8:
00之前开机后即可自动启动crontab。
----------------------------------------------
8.设计一个shell程序,在每月第一天备份并压缩/etc目录的所有容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。
Shell程序fileback存放在/usr/bin目录下。
(1)编写shell程序fileback:
DIRNAME=`ls/root|grepbak`
if[-z"
$DIRNAME"
];
then
mkdir/root/bak
cd/root/bak
YY=`date+%y`
MM=`date+%m`
DD=`date+%d`
BACKETC=$YY$MM$DD_etc.tar.gz
tarzcvf$BACKETC/etc
filebackfinished!
"
(2)编写任务定时器:
001**/bin/sh/usr/bin/fileback"
>
/root/etcbakcron
crontab/root/etcbakcron
或使用crontab-e命令添加定时任务:
01***/bin/sh/usr/bin/fileback
9.有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?
(1)第一种方法:
用户应使用crontab–e命令创建crontab文件。
格式如下:
00**suncp–r/user/backup/tmp
(2)第二种方法:
用户先在自己目录下新建文件file,文件容如下:
0**suncp–r/user/backup/tmp
然后执行crontabfile使生效。
10.设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:
读;
文件所有者的权限为:
读、写、执行;
文件所有者所在组的权限为:
读、执行。
建立程序Pro16如下:
while[i-le50]
if[-d/userdata];
mkdir-p-m754/userdata/user$i
加上-m754就不用写下面那一句了
-p是递归建立目录
#chmod754/userdata/user$i
user$i"
let"
i=i+1"
(或i=$(($i+1))
mkdir/userdata
mkdir-p-m/userdata/user$i
(或i=$(($i+1))
1)如何向脚本传递参数?
./scriptargument
例子:
显示文件名称脚本
./show.shfile1.txt
catshow.sh
cat$1
2)如何在脚本中使用参数?
第一个参数:
$1,第二个参数:
$2
脚本会复制文件(arg1)到目标地址(arg2)
./copy.shfile1.txt/tmp/
catcopy.sh
cp$1$2
3)如何计算传递进来的参数?
$#
4)如何在脚本中获取脚本名称?
$0
5)如何检查之前的命令是否运行成功?
$?
6)如何获取文件的最后一行?
tail-1
7)如何获取文件的第一行?
head-1
8)如何获取一个文件每一行的第三个元素?
awk'
{print$3}'
9)假如文件中每行第一个元素是FIND,如何获取第二个元素
{if($1=="
FIND"
)print$2}'
10)如何调试bash脚本
将-xv参数加到#!
/bin/bash后
例子:
/bin/bash–xv
11)举例如何写一个函数?
functionexample{
Helloworld!
}
12)如何向连接两个字符串?
V1="
Hello"
V2="
World"
V3=${V1}${V2}
echo$V3
输出
HelloWorld
13)如何进行两个整数相加?
V1=1
V2=2
letV3=$V1+$V2
3
据kashu的意见,本题的更佳回答为:
两个整数相加,还有若干种方法实现:
A=5
B=6
echo$(($A+$B))#方法2
echo$[$A+$B]#方法3
expr$A+$B#方法4
echo$A+$B|bc#方法5
BEGIN{print'
$A"
+'
$B"
}'
#方法6
14)如何检查文件系统中是否存在某个文件?
if[-f/var/log/messages]
Fileexists"
15)写出shell脚本中所有循环语法?
for循环:
foriin$(ls);
do
echoitem:
$i
while循环:
COUNTER=0
while[$COUNTER-lt10];
echoThecounteris$COUNTER
letCOUNTER=COUNTER+1
until循环:
COUNTER=20
until[$COUNTER-lt10];
echoCOUNTER$COUNTER
letCOUNTER-=1
16)每个脚本开始的#!
/bin/sh或#!
/bin/bash表示什么意思?
这一行说明要使用的shell。
/bin/bash表示脚本使用/bin/bash。
对于python脚本,就是#!
/usr/bin/python。
(LCTT译注:
这一行称之为释伴行。
17)如何获取文本文件的第10行?
head-10file|tail-1
18)bash脚本文件的第一个符号是什么
19)命令:
[-z"
]&
&
echo0||echo1的输出是什么
20)命令“export”有什么用?
使变量在子shell中可用。
21)如何在后台运行脚本?
在脚本后面添加“&
”。
据kashu的意见,更好的答案是:
nohupcommand&
大部分时间我们可能是远程使用Linux,我碰到过由于网络断线使得在后台运行的command&
没了...
22)"
chmod500script"
做什么?
使脚本所有者拥有可执行权限。
23)"
重定向输出流到文件或另一个流。
24)&
和&
有什么区别
∙&
-希望脚本在后台运行的时候使用它
-当前一个脚本成功完成才执行后面的命令/脚本的时候使用它
25)什么时候要在[condition]之前使用“if”?
当条件满足时需要运行多条命令的时候。
26)命令:
name=John&
echo'
Mynameis$name'
的输出是什么
Mynameis$name
27)bashshell脚本中哪个符号用于注释?
28)命令:
echo${new:
-variable}的输出是什么
variable
29)'
和"
引号有什么区别?
∙'
-当我们不希望把变量转换为值的时候使用它。
∙"
-会计算所有变量的值并用值代替。
30)如何在脚本文件中重定向标准输出和标准错误流到log.txt文件?
在脚本文件中添加"
exec>
log.txt2>
1"
命令。
31)如何只用echo命令获取字符串变量的一部分?
echo${variable:
x:
y}
x-起始位置
y-长度
例子:
variable="
MynameisPetras,andIamdeveloper."
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|whilereadcg
{echo$c;
grep:
$g:
/etc/group|cut-d:
-f1;
}|xargs-n2
36)如何在bashshell中更改标准的域分隔符为"
:
?
IFS="
37)如何获取变量长度?
${#variable}
38)如何打印变量的最后5个字符?
-5}
39)${variable:
-10}和${variable:
-10}有什么区别?
∙${variable:
-10}-如果之前没有给variable赋值则输出10;
如果有赋值则输出该变量
-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"
或"
exportvariable"
哪个正确?
exportvariable
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"
Ilike$item"
item="
Ilike${item}s"
49)写出输出数字0到100中3的倍数(0369…)的命令?
foriin{0..100..3};
doecho$i;
done
for((i=0;
i<
=100;
i=i+3));
doecho"
Welcome$itimes"
50)如何打印传递给脚本的所有参数?
echo$*
echo$
51)[$a==$b]和[$a-eq$b]有什么区别
∙[$a==$b]-用于字符串比较
∙[$a-eq$b]-用于数字比较
52)=和==有什么区别
∙=-用于为变量赋值
∙==-用于字符串比较
53)写出测试$a是否大于12的命令?
[$a-gt12]
54)写出测试$b是否小于等于12的命令?
[$b-le12]
55)如何检查字符串是否以字母"
abc"
开头?
[[$string==abc*]]
56)[[$string==abc*]]和[[$string=="
abc*"
]]有什么区别
∙[[$string==abc*]]-检查字符串是否以字母abc开头
∙[[$string=="
]]-检查字符串是否完全等于abc
57)如何列出以ab或xy开头的用户名?
egrep"
^ab|^xy"
/etc/passwd|cut-d:
-f1
58)bash中$!
表示什么意思?
后台最近执行命令的PID.
59)$?
前台最近命令的结束状态。
60)如何输出当前shell的PID?
echo$$
61)如何获取传递给脚本的参数数目?
(LCTT译注:
和第3题重复了。
62)$*和$有什么区别
∙$*-以一个字符串形式输出所有传递到脚本的参数
∙$-以$IFS为分隔符列出所有传递到脚本中的参数
63)如何在bash中定义数组?
array=("
Hi"
my"
name"
is"
64)如何打印数组的第一个元素?
echo${array[0]}
65)如何打印数组的所有元素?
echo${array[]}
66)如何输出所有数组索引?
echo${!
array[]}
67)如何移除数组中索引为2的元素?
unsetarray[2]
68)如何在数组中添加id为333的元