当前位置:文档之家› 利用shell脚本做可执行安装程序

利用shell脚本做可执行安装程序

利用shell脚本做可执行安装程序
利用shell脚本做可执行安装程序

利用shell脚本制作可执行安装程序

制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin、run等安装脚本的简单制作了。

如在linux 下制作二进制 .bin 文件的制做方法:就是使用cat 命令将执行脚本和打包文件同时放到一个.bin的文件里。这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。

下例就是一名为install.sh脚本,它实现以下功能:

●自动创建用户及用户组

●自动检查网络环境并安装环境包所需要的支撑环境

●显示安装进度

●自动检查并配置防火墙

●自动安装环境包

●自动增加自启动脚本

1.bin文件制作步骤

a)打包文件

tar cvf myapp-env-1.0-linux-x64-installer.tar.gz myapp-env-1.0-linux-x64-installer.tar

b)编写脚本

内容见《install.sh脚本内容》节

c)可执行安装程序制作方法

# cat install.sh myapp-env-1.0-linux-x64-installer.tar.gz > myapp-env-1.0-linux-x64-installer.bin

这样就生成myapp-env-1.0-linux-x64-installer.bin的安装文件,该文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到。

2.安装

chmod 755 myapp-env-1.0-linux-x64-installer.bin

./ myapp-env-1.0-linux-x64-installer.bin

3.install.sh脚本内容

#/bin/bash

PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

curdir=`pwd`

installdir=/myapp

myappuser=myapp

env_name=myapp-env-1.0-linux-x64-installer

sum=0

echo "----------------------------------------------------------------------------"

echo "Welcome to the myapp-env-1.0 for linux-x64 Stack Setup Wizard."

echo "----------------------------------------------------------------------------"

echo " "

echo "Installation folder : $installdir "

echo "----------------------------------------------------------------------------"

echo "checking environment......"

echo " "

#检查网络环境

checknetwork ()

