先把题目和百度到的参考资料粘过来吧orz
弱智答案等ddl过了再粘上来
一是怕错误的答案误导大家,二是怕查重QAQ
实验目的
掌握shell中管道、重定向的用法 学习shell基本语法
进阶内容
注:本部分内容不作为实验必须要求,只是作为对有兴趣深入学习的同学的一些指导。
正则表达式
akw的深入学习http://www.zsythink.net/archives/tag/awk/
sed与grep
实验环境
bash!!!!
实验指导
1. 查看当前shell种类
在shell中输入 echo $shell, 输出应当是bash。
如果不是,可以使用which sh ,该命令将显示sh命令的完整路径, 然后将通过创建软链接使得sh指向bash。(强 行复习软链接)
2. 重定向
Linux中默认输入输出分为3类:
标准输入stdin。标准输入文件的编号是0(牢记linux万物皆文件),默认的设备是键盘,命令执行时从键盘读 取数据。
标准输出stdout。标号为1,默认的设备是显示器,命令的输出会被打印到屏幕上。
标准错误stderr。标号为2,默认的设备是显示器,命令执行产生的错误信息会被发送到标准错误文 件。
重定向的意思就是改变这三个文件实际指向,比如我们希望从某个文件中获取输入,那么就需要将标准输入指向这 个文件。 重定向后命令依然从标准输入获得输入,此时标准输入指向这个文件,故命令能够从这个文件获取输 入。
输入重定向:
命令 < 文件名 , 比如 sort < sp.txt , 把sp.txt文件中的内容作为sort的输入。
输出重定向:
命令 > 文件名 , 比如 cat /etc/passswd > ps.log , cat会输出/etc/passwd中内容,但此时并不会输出到屏 幕上,而是输出到ps.log中。
> 会覆盖原文件中内容, >> 则会将输出追加到原文件末尾。
错误重定向:
命令 2> 文件名 ,比如 gcc -c test.c -o test.out 2 > error.log, 如果gcc编译时出现错误,则会把错误信息输 出到error.log中。
> 会覆盖原文件中内容, >> 则会将输出追加到原文件末尾。
其他
在重定向错误时使用了错误文件的编号2, 其实在输入输出的时候也可以显式写0或1,通常是省略。
&运算符,表示等同于, 2>&1,表示将标准错误从重定向到标准输出指向的文件。如 1>/dev/null ,然 后执行2>&1,此时都指向空设备。
3. 管道
管道作用是将多个命令串连起来,使一个命令的输出作为另一个命令的输入。 命令1 | 命令2 | 命令3 ....| 命令n
ls /etc | grep init 将会输出/etc目录下,文件名包含init的文件/目录。 如果不使用管道,命令就得拆成: ls
/etc > tmp grep init < tmp rm tmp ls /etc | grep init >> testcat test
4. 命令连接符
命令的执行是串行的,一条命令结束才能输入下一条命令,我们可以在命令之间加上;分割命令,从而可以一 行输入所有命令。shell会挨个执行。
&&连接符
命令1 && 命令2 && 命令3 ,shell在判断出这个表达式的真假后就会停止执行。如果命令1为false,可以判断表达式 一定为假,执行停止。如果为true,那么还需要执行命令2,一直执行到能判断真假为止或者执行完被&&连接的命 令。
||连接符
同 && , 执行到能判断真假或者所有被连接命令被执行完为止。&&和||的计算方式同c语言中的&& ||。
4. shell-变量
在shell中使用变量无需定义,在使用的时候创建。并且变量不分类型,shell统一认为是字符串,需要的时候 通过一些命令进行转换。
变量赋值 : 变量名=值 ,等号左右不能够有空格。若字符串中包含空格,则需要用单/双引号括起来。 可以使用readonly将变量改为只读类型。
通过 $ 引用变量值, echo $shell 。 输入变量, read 变量名 。
引用格式返回值
$var 返回变量值
$var 返回变量值
${#var} 返回变量值的长度
${var:start} 返回从start下标到字符串末尾的子串
${var:start:length} 返回从start下标开始,长度为length的子串
实际上还有一些空值判断、字符串替换和正则匹配拆分字符串等,为了精简篇幅,这里不再列举,可自行查阅资料。
环境变量
export 变量名, 将一个已经存在的本地变量修改为环境变量。 export 变量名=值,定义一个环境变量。
位置变量
在执行shell脚本的时候,可以传入参数,如当前有个脚本叫test, 执行sh test arg1 arg2 arg3 ,那么在test中,$0 代表脚本文件名,$1为第一个参数:arg1,以此类推。 使用shift可以将参数左移,此时$1为arg2,$2为arg3, $3为 空 $#为参数数量。
特殊参数含义
$# 传递到脚本的参数数量
$? 前一个命令执行情况,0成功,其他值失败
$$ 运行当前脚本的进程id
$! 运行脚本最后一个命令
$* 传递给脚本或者函数的所有参数
5. shell-变量运算
let
let 表达式 , 会计算此表达式, 如let i=i+1
(())
((i+=3))
expr
echo `expr 3 + 5` , 这里的引号是反引号,tab上面那个键。
6. shell-if
if 条件
then
....
fi
==============================
if 条件; then #这里有分号,同一行需要分号,可以参考前面命令连接符。或者把then放到下一行
...
else
...
fi
==============================
if 条件; then...
elif 条件; then...
else...
fi
条件格式为:
1. 一条完整的命令,或者用|| &&等连接的命令。
2. 字符串比较,[逻辑表达式],[ $shell != "bash" ] 。如果后面字符串不含空格,这里可以不加引号,不等号 是!=。
3. 需要注意的是, []以及其他部分之前需要用空格分离,注意上面的例子,每个部分都用空格分割。
4. 数值比较为 [ $a -lg 6 ], -lt为less than, -le为less equal, -eq为equal , -ne为not equal,-ge为greater than, - gt同理。
5. 常用文件测试为: if [ -d arg ] ,如果arg是目录则为真。-f为文件为真,-r可读为真,-w可写,-x可执行等。
6. shell-select
交互式命令,用户在预定的选项中选择一个。
select 变量 in 列表
do
...
break done
例子见附件
7. shell-case
类似c中switch
case $var in
'选项1') ... ;;
"选项2") ... ;;
选项3 ) ,,,
esac
匹配选项可以用引号,以可以直接列出。然后加上一个 )。
7. shell-for
for 变量 in 变量列表
do
...
done
例子见附件
8. shell-while
while [表达式] do
...
done
例子见附件
8. shell-until
until [表达式] do
...
done
例子见附件
9. shell-函数
[function] 函数名 [()]
{
...
[return int]
}
[]中内容可以省略。根据测试只能省略一个。如果不设置返回值,则返回最后指令的执行结果。
调用方式为 函数名 参数1 参数2
函数中变量也是全局变量,如果要定义局部变量,则在变量赋值前加上local关键字,如 local a=5。 在函数中,引用参数是通过$1、$2等完成,$0代表函数名。
实验内容
1. 完成一键配置源的脚本,功能有,备份原有源,然后添加163或者清华源等,然后使用yum的update选项更 新。可以在脚本中加入自己常用的软件快捷安装命令,比如vs code或者chrome的等等。
先进入yum源配置目录
cd /etc/yum.repos.d
备份系统自带的yum源
mv CentOS-Base.repo CentOS-Base.repo.save
下载yum源
163的yum源:
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
(会在/etc/yum.repos.d下生成相应的文件)
更新完yum源后,更新一下,使操作立即生效
yum makecache
用新的yum更新系统(速度快很多)
yum -y update
2. 计算斐波那契数列,第17个值,禁止打表输出。
shell编程建议看《Linux编程基础》
或者博主南柯梦的5篇系列博客:https://www.cnblogs.com/dongying/p/6262935.html
3. 完成一个简单的交互设计,根据用户输入输出对应内容,具体交互内容随意,要求至少用上select,case和read。
同第二题
4. ls -l /boot/grub2 && cat /boot/grub2/grub.cfg | more,解释此条命令含义。
如果自己的虚拟机中没有这两个目录,不要紧。反正是解释又不是要运行23333
&&的使用格式:command1 && command2,command1成功执行后(返回0),继续执行command2
如果command1执行失败(例如不存在这个目录或没有权限,返回非0) ,此时command2不会执行
(其实这个道理很简单2333不是跟c语言一样嘛,唯一的区别是c语言是判断command的true、false,而shell编程是判断是否成功执行)
同理,command1 && command2 && command3.....&& commandn 只要有一个执行失败,后面的命令就不会被执行了
| 是管道,管道前的输出作为管道后的输入,在这里就是前两个命令的输出用more命令输出
5. 在脚本中通过管道+一些命令使得脚本自动提权,而不是输入密码提权,可能用到的命令echo、sudo、su。
用echo输出密码,再通过管道把密码输入,从而实现不必要手动输入密码提权
6. 设计一个函数,输入一个字符串,要求输出字符串第3位~末尾的字串。
同第二题