写一个自己的shell,并且能运行自己定义的命令或者系统本身的命令,如:cd , ls ,pwd等。
一、大作业题目
写一个自己的shell,并且能运行自己定义的命令或者系统本身的命令,如:cd , ls ,pwd等。
二、解题过程
拟编写一个shell脚本,该脚本可以实现的功能:用户从键盘中输入数字,屏幕会显现出用户输入数字行数的平行四边形
[root@server home]# vim px.sh
脚本源代码如下:
#!/bin/bash
read -p "输入数" p
for ((i=1;i<=$p;i++))
do
for ((o=$i;o>0;o--))
do
echo -n " "
done
for ((j=1;j<=$p;j++))
do
echo -n "*"
done
echo ""
done
给予写好的shell脚本文件可执行的权力:
[root@server home]# chmod u+x px.sh
要想将此shell脚本当作系统命令一样使用,需要将其放入环境变量下
先查看系统环境变量都有哪些路径:
[root@server home]# echo $PATH
可以将可执行文件 px.sh 放入以上任何一个路径下面,例如/usr/local/bin/
[root@server home]# mv px.sh /usr/local/bin/
此时在用户界面中输入 px.sh
命令使用成功
利用C语言编写脚本编一个脚本,若参数y为闰年,则返回1;否则返回0
[root@server home]# vim run.c
源代码如下:
#include
int run(int x)
{
if((x%4==0&&x%100!=0)||x%400==0)
{
printf("1");
}
else printf("0");
}
int main(void)
{
int x;
scanf("%d",&x);
run(x);
return 0;
}
[root@server home]# gcc -o run run.c
[root@server home]# ./run
若在其他路径下执行此文件,需要加上绝对路径 ./home/run
同样系统环境变量都有哪些路径:
[root@server home]# echo $PATH
此时我们可以将run 可执行文件放入到 ./usr/local/bin 当中作为一条系统命令
[root@server home]# mv run /usr/local/bin/
查看是否移动成功
[root@server home]# ll /usr/local/bin/
此时在用户界面中输入 run
命令执行成功
三、shell脚本解题分析
首先shell 是一种脚本语言
脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)
shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言)
shell命令解析器:
系统提供 shell命令解析器: sh ash bash
查看自己linux系统的默认解析:echo $SHELL
shell语法与我们所学的c语言有何不同
1、开头:#!/bin/bash
#!用来声明脚本由什么shell解释,否则使用默认shell
2、单个"#"号代表注释当前行
第一步:编写脚本文件
第二步:加上可执行权限
chmod +x xxxx.sh
(如果为C语言则需要利用gcc编译命令进行编译执行,编译后的文件具备可执行权限)
第三步:运行
运行shell脚本的方法有两种:
作为可执行程序运行
作为解释器参数运行
shell脚本编写如下,并将其保存为test.sh,进入存放此文件目录
#!/bin/bash
echo "Hello World"
当作为可执行程序运行时候
chmod +x test.sh # 赋予可执行权限
./test.sh # 执行程序
当作为解释器参数运行时
/bin/sh test.sh # 执行命令
/bin/php test.php # 执行命令
四、心得体会
(易错点,总结)
Shell脚本总结:
第一行的 #!叫做 Shebang, 然后后面的 /bin/bash 则是指定解释器,既然shell是门解释性语言,自然需要解释器,类似的,如果是 python脚本,则是 #! /bin/python 可能还需要一些编码格式的规定(utf - 8),如果没有指定解释器,默认选择 sh ; 同时还需要给文件可执行权限,否则会报错,虽然我们一般把shell 脚本文件命名为 .sh 的文件(在Linux中文件后缀只能起到标识的作用,没有实际意义);
三种执行方式 (./xxx.sh bash xxx.sh . xxx.sh)
三种执行方式的不同点(./xxx.sh bash xxx.sh . xxx.sh)
./xxx.sh :先按照 文件中#!指定的解析器解析
如果#!指定指定的解析器不存在 才会使用系统默认的解析器
bash xxx.sh:指明先用bash解析器解析
如果bash不存在 才会使用默认解析器
. xxx.sh 直接使用默认解析器解析(不会执行第一行的#!指定的解析器)但是第一行还是要写的
三种执行情况:
打开终端就会有以后个解释器,我们称为当前解释器
我们指定解析器的时候(使用 ./xxx.sh 或 bash xxx.sh)时会创建一个子shell解析 脚本