{

netstat=$(ping -c3 https://www.doczj.com/doc/195562583.html,|grep transmitted |awk '{print $4}')

}

#检查网络状态、判断支撑软件是否安装,若没有安装则自动安装。

checkenv ()

{

rpm -qa > /tmp/rpmlist.txt

for soft in $softlist

do

grep "^$soft" /tmp/rpmlist.txt > /dev/null

if [ $? -ne 0 ] ; then

echo "$soft is not installed"

if((netstat==0)) ; then

echo "ping -c3 https://www.doczj.com/doc/195562583.html, ,failed . Please check network"

exit

else

echo "install $soft ...... "

yum -y install $soft | tee -a install.log

fi

else

echo "$soft was installed"

fi

\rm /tmp/rpmlist.txt

done

}

#检查防火墙配置,并自动配置防火墙策略

Config_Firewall ()

{

echo "checking and configuring the firewall rule ....."

echo " "

for port in $myappport

do

iptables -L -n |grep :$port

if [ $? -ne 0 ] ; then

if [ "$port" == "8080" ] ; then

/sbin/iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT

else

/sbin/iptables -I INPUT -p tcp --dport $port -j ACCEPT

fi

echo "$port is not in iptables, the Port: $port is opened"

else

echo "$port is exists"

fi

done

}

#增加用户、密码和用户组、并修改安装目录的属主

adduser()

{

echo "----------------------------------------------------------------------------"

echo " creating UserGroup: $myappuser and username: $myappuser and default passwd: myapp4308 "

#若用户已经存在则不增加

grep "$myappuser:" /etc/group &> /dev/null || groupadd $myappuser

grep "$myappuser:" /etc/passwd &> /dev/null || useradd $myappuser -d $installdir -g $myappuser

#用户密码

echo "myapp4308" | passwd --stdin "$myappuser"

#修改目录属主

chown $myappuser $installdir

chgrp $myappuser $installdir

}

#支撑软件列表

softlist="

gcc

openssl

unixODBC

unixODBC-devel

ncurses-devel

gtk2

xmlto

dialog

"

#应用端口列表

#mysqlport=3306

#wwwport=8080

#mqport=5673

#mqweb=5567

myappport="

8080

5567

5673

3306

"

checknetwork

checkenv $softlist

echo "----------------------------------------------------------------------------"

Config_Firewall $myappport

iptables-save > /etc/sysconfig/iptables

echo "----------------------------------------------------------------------------"

if [ ! -d "$installdir" ] ; then

echo " creating folder $installdir"

mkdir $installdir

else

echo "Warning: cannot create directory $installdir exists. "

echo "----------------------------------------------------------------------------"

exit

fi

adduser

echo "----------------------------------------------------------------------------"

echo "Extract the installation package......"

echo "----------------------------------------------------------------------------"

#将二进制文件从.bin文件里分离出来

sed -n -e '1,/^exit 0$/!p' $0 > "${installdir}/$env_name.tar.gz" 2>/dev/null

if [ $? -eq 0 ];then

echo "Install ......"

cd $installdir

# su $myappuser -c "gunzip < $env_name.tar.gz | tar xvvf -"

# for x in "`tar -tvvzf $env_name.tar.gz`"; do

# one=`echo "$x" | awk '{print $3}'`;

# done

# for x in $one; do

# sum=`expr $sum + $x`;

# done

# s=$sum

s=650028382

#以myappuser用户执行解压并显示进度

su $myappuser -c "gunzip < $env_name.tar.gz | tar xvvf -" | awk -v s=$s '{ a=a+$3; b=(a/s)*100;printf "%d\n",b}' | dialog --gauge "Install ..." 10 70 0

# rm $env_name.tar.gz

cp $installdir/env/scripts/bash_profile $installdir/.bash_profile

echo "----------------------------------------------------------------------------"

echo "Setup has finished installing myapp-env-1.0 for linux-x64 Stack on your computer."

echo " "

echo "usage: $installdir/env/ctlscript.sh help"

echo " $installdir/env/ctlscript.sh (start|stop|restart|status)"

echo " $installdir/env/ctlscript.sh (start|stop|restart|status) mysql"

echo " $installdir/env/ctlscript.sh (start|stop|restart|status) apache"

echo " $installdir/env/ctlscript.sh (start|stop|restart|status) tomcat"

echo " $installdir/env/ctlscript.sh (start|stop|restart|status) rabbitmq"

echo "help - this screen"

echo "start - start the service(s)"

echo "stop - stop the service(s)"

echo "restart - restart or start the service(s)"

echo "status - show the status of the service(s)"

else

echo "$env_name.tar.gz not found"

exit

fi

echo "----------------------------------------------------------------------------"

echo "Are you want to auto start the service on rebooting the unix machine. [Y/N] or [y/n] ? " read ans

#增加服务和自启动

if [ "$ans" = "Y" -o "$ans" = "y" ]; then

\cp $installdir/env/scripts/myapp-env /etc/init.d/.

chmod 755 /etc/init.d/myapp-env

\rm /etc/rc3.d/S96myapp-env

ln -s /etc/init.d/myapp-env /etc/rc3.d/S96myapp-env

#Register Sonar at boot time :

sudo chkconfig --add myapp-env

fi

echo "----------------------------------------------------------------------------"

echo " "

echo "Do you want to start [Y/N] or [y/n] ? "

read ans

if [ "$ans" = "Y" -o "$ans" = "y" ]; then

su $myappuser -c "$installdir/env/ctlscript.sh start"

su $myappuser -c "$installdir/env/ctlscript.sh status"

echo " "

echo "----------------------------------------------------------------------------"

echo "Once started, you can open your browser and access the following URL:"

echo "http://127.0.0.1:8080"

echo "If you enabled the Tomcat Manager Web Application tool, you can access the following URL "

echo "(you will be prompted to enter the user and password set during the installation):"

echo "http://127.0.0.1:8080/manager/html"

fi

exit 0

linux+shell脚本语言基础知识

linux shell脚本语言基础知识 一.shell简介 Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的界面,更确切的说,shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用Shell脚本编程,完成更加复杂的操作。 shell是一个命令解释器,它从输入设备读取命令,再将其转为计算机可以了解的指令,然后执行它。在linux中,shell又不仅是简单的命令解释器,而且是一个全功能的编程环境。 Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell (/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种就足够了。通常用Bash,也就是Bourne Again Shell进行编程。 二.shell使用 1.建立和运行shell程序 shell脚本程序:按照一定的语法结构把若干linux命令组织在一起,是这些命令按照我们的要求完成一定的功能。它可以进行类似程序的编写,并且不需要编译就能执行。(只需修改其权限) 像编写高级语言的程序一样,编写shell程序需要一个文本编辑器,如VI和VIM,通常使用VIM文本编辑器,支持更便利的插入模式。 首先使用VIM编辑器编辑一个hello.sh文件: #!/bin/bash #hello world example

Shell脚本编写基础

Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell 是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统的关键。可以说,shell使用的熟练程度反映了用户对Linux使用的熟练程度。 一、什么是shell 当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shel l(外壳)的程序。那么,shell是什么呢?确切一点说,shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell 来启动、挂起、停止甚至是编写一些程序。 当用户使用Linux时是通过命令来完成所需工作的。一个命令就是用户和shell之间对话的一个基本单位,它是由多个字符组成并以换行结束的字符串。shell解释用户输入的命令,就象DOS里的https://www.doczj.com/doc/195562583.html,所做的一样,所不同的是,在DOS中,https://www.doczj.com/doc/195562583.html,只有一个,而在Linux下比较流行的shell有好几个,每个shell都各有千秋。一般的Linux系统都将bash作为默认的shell。 二、几种流行的shell 目前流行的shell有ash、bash、ksh、csh、zsh等,你可以用下面的命令来查看你自己的shell类型: #echo $SHELL $SHELL是一个环境变量,它记录用户所使用的shell类型。你可以用命令: #shell-name 来转换到别的shell,这里shell-name是你想要尝试使用的shell的名称,如ash等。这个命令为用户又启动了一个shell,这个shell在最初登录的那个shell之后,称为下级的shell或子shell。使用命令: $exit 可以退出这个子shell。 使用不同的shell的原因在于它们各自都有自己的特点,下面作一个简单的介绍: 1.ash ash shell是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。 2.bash bash是Linux系统默认使用的shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的缩写,内部命令一共有40个。Linux使用它作为默认的shell是因为它有诸如以下的特色: (1)可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令。 (2)自动通过查找匹配的方式给出以某字符串开头的命令。 (3)包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。 3.ksh ksh是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。 4.csh

常用shell脚本

如何用脚本实现分割文件 #!/bin/bash if [ $# -ne 2 ]; then echo 'Usage: split file size(in bytes)' exit fi file=$1 size=$2 if [ ! -f $file ]; then echo "$file doesn't exist" exit fi #TODO: test if $size is a valid integer filesize=`/bin/ls -l $file | awk '{print $5}'` echo filesize: $filesize let pieces=$filesize/$size let remain=$filesize-$pieces*$size if [ $remain -gt 0 ]; then let pieces=$pieces+1 fi echo pieces: $pieces i=0 while [ $i -lt $pieces ]; do echo split: $file.$i: dd if=$file of=$file.$i bs=$size count=1 skip=$i let i=$i+1 done echo "#!/bin/bash" >; merge echo "i=0" >;>; merge echo "while [ $i -lt $pieces ];" >;>; merge echo "do" >;>; merge echo " echo merge: $file.$i" >;>; merge echo " if [ ! -f $file.$i ]; then" >;>; merge echo " echo merge: $file.$i missed" >;>; merge

Shell脚本编程详解-吐血共享

第12章 Shell 脚本编程 ● Shell 命令行的运行 ● 编写、修改权限和执行Shell 程序的步骤 ● 在Shell 程序中使用参数和变量 ● 表达式比较、循环结构语句和条件结构语句 ● 在Shell 程序中使用函数和调用其他Shell 程序 12-1 Shell 命令行书写规则 ◆ Shell 命令行的书写规则 对Shell 命令行基本功能的理解有助于编写更好的Shell 程序,在执行Shell 命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令,例如: [root@localhost root]# ls a* -l;free;df 长Shell 命令行可以使用反斜线字符(\)在命令行上扩充,例如: [root@localhost root]# echo “ this is \ >long command ” This is long command 注意: “>”符号是自动产生的,而不是输入的。 12-2 编写/修改权限及执行Shell 程序的步骤 ◆ 编写Shell 程序 ◆ 执行Shell 程序 Shell 程序有很多类似C 语言和其他程序设计语言的特征,但是又没有程序语言那样复杂。Shell 程序是指放在一个文件中的一系列Linux 命令和实用程序。在执行的时候,通过Linux 操作系统一个接一个地解释和执行每条命令。首先,来编写第一个Shell 程序,从中学习Shell 程序的编写、修改权限、执行过程。

12-2-1 编辑Shell程序 编辑一个内容如下的源程序,保存文件名为date,可将其存放在目录/bin下。 [root@localhost bin]#vi date #! /bin/sh echo “Mr.$USER,Today is:” echo &date “+%B%d%A” echo “Wish you a lucky day !” 注意: #! /bin/sh通知采用Bash解释。如果在echo语句中执行Shell命令date,则需要在date 命令前加符号“&”,其中%B%d%A为输入格式控制符。 12-2-2 建立可执行程序 编辑完该文件之后不能立即执行该文件,需给文件设置可执行程序权限。使用如下命令。[root@localhost bin]#chmod +x date 12-2-3 执行Shell程序 执行Shell程序有下面三种方法: 方法一: [root@localhost bin]#./ date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法二: 另一种执行date的方法就是把它作为一个参数传递给Shell命令: [root@localhost bin]# Bash date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法三: 为了在任何目录都可以编译和执行Shell所编写的程序,即把/bin的这个目录添加到整个环境变量中。 具体操作如下: [root@localhost root]#export PATH=/bin:$PATH [root@localhost bin]# date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day !

shell脚本练习题

shell脚本例子集锦(习题总结) 练习一:写一个脚本 1.设定变量FILE的值为/etc/passwd 2.依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么 形如:(提示:LINE=`wc -l /etc/passwd | cut -d" " -f1`) Hello,root,your UID is 0. 3.统计一个有多少个用户 答案一:#!/bin/bash file="/etc/passwd" LINES=`wc -l $file | cut -d" " -f1` for I in `seq 1 $LINES`;do userid=`head -$I $file | tail -1 |cut -d: -f3` username=`head -$I $file | tail -1 |cut -d: -f1` echo "hello $username,your UID is $userid" done echo "there are $LINES users" 答案二:#!/bin/bash file=/etc/passwd let num=0 for I in `cat $file`;do username=`echo "$I" | cut -d: -f1` userid=`echo "$I" | cut -d: -f3` echo "Hello,$username,your UID is $userid" num=$[$num+1] done echo "there are $num users" 练习二:写一个脚本 1.切换工作目录至/var 2.依次向/var目录中的每个文件或子目录问好,形如: (提示:for FILE in /var/*;或for FILE in `ls /var`;) Hello,log 3.统计/var目录下共有多个文件,并显示出来 答案:#!/bin/bash cd /var let num=0 for I in `ls /var/*`;do echo "hello $I" num=$[$num+1] done echo "the number of files is $num" 练习三:写一个脚本 1.设定变量file的值为/etc/passwd

实验十三 shell脚本练习

上机实验内容: 1、请编写一个脚本,其功能是将当前用户的根目录下的work目录打包为名为“user’s-workdir-in-YYMMDD”的tar包(提示:参考用date建立文件) 要求:i)若该目录不存在,显示“dir not exist” ii)若该文件不是目录类型,显示“work is a type”,此处的type为文件类型 #!/bin/bash [ -e /work ] && tar -cvf "User's-workdir-in-`date +%Y%m%d`.tar" /work || echo "dir not exist" declare filetype="" [ -f /work ] && filetype="常规文件" [ -d /work ] && filetype="目录文件" [ -b /work ] && filetype="块设备文件" [ -c /work ] && filetype="字符设备" [ -S /work ] && filetype="套接字文件" [ -p /work ] && filetype="FIFO(管道)文件" [ -L /work ] && filetype="连接文件" [ "$filetype" != "" ] && echo "work is a $filetype" 2、编写一个脚本,其中包含一个打印函数,用于将多次输入的字符组合为一个字符串 要求:i)使用函数实现新值的输出 ii)使用循环语句完成多个字符的输入,直到输入字符串EOF才完成字符串的累加#!/bin/bash function add(){ str="$str"$input echo $str } read -p "请输入一个字符串或者输入EOF结束本次操作:" input declare str while [ "$input" != "EOF" ] do add read -p "请输入一个字符串或者输入EOF结束本次操作" input done 3、自我练习:设计一个运算器,实现“加、减、乘、除”功能。 (四则运算:符号使用+、-、*、/) #!/bin/bash

