shell编程基础

 


编译型语言和解释型语言的区别:

在具体计算机上实现一种语言,首先要确定的是表示该语言语义解释的虚拟计算机,一个关键的问题是程序执行时的基本表示是实际计算机上的机器语言还是虚拟机的机器语言。这个问题决定了语言的实现。根据这个问题的回答,可以将程序设计语言划分为两大类:编译型语言和解释型语言。
编译型语言:
     编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(* .OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型的。编译程序将源程序翻译成目标程序后保存在另一个文件中,该目标程序可脱离编译程序直接在计算机上多次运行。大多数软件产品都是以目标程序形式发行给用户的,不仅便于直接运行,同时又使他人难于盗用其中的技术C、C++、Fortran、Visual Foxpro、Pascal、Delphi、Ada都是编译实现的。
 
解释型语言:
     解释型语言的实现中,翻译器并不产生目标机器代码,而是产生易于执行的中间代码,这种中间代码与机器代码是不同的,中间代码的解释是由软件支持的,不能直接使用硬件,软件解释器通常会导致执行效率较低。用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的。与编译程序不同的是,解释程序的任务是逐一将源程序的语句解释成可执行的机器指令,不需要将源程序翻译成目标代码后再执行。释程序的优点是当语句出现语法错误时,可以立即引起程序员注意,而程序员在程序开发期间就能进行校正。对于解释型Basic语言,需要一个专门的解释器解释执行 Basic程序,每条语言只有在执行才被翻译。这种解释型语言每执行一次就翻译一次,因而效率低下。一般地,动态语言都是解释型的,如Tcl、Perl、Ruby、VBScript、 JavaScript等。
混合型:
     Java很特殊,Java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后在Java虚拟机上用解释方式执行字节码。Python 的也采用了类似Java的编译模式,先将Python程序编译成Python字节码,然后由一个专门的Python字节码解释器负责解释执行字节码。(Java虚拟机对字节码的执行相当于模拟一个cpu,而ruby1.8--在虚拟机还未出现前--是通过解释成语法树执行。)

 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





 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值