第14章 Linu 下的編程_第1頁(yè)
第14章 Linu 下的編程_第2頁(yè)
第14章 Linu 下的編程_第3頁(yè)
第14章 Linu 下的編程_第4頁(yè)
第14章 Linu 下的編程_第5頁(yè)
已閱讀5頁(yè),還剩110頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

臺(tái)

J

P

W

N

s

14-1Linux下的編程

Linux的發(fā)行版中包含了很多軟件開(kāi)發(fā)工具。

它們中的很多是用于C和C++應(yīng)用程序開(kāi)發(fā)

的,本文介紹了在Linux下能用于C應(yīng)用程

序開(kāi)發(fā)和調(diào)試的工具。

Linux下的進(jìn)行網(wǎng)頁(yè)的開(kāi)發(fā)。

Linux下的shell編程。

案例一

?1、編寫簡(jiǎn)單的C程序,并用Linux下的gcc編譯器

編譯。

?2、編寫簡(jiǎn)單C++程序,并用Linux下的g++編譯器

編譯

14-2GCC介紹

GCC(GNUCCompiler)是GNU推出的功能

強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器,是GNU的代

表作品之一。GCC是可以在多種硬件平臺(tái)上編

譯出可執(zhí)行程序的超級(jí)編輯器,其執(zhí)行效率

與一般編譯器相比平均效率要高出20%?30%。

14-2GCC介紹

GNUC編譯器(GCC)是一個(gè)全功能的ANSI

C兼容編譯器.如果你熟悉其他操作系統(tǒng)或

硬件平臺(tái)上的一種C編譯器,你將能很快地

掌握GCC.本節(jié)將介紹如何使用GCC和一些

GCC編譯器最常用的選項(xiàng)。

14-2GCC介紹

GCC編譯器能將C、C++語(yǔ)言源程序、匯編程

序和目標(biāo)程序編譯、連接成可執(zhí)行文件,如果

沒(méi)有給出可執(zhí)行文件的名字,GCC將生成一個(gè)

名為a.out的文件。在Linux系統(tǒng)中,可執(zhí)行文

件沒(méi)有統(tǒng)一的后綴,系統(tǒng)從文件屬性來(lái)區(qū)分可

執(zhí)行文件和不可執(zhí)行文件。而GCC則通過(guò)后綴

來(lái)區(qū)別輸入文件的類別。

*14-2GCC介紹

■以.c為后綴的文件,是C語(yǔ)言源代碼文件;

?以.a為后綴的文件,是由目標(biāo)文件構(gòu)成的檔案庫(kù)文件;

?以.C,.cc或.cpp為后綴的文件,是C++源代碼文件;

■以.h為后綴的文件,是程序所包含的頭文件;

?以.i為后綴的文件,是已經(jīng)預(yù)處理的C源代碼文件;

?以.ii為后綴的文件,是已經(jīng)預(yù)處理的C++源代碼文件;

?以.m為后綴的文件,是Objective-C源代碼文件;

?以.。為后綴的文件,是編譯后的目標(biāo)文件;

■以.s為后綴的文件,是匯編語(yǔ)言源代碼文件;

?以.S為后綴的文件,是經(jīng)過(guò)預(yù)編譯的匯編語(yǔ)言源代碼文

件。

14-2GCC介紹

?使用GCC編譯程序時(shí),編譯過(guò)程可以被細(xì)分為四

個(gè)階段:

?預(yù)處理(Pre-Processing)

?編譯(Compiling)

?匯編(Assembling)

?鏈接(Linking)

14-2GCC介紹

預(yù)處理(Pre-Processing)

使用-E參數(shù)可以讓GCC在預(yù)處理結(jié)束后停止編譯

過(guò)程:生成.i的文件

#gcc-Ehello,c-ohello,i

14-2GCC介紹

?編譯(Compiling)

下一步是將hello,i編譯為目標(biāo)代碼,這可以通

過(guò)使用-c參數(shù)來(lái)完成:

#gcc-chello,i-ohello,o

14-2GCC介紹

?匯編(Assembling)和鏈接(Linking)

#gcchello,o-ohello

14-2GCC使用格式

?gcc而令格式:gcc[options][filenames]o

-Xlanguagefilename:設(shè)定文件使用的語(yǔ)言,使后綴名無(wú)

效。

例如:gcc-xchello,cd

//指定文件所使用的語(yǔ)言為C,雖然其后綴為.cd

-xnonefilename:讓GCC根據(jù)文件后綴,自動(dòng)識(shí)別文件類

型。

例如:gcc-xchello,cd-xnonetest,c

//將根據(jù)test,c的后綴名來(lái)識(shí)別文件,而指定hello,cd

的文件類型為C文件

?-C:只激活預(yù)處理、編譯和匯編,即只是把程序編譯成捐

j文件(目標(biāo)文件)。

?例如:#gcc-chello,c

//生成.o的obj文件:hello,o

?-s:只激活預(yù)處理和編譯,即把文件編譯成匯編代碼。

?例如:#gcc-Shello,c

〃生成.s的匯編代碼,可以使用文本編輯器進(jìn)

行查看。

-E只激活預(yù)處理而不生成文件,要把它重定向到一個(gè)輸出文

件里。

例如:#gcc-Ehello,c>check.txt

-o:制定目標(biāo)名稱,例如:

#gcc-ohellohello.c

#gcc-ohello,asm-Shello.c

?-includefile:包含某個(gè)代碼,簡(jiǎn)單來(lái)說(shuō),就是當(dāng)某一個(gè)

文件需要另一個(gè)文件的時(shí)候,就可以用該選項(xiàng)進(jìn)行設(shè)定,功