常用shell脚本指令

常用shell脚本命令 1、显示包含文字aaa的下一行的内容: sed -n '/aaa/{n;p;}' filename 2、删除当前行与下一行的内容: sed -i '/aaa/{N;d;}' filename 3、删除当前行与下两行的内容: sed -i '/aaa/{N;N;d;}' filename 依次类推,删除三行,则为{N;N;N;d;},分析知:N为next 4、得出以空格为分割的字符串中单词的个数,即统计个数: awk ' { print NF } ' 如显示字符串VALUE中的单词个数,其中VALUE为:aaa bbb ccc ddd ee f 则执行 echo $VALUE | awk ' { print NF } ' 后的结果为6 5、在linux中建立一个文件与另一文件的链接,即符号链接 ln -s /var/named/chroot/etc/named.conf named.conf 这要就建立了当前目录的文件named.conf对/var/named/chroot/etc/named.conf 的符号链接。即操作named.conf就意味着操作实际文件/var/named/chroot/etc/named.conf ,这时用ll命令查看的结果如: lrwxrwxrwx 1 root root 32 Mar 22 12:29 named.conf -> /var/named/chroot/etc/named.conf 注意:当用sed来通过named.conf来删除一部分信息时,会将符号链接的关系丢掉,即会将named.conf变成一个实际文件。所以需对实际文件进行删除操作。 6、显示指定字符范围内的内容: 如:显示文件test.txt中字符#test begin与#test end之间所有的字符 sed -n "/#test begin/,/#test end/p" test.txt 或 awk "/#test begin/,/#test end/" test.txt 在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则. 1. 单引号和双引号的区别 单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符,不会作变量的引用,直接输出字符窜。请看如下例子: [root@linux ~]# name=HaHa [root@linux ~]# echo $name HaHa [root@linux ~]# myname="$name is wow" [root@linux ~]# echo $myname HaHa is wow [root@linux ~]# myname='$name is wow'

