數組,字符串處理,mktemp命令,install命令,bash的環境配置文件,程序包編譯

數組

變量:存儲單個元素的內存空間

數組:存儲多個元素的連續的內存空間,相當於多個變量的集合。


數組名和索引

索引:編號從0開始,屬於數值索引

注意:索引可支持使用自定義的格式,而不僅是數值格式,即爲關聯索引,bash4.0版本之後開始支持。

bash的數組支持稀疏格式(索引不連續)


聲明數組:

declare -a ARRAY_NAME(普通數組可以不加聲明)

declare -A ARRAY_NAME:關聯數組(關聯數組必須先聲明再使用)


數組賦值

數組元素的賦值:

(1)一次只賦值一個元素

declare -a menu

menu[0]=hsr

menu[1]=bjky

menu[2]=mckr

echo ${menu[*]}

       QQ圖片20160824103604.png

(2)一次賦值全部元素

number=(1 3 5 6 8 9)

QQ圖片20160824103046.png

unmber2=({1..9})

echo ${number2[*]}

QQ圖片20160824102000.png

files=(`ls /testdir`)

echo ${files[*]}

        QQ圖片20160824103920.png

file=({1,2}.{a,b})

echo ${file[*]}

1.a 1.b 2.a 2.b

        QQ圖片20160824103920.png

(3)只賦值特定元素

num=([0]=100 [2]=20 [10]=1000)

echo ${num[*]}


        QQ圖片20160824104156.png

(4)交互式數組值對賦值

read -a num

1 2 3 4 5

echo ${num[*]}

1 2 3 5 5

        QQ圖片20160824104314.png

編號從0開始編,所以編號最大值爲元素的n-1個。


