一、數組
變量:存儲單個元素的內存空間
數組:存儲多個元素的連續的內存空間,相當于多個變量的集合。
數組名和索引
索引:編號從0開始,屬于數值索引
注意:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引,bash4.0版本之后開始支持。
bash的數組支持稀疏格式(索引不連續)
1.定義數組
聲明數組:
declare -a ARRAY_NAME
declare -A ARRAY_NAME: 關聯數組
數組元素的賦值:
(1) 一次只賦值一個元素;
ARRAY_NAME[INDEX]=VALUE
weekdays[0]="Sunday"
weekdays[4]="Thursday"
(2) 一次賦值全部元素:
ARRAY_NAME=("VAL1" "VAL2" "VAL3" …)
(3) 只賦值特定元素:
ARRAY_NAME=([0]="VAL1" [3]="VAL2" …)
(4) 交互式數組值對賦值
read -a ARRAY
2.引用數組
引用數組元素:${ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下標為0的元素
數組的長度(數組中元素的個數):${#ARRAY_NAME[*]} 或 ${#ARRAY_NAME[@]}
示例:生成10個隨機數保存于數組中,并找出其最大值
#!/bin/bash declare -a rand declare -i max=0 for i in {0..9} ; do rand[$i]=$RANDOM echo ${rand[$i]} [ ${rand[$i]} -gt $max ] && max=${rand[$i]} done echo "Max: $max"
練習:編寫腳本,定義一個數組,數組中的元素是/var/log目錄下所有以.log結尾的文件;要統計其下標為偶數的文件中的行數之和
#!/bin/bash # declare -a files files=(/var/log/*.log) declare -i lines=0 for i in $(seq 0 $[${#files[*]}-1]) ; do if [ $[$i%2] -eq 0 ];then let lines+=$(wc -l ${files[$i]} | cut -d' ' -f 1) fi done echo "Lines: $lines."
3.數組數據處理
所有元素:${ARRAY[@]}, ${ARRAY[*]}
數組切片:${ARRAY[@]:offset:number} (offset: 要跳過的元素個數,number: 要取出的元素個數)
取偏移量之后的所有元素: ${ARRAY[@]:offset}
向數組中追加元素:ARRAY[${#ARRAY[*]}]
刪除數組中的某元素,導致稀疏格式:unset ARRAY[INDEX]
關聯數組(使用自定義的索引表,而非0,1,2,3……):
declare -A ARRAY_NAME
ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘…)
4.字符串處理
(1).字符串切片:
${#var}:返回字符串變量var的長度
${var:offset}:返回字符串變量var中從第offset個字符后(不包括第offset個字符)的字符開始,到最后的部分,offset的取值在0 到${#var}-1 之間(bash4.2后,充許為負值)
${var:offset:number}:返回字符串變量var中從第offset個字符后(不包括第offset個字符)的字符開始,長度為number的部分
${var: -lengh}: 取字符串的最右側幾個字符:注意:冒號后必須有一空白字符
(2).基于模式取子串:
${var#*word}:其中word可以是指定的任意字符
功能:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的所有字符
${var##*word}:同上,不同的是,刪除的是字符串開頭至最后一次由word指定的字符之間的所有內容
示例:
file="/var/log/messages"
${file##*/}: messages
${var%word*}:其中word可以是指定的任意字符;
功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word,刪除字符串最后一個字符向左至第一次出現word字符之間的所有字符;
${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最后一次出現word字符之間的所有字符;
示例:
file="/var/log/messa
${file%/*}: /var/log
url=http://www.magedu.com:80
${url##*:} :80
${url%%:*} :http
(3).查找并替換:
${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之
${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替換之
${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替換之
${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替換之(4).查找并刪除:
${var/#pattern}:行首
${var/%pattern}:行尾
${var/pattern}:查找var所表示的字符串中,刪除第一次被pattern所匹配到的字符串
${var//pattern}:所有
字符大小寫轉換:
${var^^}:把var中的所有小寫字母轉換為大寫
${var,,}:把var中的所有大寫字母轉換為小寫
(5).變量賦值
${var:-value}:如果var為空或未設置,那么返回value;否則,則返回var的值
${var:+value}:如果var不空,則返回value
${var:=value}:如果var為空或未設置,那么返回value,并將value賦值給var;否則,則返回var的值
${var:?error_info}:如果var為空或未設置,那么返回error_info;否則,則返回var的值
為腳本程序使用配置文件,實現變量賦值
定義文本文件,每行定義“name=value”
在腳本中source此文件即可
(6).高級變量用法-有類型變量
Shell變量一般是無類型的,但是bash Shell提供了declare和typeset兩個命令用于指定變量的類型,兩個命令是完全等價的
declare [選項] 變量名
-r 將變量設置為只讀屬性
-i 將變量定義為整型數
-a 將變量定義為數組
-A 將變量定義為關聯數組
-f 顯示此腳本前定義過的所有函數名及其內容
-F 僅顯示此腳本前定義過的所有函數名
-x 將變量聲明為環境變量
-l 將變量值轉為小寫字母
-u 將變量值轉為大寫字母
(7).間接變量引用
variable1=variable2
variable2=value
如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱為間接變量引用
variable1的值是variable2,而variable2又是變量名,variable2的值為value,間接變量引用是指通過variable1獲得變量值value的行為
bash Shell提供了兩種格式實現間接變量引用
eval tempvar=\$$variable1
tempvar=${!variable1}eval命令將會首先掃描命令行進行所有的置換,然后再執行該命令。該命令適用于那些一次掃描無法實現其功能的變量。該命令對變量進行兩次掃描。
示例:
[root@server ~]# V1=pwd
[root@server ~]# echo $V1
pwd
[root@server ~]# eval $V1
/root
創建臨時文件
mktemp[OPTION]… [TEMPLATE] 創建的臨時文件可避免沖突(TEMPLATE: filename.XXX ;X至少要出現三個)
OPTION:
-d: 創建臨時目錄
–tmpdir=/DIR:指明臨時文件所存放的目錄位置
示例:
#mktemp–tmpdir=/testdirtest.XXXXXX
安裝復制文件
install命令:
install [OPTION]… [-T] SOURCE DEST 單文件
install [OPTION]… SOURCE… DIRECTORY
install [OPTION]… -t DIRECTORY SOURCE…
install [OPTION]… -d DIRECTORY…創建空目錄
選項:
-m MODE,默認755
-o OWNER
-g GROUP
bash如何展開命令行
把命令行分成單個命令詞
展開別名
展開大括號種的聲明({})
展開波浪符聲明(~)
命令替換$()和“)
再次把命令行分成命令詞
展開文件通配(*、?、[abc]等等)
準備I/0重導向(<、>)
運行命令
防止擴展
反斜線(\)會使隨后的字符按原意解釋
$echoYourcost:\$5.00
Yourcost:$5.00
加引號來防止擴展
單引號(’)防止所有擴展
雙引號(”)也防止所有擴展,但是以下情況例外:
$(美元符號)-變量擴展
`(反引號)-命令替換
\(反斜線)-禁止單個字符擴展
!(嘆號)-歷史命令替換
bash的配置文件(按生效范圍劃分,存在兩類)
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
個人配置:
~/.bash_profile
~/.bashrc
shell登錄兩種方式
?交互式登錄:
直接通過終端輸入賬號密碼登錄;
使用“su-UserName”切換的用戶
執行順序:
/etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile–> ~/.bashrc–> /etc/bashrc
非交互式登錄:
suUserName
圖形界面下打開的終端
執行腳本
執行順序:
~/.bashrc–> /etc/bashrc–> /etc/profile.d/*.sh
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時運行
用于
創建自動備份
清除臨時文件
練習
1、讓用戶(管理員或所有用戶)的PATH環境變量的值多出一個路徑,例如多如/usr/local/apache2/bin
2、用戶wang登錄時自動啟用別名rm=‘rm –i’
3、用戶登錄時,顯示紅色字體的警示提醒信息“hi,dangerous!”
二、yum程序包管理
顯示倉庫列表:
repolist[all|enabled|disabled]
顯示程序包:
list
yum list [all | glob_exp1] [glob_exp2] […]
yum list {available|installed|updates} [glob_exp1] […]
安裝程序包:
install package1 [package2] […]
reinstall package1 [package2] […] (重新安裝)
yum
升級程序包:
update [package1] [package2] […]
downgrade package1 [package2] […] (降級)
檢查可用升級:
check-update
卸載程序包:
{remove|erase} package1 [package2] […]
yum
查看程序包information:
info […
查看指定的特性(可以是某文件)是由哪個程序包所提供:
{provides|whatprovides} feature1 [feature2] […]
清理本地緩存:
clean [ packages | metadata | expire-cache | rpmdb| plugins | all ]
構建緩存:
makecache
yum
搜索:search string1 [string2] […]
以指定的關鍵字搜索程序包名及summary信息
查看指定包所依賴的capabilities:
deplist package1 [package2] […]
查看yum事務歷史:
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
yum history
yum history info 6
yum history undo 6
日志:/var/log/yum.log
yum
安裝及升級本地程序包:
localinstall rpmfile1 [rpmfile2] […]
(用install替代)
localupdate rpmfile1 [rpmfile2] […]
(用update替代)
包組管理的相關命令:
groupinstall group1 [group2] […]
groupupdate group1 [group2] […]
grouplist [hidden] [groupwildcard] […]
groupremove group1 [group2] […]
groupinfo group1 […]
yum
如何使用光盤當作本地yum倉庫:
(1) 掛載光盤至某目錄,例如/media/cdrom
mount /dev/cdrom /media/cdrom
(2) 創建配置文件
[CentOS7]
name=
baseurl=
gpgcheck=
enabled=
yum
yum的命令行選項:
–nogpgcheck:禁止進行gpgcheck
-y: 自動回答為“yes”
-q:靜默模式
–disablerepo=repoidglob:臨時禁用此處指定的repo
–enablerepo=repoidglob:臨時啟用此處指定的repo
–noplugins:禁用所有插件
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>
程序包編譯
程序包編譯安裝:
Application-VERSION-release.src.rpm–> 安裝后,使用rpmbuild命令制作成二進制格式的rpm包,而后再安裝
源代碼–>預處理–>編譯(gcc)–>匯編–>鏈接–>執行
源代碼組織格式:
多文件:文件中的代碼之間,很可能存在跨文件依賴關系
C、C++:make (項目管理器,configure –>
Makefile.in –> makefile)
java: maven
編譯安裝
C代碼編譯安裝三步驟:
1、./configure:
(1) 通過選項傳遞參數,指定啟用特性、安裝路徑等;執行時會參考用戶的指定以及makefile.in文件生成makefile
(2) 檢查依賴到的外部環境
2、make:根據makefile文件,構建應用程序
3、make install:復制文件到相應路徑
開發工具:
autoconf: 生成configure腳本
automake:生成Makefile.in
注意:安裝前查看INSTALL,README
編譯安裝
開源程序源代碼的獲?。?br />官方自建站點:
apache.org (ASF)
mariadb.org
…
代碼托管:
SourceForge.net
Github.com
code.google.com
c/c++編譯器: gcc(GNU C Complier)
編譯安裝
編譯C源代碼:
前提:提供開發工具及開發環境
開發工具:make, gcc等
開發環境:開發庫,頭文件
glibc:標準庫
通過“包組”提供開發組件
CentOS 6: "Development Tools",
"Server Platform Development",
編譯安裝
第一步: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
生成10個隨機數,采用冒泡算法進行升序或降序排序
#!/bin/bash
echo "Please input a list:"
read -a arr
for((i=0;i<${#arr[@]};i++))
do
for((j=${#arr[@]}-1;j>i;j–));do
if [[ ${arr[j]} -lt ${arr[j-1]} ]];then
t=${arr[j]}
arr[j]=${arr[j-1]}
arr[j-1]=$t
fi
done
done
echo "sort:"
echo ${arr[@]}
原創文章,作者:anonymous,如若轉載,請注明出處:http://www.www58058.com/40058
文章整體思路結構清晰,對數組的整個知識有了完整而全面的概述,同時yum倉庫的配置與yum工具的使用時我們必會的基本技能,文章個對yum配置內容整體很完整,整篇文章能看你出作者很用心在寫文章。