shell脚本之前的基础知识

第十二章学习shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员。目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目。有的单位甚至用shell脚本的编写能力来衡量这个linux系统管理员的经验是否丰富。笔者讲这些的目的只有一个,那就是让你认真对待shell脚本,从一开始就要把基础知识掌握牢固,然后要不断的练习,只要你shell脚本写的好,相信你的linux求职路就会轻松的多。笔者在这一章中并不会多么详细的介绍shell脚本,而只是带你进入shell脚本的世界,如果你很感兴趣那么请到网上下载相关的资料或者到书店购买相关书籍吧。 在学习shell 脚本之前,需要你了解很多关于shell的知识,这些知识是编写shell脚本的基础,所以希望你能够熟练的掌握。 【什么是shell】 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些。回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。 笔者接触的linux发布版本(Redhat/CentOS)系统默认安装的shell叫做bash,即Bourne Again Shell,它是sh(Bourne Shell)的增强版本。Bourn Shell 是最早行起来的一个shell,创始人叫Steven Bourne,为了纪念他所以叫做Bourn Shell,检称sh。那么这个bash有什么特点呢? 1)记录命令历史 我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令。这些命令保存在用户的家目录中的.bash_history文件中。有一点需要你知道的是,只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中。 与命令历史有关的有一个有意思的字符那就是”!”了。常用的有这么几个应用:(1)!! (连续两个”!”),表示执行上一条指令;(2)!n(这里的n是数字),表示执行命令历史中第n条指令,例如”!100”表示执行命令历史中第100个命令;(3)!字符串(字符串大于等于1),例如!ta,表示执行命令历史中最近一次以ta为开头的指令。