echo ${#number[*]}

echo ${#var} 

統計變量number的字符數(變量的長度)。

QQ圖片20160824104444.png


引用數組

取十個隨機數字,取出最大值和最少值。

#!/bin/bash

declare -a rand

declare -i min

declare -i max


for i in {0..9}

do

rand[$i]=$RANDOM

[ $i -eq 0 ] && { min=${rand[$i]};max={$rand[$i]}; }

[ $min -gt ${rand[$i]} ] && min=${rand[$i]}

[ $max -lt ${rand[$i]} ] && max=${rand[$i]}

done

echo ${rand[*]}

echo max=$max

echo min=$min

QQ圖片20160824110529.png


#!/bin/bash

declare -a files

file=(/var/log/*.log)

for i in `seq 0 $[${#file[*]}-1]`

do

filelines=`wc -l ${file[$i]} | cut -d" " -f1`

[ $[$i%2] -eq 0 ] && let lines+=$filelines

done

echo $lines



字符串處理

字符串切片:

${#var}:返回字符串變量var的長度

a=({1..9})

echo ${a[*]}

1 2 3 4 5 6 7 8 9

echo ${#a[*]}

9

統計變量裏面字符串的數量

QQ圖片20160824142425.png

${var:offset}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,到最後的部分,offset的取值在0 到${#var}-1 之間(bash4.2後,充許爲負值)

${var:offset:number}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,長度爲number的部分

${var: -lengh}:取字符串的最右側幾個字符:

注意:冒號後必須有一空白字符


基於模式取子串:

${var#*word}:其中word可以是指定的任意字符

功能:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的所有字符

${var##*word}:同上,不同的是,刪除的是字符串開頭至最後一次由word指定的字符之間的所有內容

file="/var/log/messages"

${file##*/}: messages


echo ${var#*word}

第一個word之前的都刪除

echo ${var##*word}

全部word的之前都刪除

從左到右

QQ圖片20160824142655.png

echo ${var%word*}

最後一個word之前的都刪除

echo ${var%%word*}

全部word的之後都刪除

從右到左

QQ圖片20160824142844.png

${var%word*}:其中word可以是指定的任意字符;

功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最後一個字符向左至第一次出現word字符之間的所有字符;

file="/var/log/messages"

${file%/*}: /var/log

${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最後一次出現word字符之間的所有字符;



查找替換:


${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之

QQ圖片20160824143134.png


${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替換之

QQ圖片20160824143314.png

${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替換之

QQ圖片20160824143557.png

${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替換之

QQ圖片20160824143659.png

查找並刪除:

${var/pattern}:查找var所表示的字符串中,刪除第一次被pattern所匹配到的字符串

${var//pattern}:所有

${var/#pattern}:行首

${var/%pattern}:行尾

QQ圖片20160824143856.png

字符大小寫轉換:

${var^^}:把var中的所有小寫字母轉換爲大寫

${var,,}:把var中的所有大寫字母轉換爲小寫

QQ圖片20160824144404.png

變量賦值


${var:-value}:如果var爲空或未設置,那麼返回value;否則,則返回var的值

echo ${var:-mage}  ($var爲空)

mage



${var:+value}:如果var不空,則返回value


echo ${var:+mage}  ($var不爲空)

mage

(爲空則返回空值)


${var:=value}:如果var爲空或未設置,那麼返回value,並將value賦值給var;否則,則返回var的值

echo ${var:=mage}  ($var爲空)

mage

echo ${var:=mage}  ($var不爲空)

haha



${var:?error_info}:如果var爲空或未設置,那麼返回error_info;否則,則返回var的值


echo ${var:?mage}  ($var爲空)

mage

echo ${var:?mage}  ($var不爲空)

haha



建立一個文件,專門放置變量。


Shell變量一般是無類型的,但是bash Shell提供了declare和typeset兩個命令用於指定變量的類型,兩個命令是完全等價的

declare [選項] 變量名

-r 將變量設置爲只讀屬性

-i 將變量定義爲整型數

-a 將變量定義爲數組

-A 關聯數組必須先用聲明


-f 顯示此腳本前定義過的所有函數名及其內容


-F 僅顯示此腳本前定義過的所有函數名

declare -F


-x 將變量聲明爲環境變量

-l 將變量值轉爲小寫字母

declare -l var=AAAAA

echo $var

aaaaa

-u 將變量值轉爲大寫字母


declare -u var=aaaaa

echo $var

AAAAA

QQ圖片20160824144700.png

declare 會確實使元數據改變


間接變量引用

v1=name

name=wang

eval v3=\$$v1

echo $v3


echo ${!v1}

QQ圖片20160824145043.png

會隨着前一個變量的改變而影響下一個相關聯的變量。


cmd=hostname

'echo $cmd' = eval $cmd

eval 等於執行了兩次的掃描,第一次掃描出cmd=hostanme,第二次運行執行命令。

QQ圖片20160824145200.png


創建臨時文件


mktemp命令;創建的臨時文件可以避免衝突。

mktemp file(名稱).XXX

                  .XXX(固定格式)


生成的臨時的文件.後續的三位隨機。

不寫路徑默認在當前目錄下生成。

mktemp -p /testdir/ tmp.XXX

  -d 可以生成文件目錄

  -p 生成文件


QQ圖片20160824145351.png


安裝複製文件


install命令

install一般都只用與複製二進制文件


install -m 666 -o zczx -g bin f1 /testdir/f111


選項:

-m MODE,默認755 權限修改


-o OWNER 屬主更改


-g GROUP 屬組更改

QQ圖片20160824145702.png


bash如何展開命令行(運行級別又上到下)


把命令行分成單個命令詞

展開別名

展開大括號種的聲明({})

展開波浪符聲明(~)

命令替換$()和“)

再次把命令行分成命令詞

展開文件通配(*、?、[abc]等等)

準備I/0重導向(<、>)

運行命令


反斜線(\)會使隨後的字符按原意解釋

$echoYourcost:\$5.00

Yourcost:$5.00

加引號來防止擴展

單引號(’)防止所有擴展

雙引號(”)也防止所有擴展,但是以下情況例外:

$(美元符號)-變量擴展

`(反引號)-命令替換

\(反斜線)-禁止單個字符擴展

!(歎號)-歷史命令替換



bash的環境配置文件

全局配置:

/etc/prolfie

/etc/profile.d/*.sh

/etc/bashrc

個人配置:

~/.bash_profile

~/.bashrc



shell登錄兩種方式


交互式登錄:

(1)直接通過終端輸入賬號密碼登錄;



(2)使用“su-UserName”切換的用戶

開機運行執行順序:

/etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile–> ~/.bashrc–> /etc/bashrc


非交互式登錄:

    (1)suUserName

    (2)圖形界面下打開的終端

    (3)執行腳本

執行順序:

~/.bashrc–> /etc/bashrc–> /etc/profile.d/*.sh



Profile類


按功能劃分,存在兩類:

profiile類和bashrc類

profile類:爲交互式登錄的shell提供配置

全局:/etc/profile, /etc/profile.d/*.sh

個人:~/.bash_profile

功用:

(1) 用於定義環境變量

(2) 運行命令或腳本



bashrc類:爲非交互式和交互式登錄的shell提供配置

全局:/etc/bashrc

個人:~/.bashrc

功用:

(1) 定義命令別名和函數

(2) 定義本地變量


修改profile和bashrc文件後需生效

兩種方法:

1重新啓動shell進程

2 . 或source

例:

. ~/.bashrc


Bash 退出任務

保存在~/.bash_logout文件中(用戶)

在退出登錄shell時運行

用於

創建自動備份

清除臨時文件


/etc/profile.d 



yum


yum的命令行選項:

–nogpgcheck:禁止進行gpgcheck

y: 自動回答爲“yes”

-q:靜默模式

–disablerepo=repoidglob:臨時禁用此處指定的repo

–enablerepo=repoidglob


yum倉庫


yum的repo配置文件中可用的變量:

$releasever: 當前OS的發行版的主版本號

$arch: 平臺,i386,i486,i586,x86_64等

$basearch:基礎平臺;i386

$YUM0-$YUM9:自定義變量

實例:

http://server/centos/$releasever/$basearch/

http://server/centos/7/x86_64

http://server/centos/6/i384


創建yum倉庫:

createrepo[options] <directory>

yum -y install createrepo 



baseurl=ftp://mirrors,maged.com/$releasever/$basearch



程序包編譯

程序包編譯安裝:

Application-VERSION-release.src.rpm–> 安裝後,使用rpmbuild命令製作成二進制格式的rpm包,而後再安裝

源代碼–>預處理–>編譯(gcc)–>彙編–>鏈接–>執行


make 項目管理器


源代碼組織格式:

多文件:文件中的代碼之間,很可能存在跨文件依賴關係

C、C++:make (項目管理器,configure –>Makefile.in –> makefile)

java: maven




編譯安裝

C代碼編譯安裝三步驟:

1、./configure:(生成makefile)

(1) 通過選項傳遞參數,指定啓用特性、安裝路徑等;執行時會參考用戶的指定以及makefile.in文件生成makefile

(2) 檢查依賴到的外部環境

2、make:根據makefile文件,構建應用程序


3、make install:複製文件到相應路徑

在解壓縮的時候進行的操作。


開發工具:

autoconf: 生成configure腳本

automake:生成Makefile.in

注意:安裝前查看INSTALL,README


c/c++編譯器: gcc(GNU C Complier)


編譯C源代碼:

前提:提供開發工具及開發環境

開發工具:make, gcc等

開發環境:開發庫,頭文件

glibc:標準庫

通過“包組”提供開發組件

CentOS 6: "Development Tools"

"Server Platform Development"



源碼安裝apachectl


1安裝develpment tools

yum grouplist

yum groupinstall "Development Tools" "Security Tools"


2下載

tar xvf http-2.2.29.tar.bz2

3設置解壓的目錄,設置的目錄

./configure –prefix=/usr/local/http2 –sysconfdir=/etc/http2

4

make

make install

5在設置文件中加入新裝包的man路徑

vim /etc/man_db.conf

6 apachectl start

QQ圖片20160824184659.png

80端口已經成功開啓


編譯安裝


第一步:configure腳本

選項:指定安裝位置、指定啓用的特性

–help: 獲取其支持使用的選項

選項分類:

安裝路徑設定:

–prefix=/PATH: 指定默認安裝位置,默認爲/usr/local/

–sysconfdir=/PATH:配置文件安裝位置

System types:支持交叉編譯


Optional Features: 可選特性

–disable-FEATURE

–enable-FEATURE[=ARG]

Optional Packages: 可選包,

–with-PACKAGE[=ARG],依賴包

–without-PACKAGE,禁用依賴關係

第二步:make

第三步:make install


安裝後的配置:

(1) 二進制程序目錄導入至PATH環境變量中;

編輯文件/etc/profile.d/NAME.sh

export PATH=/PATH/TO/BIN:$PATH

(2) 導入庫文件路徑

編輯/etc/ld.so.conf.d/NAME.conf

添加新的庫文件所在目錄至此文件中

讓系統重新生成緩存:

ldconfig[-v]

(3) 導入頭文件

基於鏈接的方式實現:

ln -sv

(4) 導入幫助手冊

編輯/etc/man.config|man_db.conf文件


添加一個MANPATH


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章