能就相當(dāng)于在代碼中使用#include〈filename>o

?例如#gcchello,c-include/root/pic.h

//編譯hello,c文件時(shí)包含根目錄下的pic.h頭文件。

案例解答整卷

1、編寫簡(jiǎn)單的C程序,并用Linux下的gcc編譯器編譯。

?1)用vi編譯器編輯程序如下:

[root@localhostroot]Vihello,c

ttinclude<stdio.h>

intmain()

{〃〃

printf("Helloworld,Linuxprogramming!\n/z);

return0;}

2)執(zhí)行命令編譯和運(yùn)行程序,目標(biāo)程序名為hell。

_root@localhostroot]#gcchello.c-ohello

_root@localhostroot]#./hello

Helloworld,Linuxprogramming!

?g++andGCC分別是gnu的c&c++編譯器GCC/g++在執(zhí)行!

譯工作的時(shí)候,總共需要4步:

?預(yù)處理,生成.i的文件。

?將預(yù)處理后的文件不轉(zhuǎn)換成匯編語(yǔ)言,生成文件.s。

?由匯編變?yōu)槟繕?biāo)代碼(機(jī)器代碼)生成.。的文件。

?連接目標(biāo)代碼,生成可執(zhí)行程序。

■g++和GCC區(qū)別

?兩者都可以編譯C和C++代碼,但它們的區(qū)別如下:

(1).后綴為.c的,GCC把它當(dāng)作是C程序,而g++當(dāng)作是C++程

序;后綴為.cpp的,兩者都會(huì)認(rèn)為是C++程序,雖然C++是c

的超集,但是兩者對(duì)語(yǔ)法的要求是有區(qū)別的。C++的語(yǔ)法規(guī)

則更加嚴(yán)謹(jǐn)一些。

?(2).編譯階段,g++會(huì)調(diào)用GCC,對(duì)于C++代碼,兩者是等價(jià)

的,但是因?yàn)镚CC命令不能自動(dòng)和C++程序使用的庫(kù)聯(lián)接,

所以通常用g++來(lái)完成鏈接,為了統(tǒng)一起見(jiàn),干脆編譯/鏈接

統(tǒng)統(tǒng)用g++了,這就給人一種錯(cuò)覺(jué),好像cpp程序只能用g++

似的。

案例解答

2、編寫簡(jiǎn)單C++程序,并用Linux下的g++編譯器編譯

1)用vi編輯器編輯程序testl.cc內(nèi)容如下:

[root@localhostroot]vitestl.cc

ttinclude<iostream>

usingnamespacestd;

intmain(){

cout<〈"thisisac++test”<<endl;

return0;

)

2)執(zhí)行命令編譯和運(yùn)行程序,目標(biāo)程序名為testl

_root@localhostroot]#g++-otestltestl.cc

_root@localhostroot]#./testl

thisisac++test

案例二

Linux下的簡(jiǎn)單php編程

14-3PHP簡(jiǎn)介

PHP最初是在1994年RasmusLerdorf開(kāi)始計(jì)劃發(fā)展的。在1

995年以PersonalHomePageTools(PHPTools)開(kāi)

始對(duì)外發(fā)表第一個(gè)版本。

PHP跟Apache服務(wù)器緊密結(jié)合。

其源代碼完全公開(kāi)。

14-3PHP簡(jiǎn)介

PHP具有強(qiáng)大的數(shù)據(jù)庫(kù)功能,其特點(diǎn)就是內(nèi)置了對(duì)很多數(shù)據(jù)

庫(kù)的支持,而不再需要重新擴(kuò)充

PHP作為一種能快速學(xué)習(xí)、跨平臺(tái)、有良好數(shù)據(jù)庫(kù)交互能力

的開(kāi)發(fā)語(yǔ)言,使UNIX/Linux有了一種與ASP媲美的開(kāi)發(fā)

語(yǔ)言。

14-3PHP簡(jiǎn)介

PHP具有良好的安全性,由于PHP本身的代碼開(kāi)放,所以其代

碼在許多工程師手中進(jìn)行了檢測(cè),同時(shí)與Apache編譯在

一起的方式也可以使其具有靈活的安全設(shè)定。所以到現(xiàn)

在為止,PHP具有公認(rèn)的安全性能。

總而言之,PHP是進(jìn)行動(dòng)態(tài)網(wǎng)頁(yè)編程的一個(gè)非常好的工具。

14-3PHP簡(jiǎn)介

?用戶可以從PHP官方站點(diǎn)(http://www.php.net/downl

oads.php)自由下載該軟件,目前該軟件的最新版本

為:PHP5.3.0.tar.gzo使用PHP5.0以上版本必須要下

載libxml2,可以從網(wǎng)址:http://archive,linuxfrom

scratch,org/blfs-museum/5.O-prel/BLFS-BOOK-5.0-

PRE1-HTML/general/libxml2.html下載,

安裝步驟

?#cplibxml2-2.5.11.tar.gz/usr

/將該工具包拷貝到/usr目錄

?#cd/usr〃切換工作目錄

?#tarxzvflibxml2-2.5.11.tar.gz〃解壓

?#cdlibxml2-2.5.11〃切換目錄

?#./configure〃進(jìn)行編譯前配置

?#make//編譯

?#makeinstall〃執(zhí)行makeinstall

〃接著安裝PHP5.3.0

#cpphp5.3.0.tar.gz/usr//將該工具包拷貝到/usr

#cd/usr〃切換工作目錄

#tarxzvfphp5.3.0.tar.gz//解壓

#cdphp5.3.0〃切換目錄

#./configure//進(jìn)行編譯前配置