linux Shell(脚本)编程入门 实例讲解详解

linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash 的大姐,bourne shell中运行)。 如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。程序必须以下面的行开始(必须方在文件的第一行): 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: 然后,您可以通过输入: ./filename 来执行您的脚本。 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。 变量 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:

个人整理shell脚本编程笔记

shell脚本编程学习笔记(一) 一、脚本格式 vim shell.sh #!/bin/bash//声明脚本解释器,这个‘#’号不是注释,其余是注释 #Program://程序内容说明 #History://时间和作者 二、shell变量的种类 用户自定义变量:由用户自己定义、修改和使用 与定义变量:Bash与定义的特殊变量,不能直接修改 位置变量:通过命令行给程序传递执行的参数 1、定义变量: 变量名要以英文字母或下划线开头,区分大小写。 格式:变量名=值 输出变量:echo $变量名 2、键盘输入为变量内容: 格式:read [-p "信息"] 变量名 如:read -p "pewase input your name:" name 3、不同引号对变量的作用 双引号"":可解析变量,$符号为变量前缀。 单引号'':不解析变量,$为普通字符。 反引号``:将命令执行的结果输出给变量。 三、shell条件测试 1、test命令: 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数字。 格式:test 条件表达式[ 条件表达式] (注意:[]与表达式之间存在空格) 2、常见的测试类型: 测试文件状态 格式:[ 操作符文件或目录] 如:if [ -d /etc ] then echo "exists" else echo "not exists" fi 常见的测试操作符: -d:测试是否为目录 -e:测试目录或文件是否存在 -f:测试是否为文件 -r:测试当前用户是否有读权限 -w:测试当前用户是否有写权限 -x:测试当前用户是否有执行权限

Shell脚本的特殊符号

