shell编程基础
编译型语言和解释型语言的区别:在具体计算机上实现一种语言,首先要确定的是表示该语言语义解释的虚拟计算机,一个关键的问题是程序执行时的基本表示是实际计算机上的机器语言还是虚拟机的机器语言。这个问题决定了语言的实现。根据这个问题的回答,可以将程序设计语言划分为两大类:编译型语言和解释型语言。编译型语言: 编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因
编译型语言和解释型语言的区别:
在具体计算机上实现一种语言,首先要确定的是表示该语言语义解释的虚拟计算机,一个关键的问题是程序执行时的基本表示是实际计算机上的机器语言还是虚拟机的机器语言。这个问题决定了语言的实现。根据这个问题的回答,可以将程序设计语言划分为两大类:编译型语言和解释型语言。
编译型语言:
解释型语言:
混合型:
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
更多推荐
所有评论(0)