编译型语言和解释型语言的区别:
在具体计算机上实现一种语言,首先要确定的是表示该语言语义解释的虚拟计算机,一个关键的问题是程序执行时的基本表示是实际计算机上的机器语言还是虚拟机的机器语言。这个问题决定了语言的实现。根据这个问题的回答,可以将程序设计语言划分为两大类:编译型语言和解释型语言。
编译型语言:
<wbr><wbr><wbr><wbr> 编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(* .OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型的。编译程序将源程序翻译成目标程序后保存在另一个文件中,该目标程序可脱离编译程序直接在计算机上多次运行。大多数软件产品都是以目标程序形式发行给用户的,不仅便于直接运行,同时又使他人难于盗用其中的技术C、C++、Fortran、Visual
Foxpro、Pascal、Delphi、Ada都是编译实现的。<br><wbr><br><strong>解释型语言:</strong><br><wbr><wbr><wbr><wbr> 解释型语言的实现中,翻译器并不产生目标机器代码,而是产生易于执行的中间代码,这种中间代码与机器代码是不同的,中间代码的解释是由软件支持的,不能直接使用硬件,软件解释器通常会导致执行效率较低。用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的。与编译程序不同的是,解释程序的任务是逐一将源程序的语句解释成可执行的机器指令,不需要将源程序翻译成目标代码后再执行。释程序的优点是当语句出现语法错误时,可以立即引起程序员注意,而程序员在程序开发期间就能进行校正。对于解释型Basic语言,需要一个专门的解释器解释执行
Basic程序,每条语言只有在执行才被翻译。这种解释型语言每执行一次就翻译一次,因而效率低下。一般地,动态语言都是解释型的,如Tcl、Perl、Ruby、VBScript、 JavaScript等。<br><strong>混合型:</strong><br><wbr><wbr><wbr><wbr>Java很特殊,Java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后在Java虚拟机上用解释方式执行字节码。Python 的也采用了类似Java的编译模式,先将Python程序编译成Python字节码,然后由一个专门的Python字节码解释器负责解释执行字节码。(Java虚拟机对字节码的执行相当于模拟一个cpu,而ruby1.8--在虚拟机还未出现前--是通过解释成语法树执行。)</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
shell 脚本语言是一种解释型语言;
shell脚本的实质是 shell命令的有序集合;
1 shell编程的基本过程
1)建立shell文件
2)赋予可执行的权限 chmod a+x filename
3)执行shell文件 ./filename
2 shell 变量
1)用户自定义变量
命名规则通C语言的命名规则;
变量赋值的方式:先写变量名,然后是 = ,紧接着是新值,中间不要有空格。当想取出变量的值时,加“$"符号即可
当赋值的内容中有空格时,注意请加上双引号;
可以使用unset +变量名 可以取消变量的赋值
2)位置变量
$0 :
$1,......$9分别包括第一个到第九个命令行的参数
$# 命令输入的个数
$* $@ :所有命令行的参数
$? :前一个命令的退出状态
$$ 包含正在执行进程的ID号
3)环境变量
4)预定义变量
3 shell程序和语句
shell程序时由 零和多条shell语句构成,shell语句包括:
说明性语句:以#开头到本行结束;
功能性语句 :shell命令、用户程序和其他shell程序;
结构性语句:条件测试,多路分支,循环语句,循环控制语句等等;
1)说明性语句
在shell程序的开头加 #!/bin/sh 意思是告诉OS用那种类型的shell来解释执行改程序
2)功能性语句
read 从标准输入读入一行,并赋值给后面的变量;可阻塞
expr 算术运算命令 主要用于进行简单的整数运算:包括 加+、减-、乘 \* 、除/、 求模 %;
test 可测试三种对象 :字符串 整数 文件属性
tput 用于设置中断的工作模式;
3)结构性语句:
条件语句及多路分支语句用法:
echo -n 表示 省略语句后面的换行符,默认是有换行符的;下面代码中,在打印的语句后面有 \c 表示不换行;\b表示退格 \f表示清屏;
#!/bin/sh
read score
if [ $score -lt 0 ] || [ $score -gt 100 ]
then
echo "Input the invalid score"
exit
fi
case `expr $score / 10` in
10) echo "A" ;;
9) echo "A" ;;
8) echo "B" ;;
7) echo "C" ;;
6) echo "D" ;;
*) echo "NO PASS!!" ;;
esac
for循环语句:
#!/bin/bash
#将当前目录的下文件拷贝到家目录下的文件夹中
MYHOME=$HOME/backup
if [ ! -d $MYHOME ]
then
mkdir $HOME/backup
fi
flist=`ls`
#flist 依次列出当前目录下的文件名,作为单词表
#当带有参数,判断参数是否在当前文件夹内,如果有
#打印出发现并拷贝,如果没有则在终端打印没有发现
#如果不带参数,则将该文件夹所有文件拷贝到#MYHOME下
for file in $flist
do
if [ $# = 1 ]
then
if [ $1 = $file ]
then
echo "$file found"
cp $file $MYHOME
exit
else
echo "$1 not found"
fi
else
cp $file $MYHOME
echo "$file copied"
fi
done
echo ***backup completed***
while 循环语句
i=1
while [ $i -lt 21 ]
do
touch file_$i.sh
echo a b c d e f g >> file_$i.sh
i=`expr $i + 1`
done
read a
echo $a
i=1
while [ $i -lt 21 ]
do
rm file_$i.sh
i=`expr $i + 1`
done
函数:
#!/bin/bash
#从键盘输入一个用户名,判断用户是否在线
#*********函数*************
check_user()
{
user=`who | grep $1 | wc -l`
if [ $user -eq 0 ]
then
return 0
else
return 1
fi
}
#***************************
while true
do
echo "input username:\c"
read uname
#函数名后的的是参数
check_user $uname
if [ $? -eq 1 ]
then
echo "user $uname online"
else
echo "user $uname offline"
fi
done
Shell编程的简单运用,将大量的ip地址,转换成整数进行保密;
下面是写ip地址,保存的ip1.txt中;
#!/bin/sh
i=2
while [ $i -le 22 ]
do
echo 192.168.1.$i >>ip1.txt
i=`expr $i + 1`
done
转换ip地址,转换后保存的ip2.C 中,
read line每次读取一行;
#!/bin/bash
#实现对IP保存成整数
cat $1 |
while read line
do
a=`echo $line | cut -d '.' -f1`
b=`echo $line | cut -d '.' -f2`
c=`echo $line | cut -d '.' -f3`
d=`echo $line | cut -d '.' -f4`
num=`expr $a \* 256 \* 256 \* 256 + $b \* 256 \* 256 + $c \* 256 + $d`
echo $num >> ip2.c
done
下面这个应用是:
1)
#!/bin/bash
MY_PATH="/etc/passwd"
DIR="mywork"
INFO="/var/info"
usr=`whoami`
uid=`cat $MY_PATH | grep $usr | cut -d ':' -f3`
gid=`cat $MY_PATH | grep $usr | cut -d ':' -f4`
if [ $usr = "root" ]
then
MY_HOME="/root"
else
MY_HOME="/home/$usr"
fi
cd $MY_HOME
if [ -e $DIR ]
then
if ! [ -d $DIR ]
then
echo "file exit !"
exit
fi
else
mkdir $DIR
fi
tail -500 $MY_HOME/.bash_history > "$MY_HOME/$DIR/cmd_$uid"
for tmp_file in `ls -a $MY_HOME`
do
if [ -f $tmp_file ]
then
if [ -r $tmp_file ]
then
echo $tmp_file >> $MY_HOME/$DIR/file_$gid
fi
fi
done
echo ----------------->> $INFO
echo $usr >> $INFO
echo -n "cmd_$uid ">>$INFO
cat $MY_HOME/$DIR/cmd_$uid | wc -l >> $INFO
echo -n "cmd_$gid ">>$INFO
cat $MY_HOME/$DIR/cmd_$gid | wc -l >> $INFO
1729

被折叠的 条评论
为什么被折叠?