这篇文章主要介绍了shell脚本中常见的一些特殊符号和它的作用详解,总结的很简洁,容易看懂,需要的朋友可以参考下 在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我们编写的代码更加简洁和高效,这里给大家汇总下: 1、{} 大括号: 用法一:通配符扩展 eg: ls my_{finger,toe}s 这条命令相当于如下命令的组合: ls my_fingers my_toes eg: mkdir {userA,userB,userC}-{home,bin,data} 我们将得到userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data,use rC-home, userC-bin, userC-data,这几个目录。 用法二:可用于语句块的构造,语句之间用回车隔开。如果你想在某些使用单个语句的地方(比如在AND或OR列表中)使用多条语句,你可以把它们括在花括号{}中来构造一个语句块。 eg: { grep -v “$cdcatnum” $strack_file > $temp_file cat $temp_file > $strack_file echo cat -n file1 } (注:以上大括号中的四句命令够成了一个语句块) 用法三:参数扩展 ${name:-default} 使用一个默认值(一般是空值)来代替那些空的或者没有赋值的变量na me; ${name:=default}使用指定值来代替空的或者没有赋值的变量name; ${name:?message}如果变量为空或者未赋值,那么就会显示出错误信息并中止脚本的执行同时返回退出码1。 ${#name} 给出name的长度 ${name%word} 从name的尾部开始删除与word匹配的最小部分,然后返回剩余部分${name%%word} 从name的尾部开始删除与word匹配的最长部分,然后返回剩余部分${name#word} 从name的头部开始删除与word匹配的最小部分,然后返回剩余部分${name##word} 从name的头部开始删除与word匹配的最长部分,然后返回剩余部分

Shell编程基础.pdf

为什么要进行shell编程 Linux系统中虽然有各种各样的图形界面工具,但shell仍然是一个非常灵活的工具。Shell不仅集合了大量命令,还是一门非常棒的编程语言。借助shell,大量任务能实现自动化;shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建立一个脚本 Linux中有许多种不同的shell,通常我们使用bash (bourne again shell) 进行shell编程因为bash不仅免费(自由)且易于使用。本文提供的脚本都用bash(当然大多数情况下,这些脚本同样可以在bash的前辈, bourne shell中运行)执行。 如同其他语言一样,我们可以使用任意一种文字编辑器,比如nedit、kedit、emacs、vi 等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行): 代码: #!/bin/bash 符号#!用来告诉系统执行该脚本的程序,本例使用/bin/sh。编辑完了,如果要执行该脚本,还必须使其可执行: 代码: chmod +x filename 这样输入 ./filename 便可执行该脚本。 注释 shell脚本中以# 开始的行表示注释,直到一行的结束。我们真诚的建议你在脚本中使用注释,这样即便在相当长时间内没有使用该脚本,你也能在短时间内明白该脚本的作用和工作原理;此外还有很重要的原因——有了注释,更利于和别人分享你的脚本。 变量 在其它编程语言中,你必须使用变量。shell编程中,所有变量都由字符串组成,并且不需要声明。要给一个变量赋值,你可以这么写: 代码: 变量名=值

Shell编程基础教程

1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须放在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。 当编辑好脚本时,如果要执行该脚本,还必须使其可执行。要使脚本可执行: chmod +x filename 这样才能用./filename 来运行 1.1.2 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。 1.1.3 变量 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写: #!/bin/sh #对变量赋值: a="hello world" # 现在打印变量a的内容: echo "A is:" echo $a 有时候变量名很容易与其他文字混淆,比如: num=2 echo "this is the $numnd" 这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量: num=2 echo "this is the ${num}nd"

这将打印: this is the 2nd 1.1.4 环境变量 由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。 1.1.5 Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: s虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。 常用命令语法及功能: echo "some text": 将文字内容打印在屏幕上 ls: 文件列表 wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数 cp sourcefile destfile: 文件拷贝 mv oldname newname : 重命名文件或移动文件 rm file: 删除文件 grep 'pattern' file: 在文件内搜索字符串比如:grep 'searchstring' file.txt cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令 cat file.txt: 输出文件内容到标准输出设备(屏幕)上 file somefile: 得到文件类型 read var: 提示用户输入,并将输入赋值给变量 sort file.txt: 对file.txt文件中的行进行排序 uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3 find: 搜索文件比如:根据文件名搜索find . -name filename -print tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux

Linux Shell脚本结构解析以及常用语句说明_总体了解