#make〃編譯

#makeinstall//執(zhí)行makeinstall

14-4Apache+php的應(yīng)用

?為了正常運(yùn)行PHP5.0以上版本,還需要編輯apache配置文

件httpd.conf的部分選項(xiàng),并保存即可。土要改動(dòng)如下:

?^WAddTypeapplication/x-tar.tgz下力口一4亍AddTypeapp

lication/x-httpd-php.phpo

?^#LoadModulephp5_modulemodules/libphp5.$0的#號(hào)去

?在Directoryindexindex,html.htmlindex,html.var后

面加index,php使其把index,php

?找到#don'tuseGroup#-lonthesesystems!,把該行

下面的用戶名和組改為Userapache和Groupapacheo

?去掉#serverName前面的扎并把后面的IP改成實(shí)際的Web服

務(wù)器IP。

?找到DocumentRoot/usr/local/apache2/htdocsv,把/u

sr/local/apache2/htdocs改為用戶存放網(wǎng)頁(yè)文件的路徑。

?為了使中文網(wǎng)頁(yè)不出現(xiàn)亂碼,找到AddDefaultCharsetiso8

859-1選項(xiàng),把后面的iso8859-1改為gb2313。

一個(gè)簡(jiǎn)單的PHP程序

<HTML>

<HEAD>

<TITLE>

<?php

Echo“Thisisatest";〃網(wǎng)頁(yè)的標(biāo)題

?>

</TITLE>

</HEAD>

<B0DY>

OH1

OHR

<?php

$friend="myfriend”;

Echo“HelloWorld!v;〃顯示的字符串

Echo"$friend”;

?>

</B0DY>

</HTML>

案例三Linux下的shell編程

1.編寫簡(jiǎn)單的shell程序,顯示當(dāng)前的日期和時(shí)間。

2.通過(guò)函數(shù)調(diào)用的方法上述功能。

3.用循環(huán)語(yǔ)句編寫「1000累計(jì)求和程序。

14.1什么是Shell

14.2shell腳本介紹

14.3shell變量

14.4控制結(jié)構(gòu)語(yǔ)句

14.1shell的概念-

?Shen是核心程序之外的指令解釋器,是一個(gè)程序,同時(shí)是

一種命令語(yǔ)言和程序設(shè)計(jì)語(yǔ)言,作為命令語(yǔ)言,它可以交互

式地解析、執(zhí)行用戶輸入的命令,作為程序設(shè)計(jì)語(yǔ)言,它定

義了各種變量和參數(shù),并且提供了許多在高級(jí)程序設(shè)計(jì)語(yǔ)言

的程序控制結(jié)構(gòu)。

14.1.2shell的類型

?它雖然不是Linux操作系統(tǒng)核心的一部分,但它調(diào)

用系統(tǒng)核心中的大部分功能來(lái)執(zhí)行程序建立文件,

并以并行的方式來(lái)協(xié)調(diào)各個(gè)程序的運(yùn)行。

?Shell的類型:ash、bash、csh>ksh

?ash:shell是由KennethAlmquist編寫的,

Linux中占用系統(tǒng)資源最少的一個(gè)小shell它只

包含24個(gè)內(nèi)部命令,因而使用起來(lái)很不方便。

?bash:bash是Linux系統(tǒng)默認(rèn)使用的shell,

它由BrianFox和ChetRamey共同完成,是Bou

rneAgainShell的縮寫,內(nèi)部命令一共有40

個(gè)。Linux默認(rèn)的shell。

?ksh:ksh是Kornshell的縮寫,由EricGisin編寫,共有4

2條內(nèi)部命令。該shell最大的優(yōu)點(diǎn)是幾乎和商業(yè)發(fā)行版的k

sh完全兼容,這樣就可以在不用花錢購(gòu)買商業(yè)版本的情況下

嘗試商業(yè)版本的性能了。

?

?csh:csh是Linux比較大的內(nèi)核,它由以WiHiamJoy為代

表的共計(jì)47位作者編成,共有52個(gè)內(nèi)部命令。該shell其實(shí)

是指向/bin/tcsh這樣的一個(gè)shell,也就是說(shuō),csh其實(shí)就

是tcsh。

14.L2shell的類型$'I

/etc/shells:使用cat/etc/shells可以獲得系統(tǒng)

中有哪些命令解釋器

[root*:^bogonroot]#cat/etc/sheII

/bin/sh

/bin/bash

/sbin/nologtn

/bin/bash2

/bin/ash

/biii/bsh

/bin/tcsh

/biii/csh

[root^^bogonroot]M$

bash:$:conrrandnotfpund

[rootci^bogon「oct]"whoami

root

