关于linux shell 编程

 

以下文章仅仅代表此人个人观点,与我本人无关

 

说到linux 就离不开shell, 其实Windows ,os 都是离不开shell的, shell是计算人机对话的语言。 简单的说你计算机干什么, shell他吧,呵呵。

从最简单的 ./  运行一个程序,到复杂的条件编译, makefile , 项目的组织,等等,他都可以轻松的搞定。

 

功能不可以不说的很强很暴力。

 

简单的运用是把所有的命令都写到一个文件, 他们可以一条一条的执行, 然后你就不用每次都敲命令,等他运行完, 再敲命令。

#! /sbin/sh  这个很重要, 有时不写也可以认, 最好写把,如果你有多个shell的话

cd weather

qmake

make

cp app/weather.app ../buildrpm-weather/opt/apps/

cd ../buildrpm-weather/

sudo./build.sh

cp *.rpm ../opgl

cd ..

 

cd stock

qmake

make

cp app/stock.app ../buildrpm-stock/opt/apps/

cd ../buildrpm-stock

sudo ./build.sh

cp *.rpm ../opgl

cd ..

 

cd tsphost

qmake

make

cp app/tsp.app ../buildrpm-tsp/opt/apps/

cd ../buildrpm-tsp

sudo ./build.sh

cp *.rpm ../opgl

cd ..

 

cd netradio

qmake

make

cp app/netradio.app ../buildrpm-netradio/opt/apps/

cd ../buildrpm-netradio

sudo ./build.sh

cp *.rpm ../opgl

cd ..

 

上面的意思大意是: 编译weather 、stock 、tsphost 、netradio 这四个工程, 然后把他们分别放到不同的目录下打成.rpm 包(rpm 包在linux下等同与Android 的apk,是作为安装程序包),然后把他们放到同一个目录下, 如果不这样做,每次替换一些东西都要很繁杂的命令,让你很烦。

 

下面介绍复杂一点的用法

这个我们大哥哥写的把程序打包的shell 涉及到两个文件

文件一:build.sh

 

#! /bin/sh

user=shejiaming

name=`awk '/Name/{print $2}' module.spec`

// module.spec 文件中Name 开头的行 的第二个参数赋值给name netradio

这里说一下awk 它是个很强大的类是与正则表达式一样的东西,可以自动截取空格,匹配空格

 

echo RPM module name is $name

cp module.spec ${name}.spec

 

[ -n "$(find opt/cfgs -type d -empty)" ] && rm -rfopt/cfgs

-n :示 非空字符串

find opt/cfgs:寻找opt/cfgs

-type d  : 文件类型是目录

-empty:是否为空

&&:表示前面返回值是0(||表示返回非0) linux争取时返回0,错误返回非零,这个你懂的。

意思为如果该目录为空,即目录下没有文件,就删除它,免得打包占空间

[ -n "$(find opt/datas -type d -empty)" ] && rm -rfopt/datas

[ -n "$(find opt/libs -type d -empty)" ] && rm -rf opt/libs

[ -n "$(find opt/apps -type d -empty)" ] && rm -rfopt/apps

[ -n "$(find opt/plugins -type d -empty)" ] && rm -rfopt/plugins

[ -n "$(find opt/deps -type d -empty)" ] && rm -rfopt/deps

[ -n "$(find opt/others -type d -empty)" ] && rm -rfopt/others

[ -n "$(find opt/fonts -type d -empty)" ] && rm -rfopt/fonts

 

tar zcvf ${name}.tar.gz opt usr

把opt 和 usr 目录打包成.tar.gz

cp ${name}.tar.gz /home/${user}/rpmbuild/SOURCES

cp 到某个目录下

cp module.spec /home/${user}/rpmbuild/SOURCES/${name}.spec

cp 到某个目录下

 

rpmbuild -bb ${name}.spec

打包命令

cp /home/${user}/rpmbuild/RPMS/i386/${name}*.rpm ./

把打包后的文件拷贝到当前目录

if [ ! -d "tmp" ]; then

    mkdir tmp

fi

创建tmp目录

mv ${name}.spec tmp

mv ${name}.tar.gz tmp

在此简单介绍一下什么叫做打成rpm包

Rpm打包是linux下常用的一种工程管理方法, 作用是把你的二进制文件和相关的资源,比如说你程序需要读取某个文件什么的,全部打成一个包,然后就很方便上传啊,安装啊,升级啊,等等了,而且也可以压缩。

 

文件二:module.spec

#(*)概述

Summary:   foryou ivi application atmeego

Summary 是一行关于该软件包的描述。

#(*)名称

Name:     netradio

#(*)版本

Version:   1.0.0

#(*)发布次数

Release:   1

License:   GPL

Group:     System

Source:    %{name}.tar.gz

资源

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

告诉 RPM 这是在构建期间临时安装文件的地方

Url:       http://www.foryouge.com