目录 2 BASH 的基本语法 (2) 2.1最简单的例子—— Hello World! (2) 2.2关于输入、输出和错误输出 (3) 2.3BASH 中对变量的规定(与C 语言的异同) (5) 2.3.1BASH 中的变量介绍 (5) 2.3.1.1简单变量 (5) 关于变量,我们需要注意下面几点: (6) 在比较操作上,整数变量和字符串变量各不相同,详见下表: (7) 列出了BASH 中用于判断文件属性的操作符,见下表: (7) 2.3.1.2关于局部变量 (8) 2.3.2 BASH中的变量与C 语言中变量的区别 (9) 2.4 BASH 中的基本流程控制语法 (9) 2.4.1 if...then...else (9) 2.4.2 for (10) 2.4.3 while (12) 2.4.4 until (12) 2.4.5 case (12) 2.4.6 break/continue (14) 2.5函数的使用 (14) (1)函数的定义 (14) (2)函数的参数与返回值 (14) 3 BASH 中的特殊保留字 (15) 3.1保留变量 (15) 3.2随机数 (16) 3.3运算符 (16) 3.4变量的特殊操作--${var}的一些用法 (17) 4.BASH中的其他高级问题 (17) 4.1 BASH 中对返回值的处理 (18) 4.2用BASH 设计简单用户界面 (18)

4.3在BASH 中读取用户输入 (19) 4.4 一些特殊的惯用法 (20) (1)() 一对括号 (20) (2):冒号--- 1空命令2求取后面变量的值 (20) 4.5 BASH 程序的调试 (21) 4.6 关于BASH2 (21) 2 BASH 的基本语法 最简单的例子——Hello World! 关于输入、输出和错误输出 BASH 中对变量的规定(与C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1最简单的例子——Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解BASH。 用vi 编辑器编辑一个hello 文件如下: #!/bin/bash -----#!表示此文件为可执行脚本文件,后边跟的是该文件所用的命令解释器# This is a very simple example-----#注释语句 echo Hello World 这样最简单的一个BASH 程序就编写完了。这里有几个问题需要说明一下: 一,第一行的#! 是什么意思 二,第一行的/bin/bash 又是什么意思 三,第二行是注释吗 四,echo 语句 五,如何执行该程序 #! 是说明hello 这个文件的类型的,有点类似于Windows 系统下用不同文件后缀来表示

shell脚本中一些常见的特殊符号

shell脚本中一些常见的特殊符号 https://www.doczj.com/doc/195562583.html,/blog-15563-5823.html 在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我们编写的代码更加简洁和高效,这里给大家汇总下: 1、{} 大括号: 用法一:通配符扩展 eg: ls my_{finger,toe}s 这条命令相当于如下命令的组合: ls my_fingers my_toes eg: mkdir {userA,userB,userC}-{home,bin,data} 我们将得到 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data,userC-home, userC-bin, userC-data,这几个目录。 用法二:可用于语句块的构造,语句之间用回车隔开。如果你想在某些使用单个语句的地方(比如在AND或OR列表中)使用多条语句,你可以把它们括在花括号{}中来构造一个语句块。 eg: { grep -v “$cdcatnum” $strack_file > $temp_file cat $temp_file > $strack_file echo cat -n file1 } (注:以上大括号中的四句命令够成了一个语句块) 用法三:参数扩展 ${name:-default} 使用一个默认值(一般是空值)来代替那些空的或者没有赋值的变量name;${name:=default}使用指定值来代替空的或者没有赋值的变量name; ${name:?message}如果变量为空或者未赋值,那么就会显示出错误信息并中止脚本的执行同时返回退出码1。 ${#name} 给出name的长度 ${name%word} 从name的尾部开始删除与word匹配的最小部分,然后返回剩余部分${name%%word} 从name的尾部开始删除与word匹配的最长部分,然后返回剩余部分${name#word} 从name的头部开始删除与word匹配的最小部分,然后返回剩余部分${name##word} 从name的头部开始删除与word匹配的最长部分,然后返回剩余部分 (注,name为变量名,word为要匹配的字符串) 用法三在处理字符串和未知变量时,是很有用的。 2、[] 中括号: 用法一:通配符扩展: 允许匹配方括号中任何一个单个字符 eg: ls /[eh][to][cm]* 相当于执行 ls /etc /home(若有/eom目录,就相当于会执行ls /etc /home /eom) 注:在mkdir命令下不能扩展 用法二:用于条件判断符号: []符号可理解为指向test命令的一个软链接,所以其用法可完全参照test,将test位置替换为[便可。eg: if [ “$?” != 0 ] 等价于 if test “$?” != 0 then echo “Executes error”

shell脚本常用命令

1.目录相关操作: cd [相对路径或绝对路径]切换目录。例:cd /var/spool/mail 将切换到/var/spool/mail 目录下去,可以使用相对路径或绝对路径,cd ..是返回上一层目录,cd ~是返回自己的主目录,cd –代表前一个工作目录 pwd显示目前所在目录 mkdir [-mp] 目录名称新建新的目录.–m配置文件案的权限,-p直接建立多层目录 rmdir [-p] 目录名称删除空的目录. –p连同上一层”空的”目录也一并删除 ls [-aAdfFhilnrRSt] 目录名称 ls [--color={never,auto,always}] 目录名称 ls [--full-time] 目录名称查看文件与目录: -a全部的文件,连同隐藏文件一起列出; -A 列出全部文件(连同隐藏文件,但不列出..和.这两个目录); -d仅列出目录本身,而不是列出目录内的文件数据; -f直接列出结果,而不进行排序; -F 根据文件、目录等信息给予附加数据结构; -h 将文件容量以易读的方式列出; -i 列出inode号码; -l 列出长数据串,包含文件的属性与权限等数据; -n列出UID与GID,而非用户与用户组的名称; -r 将排序结果反向输出; -R 连同子目录内容一起列出; -S 以文件容量大小排序,而不是用文件名排序; -t 依据时间排序,而不是文件名排序; --color=never不要依据文件特性给予颜色显示; --color=always 显示颜色; --color=auto 让系统自行依据设置来判断是否给予颜色; --full-time 以完整时间模式输出; --time={atime,ctime} 输出访问时间或改变权限属性时间而非内容改变时间;

几个好玩的shell脚本编程实验

几个好玩的shell脚本 班级:09自动化姓名:刘振威学号:1112120102 一、实验目的 1.掌握Shell编程的基本方法 2.了解Shell脚本的基础知识 3.学习编写Shell脚本编程 二、实验要求 1.完成一个简单Shell程序的编写和执行过程; 2.设计一个Shell程序,显示欢迎界面; 3.尝试编写一些好玩的Shell 脚本。 三、实验准备 Shell是一个命令语言解释器,它拥有自己内建的Shell命令集,Shell也能被系统中其他应用程序调用。用户在提示符下输入的命令都由Shell解释后传给Linux核心。 Shell的另一个重要特性是它自身就是一个解释型的程序设计语言。Shell 程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。Shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个执行的Shell程序中。 Shell脚本的建立和执行 Shell程序可以存放在文件中,这种被Shell解释执行的命令文件称为Shell脚本(Shellscript),也称做Shell文件或者Shell 过程。Shell脚本可以包含任意从键盘输入的UNIX命令。 1)Shell脚本的建立 建立Shell脚本的方法同建立普通文本文件的方法相同,利用编辑器(如vi)进行程序录入和编辑加工。例如,要建立一个名为ex1的Shell的脚本,可以在提示符后打入命令: $ vi ex1 2)执行Shell脚本的方式执行Shell脚本的方式基本上有三种: (1)输入定向到Shell