[root'Sbogonroo11#

14.1.2shell的類型

?echo$SHELL可獲得當(dāng)前運(yùn)行的shell

?所有的程序都在shell中運(yùn)行

?shell中可以運(yùn)行子shell(可用如下命令)

#/bin/csh

#exit

[rool^wrool]|lecho$SHELL

/bin/bash

[rool^vw『oolN/hin/csh

[rool^wwS]UIs

aeepyhsor_yp2^,txlIxl

anaconda-ks.cf;evolutionpyh.lar.gzsorjp2,txtvid

hfile.tar.gzsor_p.txtsorjpS.Ixtyvv

Cgeesorjpl23,txtsorjp.txlyyyjxt

caffeineinstall.logsorjpl2.txtsorj.lxlyyy.ixt.iar

dinstall.log.syslogsorjpl3.txttest

docp.txlsorjpl.ixlte\t3.txl

[「oolMww1#exit

/?

exit

[root^wroot]l|

14.1.3bash的特性廝

?bash是默認(rèn)的Linuxshell

,特點(diǎn):

1.利用上下方向鍵可以快速使用使用過(guò)的命令。

2.利用Tab補(bǔ)全命令或者查找有關(guān)命令(以指定字符串或者字符開(kāi)頭的命

令列表)

3.提供自動(dòng)幫助,獲得幫助信息

#help

14.2shell腳本介紹

本節(jié)內(nèi)容:

?使用shell腳本的原因

?shell腳本基本元素。

?shell腳本運(yùn)行方式。

14.2.1使用shell腳本的原因

?shell腳本在處理自動(dòng)循環(huán)或大的任務(wù)方面可

節(jié)省大量的時(shí)間,且功能強(qiáng)大。

?對(duì)于不同的UNIX和LINUX,使用一段shell腳

本將需要一些小小的改動(dòng)才能運(yùn)行通過(guò)。

14.2.2shell腳本基本元素

?腳本不是復(fù)雜的程序,它是按行解釋的。腳本第一行

總是以#!/bin/sh開(kāi)始,這段腳本通知shell使用系

統(tǒng)上的Bourneshell解釋器。

■任何腳本都可能有注釋,加注釋需要此行的第一個(gè)字

符為#,解釋器對(duì)此行不予解釋。在第二行注釋中寫

入腳本名是一個(gè)好習(xí)慣。

?腳本從上到下執(zhí)行,運(yùn)行腳本前需要增加其執(zhí)行權(quán)限。

確保正確建立腳本路徑,這樣只用文件名就可以運(yùn)行

它了。

14.2.3shell腳本運(yùn)行方式

1.編輯腳本

[root@localhostroot]#vicleanup〃啟動(dòng)vi編輯器

#!/bin/sh//shell腳本第一行開(kāi)始

#name:cleanup〃腳本名稱

#thisisageneralcleanupscript〃腳本功能解釋

echo“startingcleanup...wait”〃腳本內(nèi)容

rm/usr/local/apps/log/*.log〃刪除目錄下的日志文件

tail-40/var/adm/messages>/tmp/messages〃最后40行轉(zhuǎn)移至臨時(shí)文件

rm/var/adm/messagesII刪除/var/adm/messages

mv/tmp/messages/var/adm/messages〃臨時(shí)文件移動(dòng)

/var/adm/messages

echoufinishedcleanup”〃清理完成

?上述腳本清除/var/adm/下信息,并刪除/usr/local/apps/log下所有注冊(cè)信

息。

2.使用chmod命令增加腳本執(zhí)行權(quán)限

[root@localhostroot]ftchmodu+xcleanup

3.運(yùn)行腳本,只敲入文件名即可。

[root@localhostroot]#./cleanup

14.3shell變量

-變量可以定制用戶本身的工作環(huán)境。使用變量

可以保存有用信息,使系統(tǒng)獲知用戶相關(guān)設(shè)置。

變量也用于保存暫時(shí)信息。

14.3.1本地變量

14.3.2環(huán)境變量

14.3.3位置變量

14.3.4特定變量參數(shù)

14.3.1本地變量

?本地變量在用戶現(xiàn)在的shell生命期的腳本中使用。

?優(yōu)點(diǎn):用戶不能對(duì)其他的shell或進(jìn)程設(shè)置此變量有效

?使用變量時(shí),如果用花括號(hào)將之括起來(lái),可以防止shell誤解

變量值,盡管不必一定要這樣做,但這確實(shí)可用。

?要設(shè)置一本地變量,格式為:

$variable-name=value或${variable-name=value}

變量設(shè)置時(shí)的不同模式

變量設(shè)置模式說(shuō)明變量設(shè)置模式說(shuō)明

Variable-name=value丫a1'141310-1141116二丫&1113設(shè)置實(shí)際值至1ka1'12

ble-name

Variable-name+alue如果設(shè)置了variable-name,則重設(shè)其值

Variable-name:?value如果未設(shè)置variable-name,顯不未定義用戶

錯(cuò)誤信息

Variable-name?value如果未設(shè)置variable-name,顯示系統(tǒng)錯(cuò)誤信

Variable-name:=value如果未設(shè)置variable-name,設(shè)置其值

Variable-name:-value如果未設(shè)置variable-name,設(shè)置其值,但值

是替換

顯示變量

?使用echo命令可以顯示單個(gè)變量取值,并在變

量名前加$,例如:

#GREAT_PICTURE二"diehard”

ftecho${GREAT_PICTURE}

diehard

清除變量

使用unset命令清除變量。

unsetvariable-name

例如:

[root@localhostroot]#pc=enterprice

[root@localhostroot]#echo${pc}

Enterprice

[root@localhostroot]ttunsetpc

[root@localhostroot]#echo${pc}

[root@localhostroot]#

測(cè)試變量是否已經(jīng)設(shè)置⑴

有時(shí)要測(cè)試是否已設(shè)置或初始化變量。

如果未設(shè)置或初始化,就可以使用另一值。此命令格式為:

{variable:-value}

如果設(shè)置了變量值,則使用它,如果未設(shè)置,則取新值。

?#colour=blue

?#echo"theskyis${colour:-grey}today”

?Theskyisbluetoday

測(cè)試變量是否已經(jīng)設(shè)置⑵&tl

□變量colour取值blue,echo打印變量colour時(shí),首

先查看其是否已賦值,如果查到,則使用該值?,F(xiàn)

在清除該值,再來(lái)看看結(jié)果。

[root@localhostroot]#colour=blue

[root@localhostroot]unsetcolour

[root@localhostroot]#echo“theskyis${colour:-grey}

today”

Theskyisgreytoday

上面的例子并沒(méi)有將實(shí)際值傳給變量,需使用下述

命令完成止匕功能:${variable:=value)

實(shí)用的例子

?查詢工資清單應(yīng)用的運(yùn)行時(shí)間及清單類型。在運(yùn)行時(shí)間及類

型輸入時(shí),敲回車鍵表明用戶并沒(méi)有設(shè)置兩個(gè)變量值,將使

用缺省值(03:00和Weekly),并傳入at命令中以按時(shí)啟動(dòng)

作業(yè)。

$vivartest

#!/bin/$h

#vartest

echo“whattimedoyouwishtostartthepayroll[03:00]:H

readTIME

echo"processtostartatS{TIME:=03:00}OK"

echo"Isitamonthlyorweeklyrun[Weekly]:M

readRUN_TYPE

echo"Runtypeis${RUN_TYPE:?Weekly}M

at-fworkSRUN.TYPESTIME

實(shí)用的例子

?在輸入域敲回車鍵,輸出結(jié)果如下:

,vartest

whattinedoyouwishtostartthepayroll[03:00]:

processtostartat03:00OK

Isitamonthlyorweeklyrun[Weekly]:

RuntypeisWeekly

warning:commandswillbeexecutedusing/bin/sh

job15at2007-01-1003:00

14.3.2環(huán)境變量

?環(huán)境變量用于所有用戶進(jìn)程。不像本地變量

只用于現(xiàn)在的shell,環(huán)境變量可用于所有

子進(jìn)程,這包括編輯器、腳本和應(yīng)用。

14.3.2環(huán)境變量

?環(huán)境變量可以在命令行中設(shè)置,但用戶注銷時(shí)

這些值將丟失,因此最好在.profile文件中

定義。系統(tǒng)管理員可能在/etc/profile文件中

已經(jīng)設(shè)置了一些環(huán)境變量。將之放入profile

文件意味著每次登錄時(shí)這些值都將被初始化。

設(shè)置環(huán)境變量

?傳統(tǒng)上,所有環(huán)境變量均為大寫。環(huán)境變量應(yīng)用于用戶進(jìn)程前,

必須用export命令導(dǎo)出。

?環(huán)境變量與本地變量設(shè)置方式相同。

?VARIABLE-NAME=value;exportVARIABLE-NAME

在兩個(gè)命令之間是一個(gè)分號(hào),也可以這樣寫:

?VARIABLE-NAME=value

?ExportVARIABLE-NAME

顯示環(huán)境變量

?顯示環(huán)境變量與顯示本地變量一樣,例如:

?#CONSOLE=ttyl;exportCONSOLE

?#echo$CONSOLE

?ttyl

查看所有的環(huán)境變量

?使用env命令可以查看所有的環(huán)境變量

PATHa/sbin:/bin:/usr/sbin:/usr/bin:/usr/XHR6/bin:/root/bin:

CONSOLE就tyl

HOME^/hone/dave

ASD^sdf

SHELL^/bin/sh

PS1=$

USER^dave

清除環(huán)境變量

?使用unset命令清除環(huán)境變量:

[root@localhostroot]#unsetMYPASS

[root@localhostroot]#echo${MYPASS}

[root@localhostroot]#

編寫簡(jiǎn)單的Shen程序,顯示當(dāng)前的日期和時(shí)間。

1.用vi編輯器編輯其文件functest,內(nèi)容如下:

#!/bin/bash〃shell編程

#functest//文件名

Functionhello()//函數(shù)實(shí)現(xiàn)

{

Echo^hello,todayis'data'"〃顯示今天的日期

}

Echo“nowgoingtothefunctionhello”

〃函數(shù)調(diào)用之前顯示

Hello//函數(shù)調(diào)用

Echo"backfromfunction"http://函數(shù)調(diào)用后顯示

如⑻涮眶)儲(chǔ)?終端工)轉(zhuǎn)到但ffi!l)J(H)

J:一.一_一-------―▲.,..???■???????'?—

#!/bin/bash

fffunctest

luncIionhellos)\

echoheIIo?todayisdale'

I,

echo'nowgoinglothefunctionheIIo*

hello

etho'hackfromfunctionf

2.修改文件的權(quán)限

[root@localhostroot]ttchmod755functest

3.執(zhí)行該腳本,并顯示結(jié)果

[root@localhostroot]#./functest

Nowgoingtothefunctionhello

Hellotodayis六8月1308:4041CST2009

Backfromfunction

[root@localhostroot]#

[rool^localhoslrool])lvifunclesl

frool^localhoslroot])1chnod755funrtesl

[rool^localhoslrool])l,/fundesl

nowgoingtoIhefunctionhello

heIIo.todayis四11月1308:40:41CST2008

backfromfundion

[rool^localhoslrool]H

編寫簡(jiǎn)單的Shen程序,通過(guò)函數(shù)調(diào)用的方法顯示當(dāng)前的日期

和時(shí)間。

1.用vi編輯器編輯文件functest,內(nèi)容如下:

#!/bin/bash//shell編程

#functest

.hellofun〃文件名

Echo“nowgoingtothefunctionhellov

Hello//函數(shù)調(diào)用

Echo“backfromfunction”

2.用vi編輯器編輯文件hellofun,內(nèi)容如下:$戰(zhàn).

#!/bin/bash〃shell編程呢

#hellofun

Functionhello()//函數(shù)實(shí)現(xiàn)

{一

Echovhello,todayis'date'“〃顯示今天

的日期

}

3.修改文件的權(quán)限

[root@localhostroot]ttchmod755functest

4.執(zhí)行該腳本,并顯示結(jié)果》

[root@localhostroot]#./functest

Nowgoingtothefunctionhello

Hellotodayis六8月1308:4041CST2009

Backfromfunction

zn<£>編輯?查印u終端①特到幫助(U>

#!Zbin/basb

Mfunctest

#functionheIlo()

?\

#echo'heIIo.todayisdate

heIlofun

echo'nowgoingtothefunctionheIio"

heIIo

echobackfromfunction'

functest*[已轉(zhuǎn)技]13L,182c工13,0-1全都

ruoMK心Il>os匕BX

文件(E>蝙和@也看(丫?終端3轉(zhuǎn)到(蟲

#!/bm/bash

#heIIofun

IunI.HheIIo

echoheIIortodayiidate

return1

I*hellofun*[已較短]7L.83c7,1金都日

"".

[rooitalhojlrooibvihcllofun

[rool^localhoslrool]>vifunded

[niol^localhojlrool]dchiwd755(imctesl

[rdoltalhoslroolld./funrtesl

nowgoingtoihefunctionhello

heIIo,todayisWII月1308:44:20(ST200H

jbadfromfunction

[rooi@localhosi『ool"|

set命令

?在$口(加£.profile文件中設(shè)置環(huán)境變量時(shí),還有另一種方法導(dǎo)出

這些變量。使用set命令-a選項(xiàng),即set-a指明所有變量直接被

導(dǎo)出。不要在/etc/profile中使用這種方法,最好只在自己的$口

OME.profile文件中使用。

$vi.profile

#.profile

set-a

MAIL=/usr/mai1/${LOCNAME:?}

PATH=$PATH:$HOME:bin

#

EDITOR二vi

TERMvt22O

ADMIN=/usr/adm

PS1=,,%hostname

7二二■?如初<詼儂一必修勿?二然RX

編輯?杳和義終端山轉(zhuǎn)到(9)幫助口

二」-?-----”■■,?一?PC一,一1-----二二£',、,、一—?一,?

i#)/bin/bash

中funclest

ionheIlo()

eC

13

.heIIofun

se1

echonowgoingtoIheiuncIionhello”

heIIo

echobackfromfunction'

*functest,[己轉(zhuǎn)換]I4L,192c10.7全部

ropt'S'kradhosL-B|X

文件出編轉(zhuǎn)⑥)杏看(丫?終端CDHMG)柄助包)

SESSJCN_M\N\GER=loca1/locaIhosl.locaIdonsin:/tlip/.ICE-unix/1837

SFELL=/bin/bash

ShELLCPTS=braceexpand:hashaII:inleractive-cormenIs

SKLVL=3

SSH_AGENT_PI01891

SSH_ASKPAS$=/usr/Iibexec/openssh/gnom?-ssh-askpass

SSH_ALTH_S(XX=/tnp/ssh-XXLfe\Vvf)d/agenl.1837

TERM=xterm

UIAO

USER=rool

LSERN\NE=root

\MMXAM029360392

X^LTIIKITY^/roo1/.Xuuthority

XM:D1FIERS=@im=Chinput

_=hc1lofun

heIIo(>

I..

echowheIIo.todayisdatc,:

return1

I

nowgoingtothefunctionheIIo

heIIo.todayis四11H1308:49:54CST2008

backfromfunction

[root@locaIhostrooI]#I+

文件編4W&rr終端CD?二,,'!i?H.>

I

SESS1<JN_MVN\GER=IocaI/IocaIhost.IocaIdomiin:/trrp/.1CE-unix/1837

SFf£LL=/bin/bash

SFELL<3PTS=braceexpandzha(^a1Iiinteractive-corrrn?nts

SILVL=3

SSH_/\CENT_PID=1891

SSH_/\SKP/\SS-/usr/Iibexec/openssh/gnorre-ssh-askpass

SSI_SOCK=/tnp/ssh-XXI^\^d/agent.1837

TERM=xterm

UID=4)

IJKER=rooI

lJSERN\NE=root

WNTXAM0=29360392

XXLTirJRlTY=/root/.Xaulhority

XMJD1F1ERS=@im=Chinput

__=he1Iofun

he1lo<>

(

echo*heilo?todayisdate*:

return1

I

nowgoingtothefunctionheIio

a/functest:Iine13:heIio:corrmindnotfound

backfromfunclion

M[root@locaIhoslroot]#

1433位置變量

?如果要向一個(gè)shell腳本傳遞信息,可以使用位置參數(shù)

完成此功能。參數(shù)相關(guān)數(shù)目傳入腳本,此數(shù)目可以任

意多,但只有前9個(gè)可以被訪問(wèn),使用shift命令可以

改變這個(gè)限制。參數(shù)從第一個(gè)開(kāi)始,在第9個(gè)結(jié)束;

每個(gè)訪問(wèn)參數(shù)前要加$符號(hào)。第一個(gè)參數(shù)為3表示預(yù)

留保存實(shí)際腳本名字。無(wú)論腳本是否有參數(shù),此值均

可用。

14.3.3位置變量

?如果向腳本傳送DidYouSeeTheFullMoon信息,下

面的表格講解了如何訪問(wèn)每一個(gè)參數(shù)。

SOSIS2S3S4S5S6S7S8

明卡名字DidYou阮TheFullMoon

位置變量實(shí)例

1)用vi編輯器編輯腳本param

[root@localhostroot]#viparam

#!/bin/sh

ttparam

Echo“Thisisthescriptname:$0"

Echo“Thisisthefirstparameter:$1"

Echo“Thisisthesecondparameter:$2"

Echo“Thisisthethirdparameter:$3"

Echo“Thisistheforthparameter:$4"

Echo“Thisisthefifthparameter:$5"

Echo“Thisisthesixthparameter:$6"

Echo“Thisistheseventhparameter:$7"

Echo“Thisistheeightparameter:$8"

Echo“Thisistheninthparameter:$9"

位置變量實(shí)例

2)執(zhí)行腳本

[root@localhostroot]#paramDidYouSeeTheFull

Moon

Thisisthescriptname/param

Thisisthefirstparameter:Did

Thisisthesecondparameter:You

Thisisthethirdparameter:See

Thisistheforthparameter:The

Thisisthefifthparameter:Full

Thisisthesixthparameter:Moon

Thisistheseventhparameter

Thisistheeightparameter

Thisistheninthparameter

$viparam2

#!/bin/sh

echo”Helloworldthisis$0calling11

$param2

Helloworldthisis./param2calling

向系統(tǒng)命令傳遞參數(shù)

$vifindfile

#!/bin/sh

#findfile

find/-name$1-print

$findfilepasswd

/etc/passwd

/etc/uucp/passwd

/usr/bin/passwd

14.3.4特定變量參數(shù)

特定shell變量

S#傳遞到腳本的參數(shù)個(gè)數(shù)

s*以?個(gè),嚀劑;顯小所儕硼柳滋的參乳與位置變最不同,此選項(xiàng)參數(shù)可超過(guò)。個(gè)

SS腳本運(yùn)行的當(dāng)前進(jìn)程m號(hào)

S!后臺(tái)運(yùn)行赧后一個(gè)進(jìn)程的進(jìn)程H)號(hào)

S?與$#和師但是使用時(shí)加引號(hào),并在引號(hào)中返網(wǎng)每個(gè)參數(shù)

S-顯示版II使用的當(dāng)前選項(xiàng),與就喻令功能相忖

S?顯示最后命令的退出狀菰。表示收有鐲露其他任何值翻有魁。

特定變量參數(shù)舉例

#!/bin/sh

#allparams

echo"Thisisthescriptname:S0H

echo"Thisisthefirstparameter:’1”

echo“Thisisthesecondparameter?$2”

echo"Thisisthethirdparameter:$3”

echo"Thisisthefourthparameter:$4”

echo"Thisisthefifthparameter:S5”

echo”Thisisthesixthparameter:$6”

echo”Thisistheseventhparameter:$7”

echo“Thisistheeighthparameter:$8”

echo"Thisistheninthparameter:$9"

echo“Thenumberofargumentspassed

echo"Showallarguments:$+'

echo”ShowmemyprocessID?$5"

echo"Showmetheargumentsinquotes:*'”S@"

echo*'Didmyscriptgowithanyerrors:

結(jié)果

?

MerryChristmasMrLawrence

Thisisthescriptname./param

ThisisthefirstparameterMerry

ThisisthesecondparameterChristmas

ThisisthethirdparameterMrLawrence

Thisisthefourthparameter

Thisisthefifthparameter

Thisisthesixthparameter

Thisistheseventhparameter

Thisistheeighthparameter

Thisistheninthparameter

Thenumberofargumentspassed3

ShowallargumentsMerryChristmasMrLawrence

ShowmemyprocessID630

ShowmethearguaentsinquotesnMerryn'*ChristmasMMMrLawrence"

Didmyscriptgowithanyerrors0

最后的退出狀態(tài)

?$?返回0??梢栽谌魏蚊罨蚰_本中返回此變量以獲得返

回信息?;诖诵畔?,可以在腳本中做更進(jìn)一步的研究,

返回0意味著成功,I為出現(xiàn)錯(cuò)誤。

□下面的例子拷貝文件到/tmp,并使用$?檢查結(jié)果。

$p

c?tX

$$?

echO

o

最后的退出狀態(tài)

□現(xiàn)在嘗試將一個(gè)文件拷入一個(gè)不存在的目錄或

文件:

$qpok.txt/usr/local/apps/dsf

cp:cannotcreateregularfile?/usr/local/apps/dsf1:Nosuchfileor

directory

$echo$?

1

14.3.5引號(hào)

1.引用的必要性。

2.雙引、單引和反引號(hào)。

3.使用反斜線實(shí)現(xiàn)屏蔽。

引用的必要性

?腳本中執(zhí)行行操作時(shí),shell將對(duì)腳本設(shè)置予以解釋。要

采取一種方法防止shell這樣做,即使用引用號(hào),包括各

式引用或使用反斜線。

$echoHitthestarbuttontoexit*

HitthestarbuttontoexitDIR_COLORSHOSTNAMEMuttrcXlladjtime

aliasesalias

$echoMHitthestarbuttontoexit

Hitthestarbuttontoexit?

Hll雙弓I號(hào)反引號(hào)

1Tl弓I號(hào)反斜線

雙引號(hào)

■使用雙引號(hào)可引用除字符$、'、'外的任意字符或字符串。

這些特殊字符分別為美元符號(hào),反引號(hào)和反斜線,對(duì)Shen

來(lái)說(shuō),它們有特殊意義。如果使用雙引號(hào)將字符串賦給變

量并反饋它,實(shí)際上與直接反饋?zhàn)兞坎o(wú)差別

$STRING=nMAYDAY,MAYDAY,GOINGDOWN”

$echoh$STRINGn

MAYDAY,MAYDAY,GOINGDOWN

$echo$STRING

MAYDAY,MAYDAY,GOINGDOWN

其他符號(hào)

?單引號(hào):與雙引號(hào)類似,不同的是忽略任何引用值。

換句話說(shuō),如果屏蔽了其特殊含義,會(huì)將引號(hào)里的所

有字符,包括引號(hào)都作為一個(gè)字符串。

?反引號(hào):用于設(shè)置系統(tǒng)命令的輸出到變量。Shen將反

引號(hào)中的內(nèi)容作為一個(gè)系統(tǒng)命令,并執(zhí)行其內(nèi)容。

#GIRL=tgirl,

#echodate'

#echo“The'$GIRL'didwell”

SundayJanu812:40:56GMT2007

The'giiTdidwell

14.4控制結(jié)構(gòu)語(yǔ)句

1變量表達(dá)式

2循環(huán)語(yǔ)句

3條件語(yǔ)句

14.4.1變量表達(dá)式

■在編程中,既然有變量,就有關(guān)于變量的表達(dá)式——比較

(test)o

■test的用法:

test表達(dá)式

■test的后面跟的表達(dá)式的操作符有字符串操作符、數(shù)字操

作符和邏輯操作符。

例如:判斷某個(gè)變量是否小于數(shù)值10

whiletest$num-le10

14.4.1變量表達(dá)式

i.字符串比較字符串表達(dá)式能夠測(cè)試字符串是否相等,字

符串長(zhǎng)度是否為零,或字符串是否為NULL。

字符串說(shuō)明

二比較兩個(gè)字符串是否相同,如果相同,值為“0”

1二比較兩個(gè)字符串是否相同,如果不相同,值為“0”

-n比較字符串的長(zhǎng)度是否大于零,若大于零,值為“0”

-z比較字符串的長(zhǎng)度是否等于零,若等于零,值為“0”

例子

[root@localhostroot]#viifeditor

#!/bin/sh

#ifeditor

If[-z$EDITOR];then

〃如果EDITOR長(zhǎng)度為0,貝I

#thevariablehasnotbeenset

Echo“yourEDITORenvironmentisnotset”

//EDITOR編輯器環(huán)境未設(shè)置

Else

#lefsseewhatitis

Echousing$EDITORasdefaulteditor^(^^

〃使用默認(rèn)的編輯器

fi

14.4.1變量表達(dá)式不

2.數(shù)字比較test語(yǔ)句和其他編程語(yǔ)言中的比較語(yǔ)句不同,因?yàn)樗皇?

用如〉,<,〉二等符號(hào)來(lái)表達(dá)大于和小于的比較,而是用整數(shù)表達(dá)式來(lái)表示這些。

比較字符串說(shuō)明

-eq相等

-ge大于等于

-le小于等于

-ne不等于

一gt大于

-It小于

例子1

例如:if的使用演示

[root@localhostroot]#viiftest

#!/bin/sh

#iftest

#thisisacommemtline,allcommentlinesstartwitha#

If「10”一It,12']

Then

Echo“yes,10islessthan12"〃10比12小fi

例子2

$viifparam

#l/bin/sh

#ifparam

if[S#-It3];then

#lessthan3parameterscalled,echoausagemessageandexit

echo"Usage:'basenameSO'arglarg2arg3n>42

exit1

fi

#good,received3params,let'sechothem

echo"argl:$1”

echonarg2:$2"

echoHarg3:$3”

如果只傳入兩個(gè)參數(shù),則顯示一可用信息,然后腳本退出。

$ifparamcupmedal

Usage:ifparamarglarg2arg3

這次傳入三個(gè)參數(shù)。

$ifparamcupmedaltrophy

argl:cup

arg2:medal

ar(y3:trophv

14.4.1變量表達(dá)式

3.邏輯操作

邏輯操作是對(duì)邏輯值進(jìn)行的操作,邏輯值只有

兩個(gè):是、否。

邏輯操作符說(shuō)明

!反

-a與

-o或

14.4.1變量表達(dá)式

4.文件操作文件測(cè)試表達(dá)式通常用來(lái)測(cè)試文件的信息,一

般由腳本來(lái)決定文件是否應(yīng)該備份、復(fù)制或刪除。

文件測(cè)試符說(shuō)明

-d對(duì)象存在且為目錄則返回值為0

-f對(duì)象存在且為文件則返回值為0

-1對(duì)象存在且為符號(hào)連接則返回值為0

-r對(duì)象存在且可讀則返回值為0

-s對(duì)象存在且長(zhǎng)度非0則返回值為0

-W對(duì)象存在且可寫則返回值為0

-X對(duì)象存在且可執(zhí)行則返回值為0

file-nt(-ot)file2文件1比文件2新(舊)

例子

[root@localhostroot]#viifcataudit

#!/bin/sh

#ifcataudit

#locationsofthelogfile

LOCAT_1=/usr/opts/audit/logs/audit.log

LOCAT_2=/usr/local/audit/audit.log

If[-r$LOCAT_1];then

echo“usingLOCAT_1M

cat$LOCAT_1

elif

[-r$LOCAT_2]

then

echo“usingLOCAT_2n

cat$LOCAT_2

else

echo“sorrytheauditfileisnotreadableorconnotbelocated,n>&2

exit1

fi

1442循環(huán)語(yǔ)句

1.for循環(huán)

for的語(yǔ)法

for變量in列表

do

操作

done

14.4.2循環(huán)語(yǔ)句

viforrmgz

#todeleteallfilewithextensionof“gz”inthedustbin

i=gz

foriin$HOME/dustbin/*.gz

do

rm-f$i

echou$ihasbeendeleted55

done

執(zhí)行結(jié)果如下:

[echo@echobin]$.for_rmgz

/home/echo/dustbin/file1.gzhasbeendeleted

/home/echo/dustbin/file2.gzhasbeendeleted

/home/echo/dus

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論