网站地址 描述性没有特殊作用

Prefix:    %{_prefix}

编译 预处理 资源连接

Prefix:    %{_sysconfdir}

%define    userpath /

#(*)作者

Packager:  wangbi

#(*)描述

%description

foryouFont.ttf

libsocketforyou.so

libuartcom.so

autorunapps.sh

killapps.sh

%prep

%setup -c

%install

install -d $RPM_BUILD_ROOT%{userpath}

安装

cp -a ../%{name}*/* $RPM_BUILD_ROOT%{userpath}

%clean

rm -rf $RPM_BUILD_ROOT

rm -rf $RPM_BUILD_DIR/%{name}-%{version}

%files

/opt/*

 

这个文件是rpm 打包的设置文件

 

下面介绍个更加难的,我们的程序安装shell (install-on-ubuntu.sh)

#!/bin/sh

if [ -z "$(grep /usr/opt/cfgs /etc/profile)" ]; then

判断语句

-z:判断字符串为空 返回真 ,就是如果/usr/opt/cfgs 没有在环境变量中添加的话就添加它

 

echo "export APP_CFG_PATH=/usr/opt/cfgs" >> /etc/profile

echo "export APP_PROC_PATH=/usr/opt/apps" >> /etc/profile

echo "export APP_DATA_PATH=/usr/opt/datas" >> /etc/profile

echo "export APP_PLUGIN_PATH=/usr/opt/plugins" >>/etc/profile

echo "export APP_PHONE_DEV=/dev/ttyUSB6" >> /etc/profile

echo "export APP_PPP_DEV=ttyUSB4" >> /etc/profile

#echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/opt/libs">> /etc/profile

fi

 

if [ -z "$(grep /usr/opt/cfgs /etc/ld.so.conf)" ]; then

echo "/usr/opt/libs" >> /etc/ld.so.conf

ldconfig

ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令

ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.

fi

export APP_CFG_PATH=/usr/opt/cfgs

export APP_PLUGIN_PATH=/usr/opt/plugins

export APP_PROC_PATH=/usr/opt/apps

export APP_DATA_PATH=/usr/opt/datas

export APP_PHONE_DEV=/dev/ttyUSB6

export APP_PPP_DEV=ttyUSB4

#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/opt/libs

if [ ! -d "$PWD/debs" ]; then

-d:如果目录存在

    mkdir debs

fi

rm -rf debs/*

cdir=$PWD/rpms

 

for dir in $(find $cdir -type f); do

循环查找当前rpms目录下的所有文件,即每个rpm包

 

filename=`basename $dir`

basename:显示文件或者目录的基本名称,比如/home/chen/juny/XXX.rpm, 返回XXX.rpm

alien -d rpms/$filename

alien –d : 把rpm包转换为deb包,因为ubuntu下只支持deb包,当我们的工程要在ubuntu下跑时,需要转换一下

    mv *.deb debs

 

mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。

 

#    debname=$(echo $filename|sed's/rpm/deb/g')

done

 

cdir=$PWD/debs

for dir in $(find $cdir -type f); do

    filename=`basename $dir`

        dpkg -i --force-alldebs/$filename

dpkg:linux下的一个包安装工具

“Debian” 专门开发的套件管理系统,方便软件的安装、更新及移除

done

 

cd $cdir

 

cp -a /usr/opt/apps/desktop_ubuntu.app /usr/opt/apps/desktop.app

 

 

最后是在meego系统上安装 shell install.sh  语法类似在此不做赘述

 

#!/bin/sh

if [ -z "$(grep /opt/cfgs /etc/profile)" ]; then

echo "export APP_CFG_PATH=/opt/cfgs" >> /etc/profile

echo "export APP_PROC_PATH=/opt/apps" >> /etc/profile

echo "export APP_DATA_PATH=/opt/datas" >> /etc/profile

echo "export APP_PLUGIN_PATH=/opt/plugins" >> /etc/profile

echo "export APP_PLUGIN_PATH=/opt/plugins" >> /etc/profile

echo "chmod 777 /dev/ttyUSB*" >> /etc/profile

echo "ldconfig" >> /etc/profile

#echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/libs">> /etc/profile

fi

 

if [ -z "$(grep /opt/cfgs /etc/ld.so.conf)" ]; then

echo "/opt/libs" >> /etc/ld.so.conf

ldconfig

fi

 

export APP_CFG_PATH=/opt/cfgs

export APP_PLUGIN_PATH=/opt/plugins

export APP_PROC_PATH=/opt/apps

export APP_DATA_PATH=/opt/datas

export APP_PHONE_DEV=/dev/ttyUSB6

export APP_PPP_DEV=ttyUSB4

#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/libs

 

cdir=$PWD/rpms

for dir in $(find $cdir -type f); do

    filename=`basename $dir`

    echo $filename

    rpm -ivh --force --nodepsrpms/$filename

done

cd $cdir

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值