这种方式是用输入重定向方式让Shell从给定文件中读入命令行并进行相应处理。其一般形式是:$ sh < 脚本名例如, $ sh < ex1 (2)以脚本名作为Shell参数。其一般形式是: $ sh 脚本名 [参数] 例如, $ sh ex2 /usr/mengqc/usr/liuzhy (3)将Shell脚本改为有执行权限的文件,由正文编辑器(如vi)建立的Shell脚本,用户通常是不能直接执行的,需要利用命令chmod将它改为有执行权限。例如: $ chmod +x ex2 四、实验步骤 1.完成一个简单Shell程序的编写和执行过程; 该实例会显示当前的日期时间、执行路径、用户账号及所在的目录位置。 在文本编辑器中输入下列内容,并存为showinfo: #!/bin/bash #This script is a test! echo –n "Date and time is: " date echo –n "The Executable path is : "$PATH echo "Your name is : `whoami` " echo –n "Your Current directory is : " pwd #end 使用tcsh执行上面的Shell脚本: tcsh showinfo 2.设计一个Shell程序,显示欢迎界面。 #!/bin/bash #filename:Welcome first() {

shell脚本

Shell编程教程 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 总的来说shell有两种含义: 1 命令:是用户与系统之间的桥梁 2 语言:可以使用shell语法以及命令来进行各种小程序的编写,类似于windows下的.bat(批处理文件) 下面,让我们一起来看看shell是如何工作的: 编写一个shell需要三个步骤 A 建立shell程序 B 改变shell程序属性chmod +x shell pro C 运行shell程序在当前路径下 ./shell pro a建立shell脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且

很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash的大姐,bourne shell中运行)。 如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。 程序必须以下面的行开始(必须放在文件的第一行):# !/bin/bash******** # This is a sample programe # Author:esnow # Date:2002-03-10 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/bash来执行程序。 b 改变shell脚本属性 当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: chmod +x filename c运行shell脚本 然后,您可以通过输入: ./filename 来执行您的脚本。

相关主题
文本预览
相关文档 最新文档