數組
變量:存儲單個元素的內存空間
數組:存儲多個元素的連續的內存空間,相當于多個變量的集合。
數組名和索引
索引:編號從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[*]}
(2)一次賦值全部元素
number=(1 3 5 6 8 9)
unmber2=({1..9})
echo ${number2[*]}
files=(`ls /testdir`)
echo ${files[*]}
file=({1,2}.{a,b})
echo ${file[*]}
1.a 1.b 2.a 2.b
(3)只賦值特定元素
num=([0]=100 [2]=20 [10]=1000)
echo ${num[*]}
(4)交互式數組值對賦值
read -a num
1 2 3 4 5
echo ${num[*]}
1 2 3 5 5
編號從0開始編,所以編號最大值為元素的n-1個。
echo ${#number[*]}
echo ${#var}
統計變量number的字符數(變量的長度)。
引用數組
取十個隨機數字,取出最大值和最少值。
#!/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
#!/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
統計變量里面字符串的數量
${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的之前都刪除
從左到右
echo ${var%word*}
最后一個word之前的都刪除
echo ${var%%word*}
全部word的之后都刪除
從右到左
${var%word*}:其中word可以是指定的任意字符;
功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最后一個字符向左至第一次出現word字符之間的所有字符;
file="/var/log/messages"
${file%/*}: /var/log
?${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最后一次出現word字符之間的所有字符;
查找替換:
${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之
${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替換之
${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替換之
${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替換之
查找并刪除:
${var/pattern}:查找var所表示的字符串中,刪除第一次被pattern所匹配到的字符串
${var//pattern}:所有
${var/#pattern}:行首
${var/%pattern}:行尾
字符大小寫轉換:
${var^^}:把var中的所有小寫字母轉換為大寫
${var,,}:把var中的所有大寫字母轉換為小寫
變量賦值
${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
declare 會確實使元數據改變
間接變量引用
v1=name
name=wang
eval v3=\$$v1
echo $v3
echo ${!v1}
會隨著前一個變量的改變而影響下一個相關聯的變量。
cmd=hostname
'echo $cmd' = eval $cmd
eval 等于執行了兩次的掃描,第一次掃描出cmd=hostanme,第二次運行執行命令。
創建臨時文件
mktemp命令;創建的臨時文件可以避免沖突。
mktemp file(名稱).XXX
.XXX(固定格式)
生成的臨時的文件.后續的三位隨機。
不寫路徑默認在當前目錄下生成。
mktemp -p /testdir/ tmp.XXX
-d 可以生成文件目錄
-p 生成文件
安裝復制文件
install命令
install一般都只用與復制二進制文件
install -m 666 -o zczx -g bin f1 /testdir/f111
選項:
-m MODE,默認755 權限修改
-o OWNER 屬主更改
-g GROUP 屬組更改
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
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
原創文章,作者:swzczx,如若轉載,請注明出處:http://www.www58058.com/39468
文章對當天所學東西總結的很詳細,但是而沒有通過自己的文字總結成通順的話語,這是不合適的,建議以后嘗試通過自己的語言將內容的知識點進行總結與梳理,寫出優秀的博客。