一、shell編程(五)
位置變量補充
shift (踢掉參數)
shift #! /bin/bashecho "1st arg is $1"echo "all arg are $*"shiftecho "1st arg is $1"echo "all arg are $*"shiftecho "1st arg is $1"echo "all arg are $*"shift 2echo "1st arg is $1"echo "all arg are $*" [root@6 ~]# ./test.sh a b c d e f g1st arg is a all arg are a b c d e f g1st arg is b all arg are b c d e f g1st arg is c all arg are c d e f g1st arg is e all arg are e f g
匿名函數 (無函數名)
{ echo yyy ;exit }
數組
變量:存儲單個元素的內存空間 數組:存儲多個元素的連續的內存空間,相當于多個變量的集合。 數組名和索引 索引:編號從0開始,屬于數值索引 注意:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引,bash4.0 版本之后開始支持。 bash 的數組支持稀疏格式(索引不連續)
定義數組
聲明數組: 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" ...)、 生成列表 file=({1,2}*{a,b}) (3) 只賦值特定元素: ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...) (4) 交互式數組值對賦值 read -a ARRAY
引用數組
引用數組元素:${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"
數組數據處理
引用數組中的元素: 所有元素:${ARRAY[@]}, ${ARRAY[*]} 數組切片:${ARRAY[@]:offset:number} offset: 要跳過的元素個數 number: 要取出的元素個數 ${ARRAY[@]:offset} echo ${v;3;5} 向數組中追加元素: ARRAY[${#ARRAY[*]}] [root@6 ~]# name=([0]=4 [1]=5 [2]=6) [root@6 ~]# name[${#name[*]}]=10086 [root@6 ~]# echo ${name[*]} 4 5 6 10086 刪除數組中的某元素:導致稀疏格式 unset ARRAY[INDEX]關聯數組: declare -A ARRAY_NAME ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘...) [root@6 ~]# declare -A A [root@6 ~]# A=([a]=1 [b]=2 [c]=3) [root@6 ~]# echo ${A[b]} 2
字符串處理及替換
字符串處理
bash 的字符串處理工具: 字符串切片: ${#var}: 返回字符串變量var 的長度 ${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#*/}: log/messages ${file##*/}: messages ${var%word*} :其中word 可以是指定的任意字符; 功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最后一個字符向左至第一次出現word 字符之間的所有字符; file="/var/log/messages" ${file%/*}: /var/log ${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最后一次出現word 字符之間的所有字符; 示例: :url=http://www.magedu.com:80 ${url##*:} 80 ${url%%:*} http
查找替換:
${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 的值 ${var:+value} :如果var 不空,則返回value${var:=value} :如果var 為空或未設置,那么返回value,并將value 賦值給var;否則,則返回var 的值 ${var:?error_info} :如果var 為空或未設置,那么返回error_info ;否則,則返回var 的值 為腳本程序使用配置文件, 實現變量賦值 (1)定義文本文件,每行定義“name=value” (2)在腳本中source 此文件即可
高級變量用法- 有類型變量
Shell 變量一般是無類型的,但是bash Shell 提供了declare和和typeset兩個命令用于指定變量的類型,兩個命令是完全等價的declare [ 選項] 變量名 -r 將變量設置為只讀屬性 -i 將變量定義為整型數 -a 將變量定義為數組 -f 顯示此腳本前定義過的所有函數名及其內容 -F 僅顯示此腳本前定義過的所有函數名 -x 將變量聲明為環境變量 -l 將變量值轉為小寫字母 -u 將變量值轉為大寫字母 [root@6 ~]# echo $name a b c d e f g h i j k l m n o p q r s t u v w x y z [root@6 ~]# echo $name2 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [root@6 ~]# declare -l name3=$name2 [root@6 ~]# echo $name3 a b c d e f g h i j k l m n o p q r s t u v w x y z
間接變量引用
如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱為間接變量引用variable1=variable2variable2=valuevariable1的值是variable2,而variable2 又是變量名,variable2的值為value ,間接變量引用是指通過variable1獲 獲得變量值value 的行為
間接變量引用
bash Shell 提供了兩種格式實現間接變量引用 eval tempvar=\$$variable1 tempvar=${!variable1} 示例: [root@server ~]# N=NAME[root@server ~]# NAME=wangxiaochun[root@server ~]# N1=${!N}[root@server ~]# echo $N1wangxiaochun [root@server ~]# eval N2=\$$A[root@server ~]# echo $2wangxiaochun
eval 命令
eval 命令將會首先掃描命令行進行所有的置換,然后再執行該命令。該命令適用于那些一次掃描無法實現其功能的變量。該命令對變量進行兩次掃描 。 示例: [root@server ~]# V1=pwd[root@server ~]# echo $V1pwd[root@server ~]# eval $V1/root
創建臨時文件
mktemp命令:創建的臨時文件可避免沖突 mktemp [OPTION]... [TEMPLATE] TEMPLATE: filename.XXX X至少要出現三個 OPTION: -d: 創建臨時目錄 -p DIR --tmpdir=/DIR :指明臨時文件所存放的目錄位置 實例: #mktemp --tmpdir=/testdir test.XXXXXX #mktemp -p /testdir test.XXXXXX #mktemp -d /testdir test.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 install -m 700 -o lvasu -g admins file1 fie2
bash 如何展開命令行
把命令行分成單個命令詞 展開別名 展開大括號種的聲明({}) 展開波浪符聲明(~) 命令替換$() 和 ``再次把命令行分成命令詞 展開文件通配(* 、? 、[abc] 等等) 準備I/0 重導向(< 、>) 運行命令
防止擴展
反斜線(\)會使隨后的字符按原意解釋 $ echo Your cost: \$5.00Your cost: $5.00加引號來防止擴展 ? 單引號(’ )防止所有擴展 ? 雙引號(”)也防止所有擴展,但是以下情況例外: $ (美元符號) - 變量擴展 ` (反引號) - 命令替換 \ (反斜線) - 禁止單個字符擴展 ! (嘆號) - 歷史命令替換
bash 的配置文件
按生效范圍劃分,存在兩類: 全局配置: /etc/profile /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)su UserName (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類
bashrc類:為非交互式和交互式登錄的shell 提供配置 全局:/etc/bashrc 個人:~/.bashrc 功用: (1) 定義命令別名和函數 (2) 定義本地變量
編輯配置文件生效
修改profile 和bashrc 文件后需生效 兩種方法:1 重新啟動shell 進程2 . 或source 例: . ~/.bashrc
Bash 退出任務
保存在~/.bash_logout 文件中(用戶) 在退出登錄shell 時運行 用于 ? 創建自動備份 ? 清除臨時文件
二、軟件包管理(三)
刪除rpm rpm -e rpm –nodeps 進入救援模式安裝 rpm /path/ –root=/sys
yum
安裝及升級本地程序包: * localinstall rpmfile1 [rpmfile2] [...] ( 用install 替代) * localupdate rpmfile1 [rpmfile2] [...] ( 用update 替代) 包組管理的相關命令: groupinstall group1 [group2] [...] groupupdate group1 [group2] [...] grouplist [hidden] [groupwildcard] [...] groupremove group1 [group2] [...] groupinfo group1 [...]如何使用光盤當作本地yum 倉庫: (1) 掛載光盤至某目錄,例如/media/cdrom # mount /dev/cdrom /media/cdrom (2) 創建配置文件 [CentOS7] name= baseurl= gpgcheck= enabled= yum 的命令行選項: --nogpgcheck :禁止進行gpg check -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> 光盤自動啟動服務: [root@6 Packages]# service autofs status 遠程連接文件服務器: lftp ip mget 下載文件 bye 退出文件服務器
程序包編譯
程序包編譯安裝: 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 開源程序源代碼的獲?。? 官方自建站點: apache.org (ASF) mariadb.org ... 代碼托管: SourceForge.net Github.com code.google.comc/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
積累應用
1、系統組件刪除恢復
rpm -e rpm --nodeps 光盤啟動,進入救援模式 centos6 mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom centos7 rpm -ivh /run/../Package/rpm-4...*.rpm --root=/mnt/sysimage
1、卸載RPM組件 (centos6)
救援模式rescue 安裝RPM包
mount /dev/cdrom /mnt/cdrom 需要掛載光盤 --root=/mnt/sysimage 指定安裝目錄
、
2、 卸載RPM組件 (centos7)
救援模式rescue 安裝RPM包
--root=/mnt/sysimage 指定安裝目錄
3、卸載kernel組件 (centos6)
救援模式rescue 安裝kernel包
mount /dev/cdrom /mnt/cdrom 需要掛載光盤 --root=/mnt/sysimage 指定安裝目錄
4、卸載kernel組件 (centos7)
救援模式rescue 安裝kernel包
--root=/mnt/sysimage 指定安裝目錄
2、源碼安裝apache
步驟 1、安裝develpment tools 2、下載 tar xvf httpd-2.2.29.tar.bz2 3./configure --prefix=/usr/local/http2 --sysconfdir=/etc/http2/4 make5 make install /etc/man_db.conf 編輯mandb的配置文件 /etc/profile.d.sh/ 把http2的執行文件路徑添加到PATH 中 http2.sh PATH=$PATH:/usr/local/http2/bin 6 ./bin/apachectl start 開啟apachectl 7 netstat -ant 檢查端口 telnet 10.1.252.213 80 8 iptables -F 關閉防火墻 9 測試links
安裝效果
3 、生成10 個隨機數,采用冒泡算法進行升序或降序排序
#! /bin/bash #author:lvasu #description: #version:0.1 #date: declare -i num; read -a arg -p "請輸入10個數字:" for((i=0;i<=9;i++))do for((k=$[i+1];k<=9;k++))do if [ ${arg[$i]} -gt ${arg[$k]} ];then num=${arg[$i]} arg[$i]=${arg[$k]} arg[$k]=$num fi done done echo "正序排列${arg[*]}" echo "==============" for((i=0;i<=9;i++))do for((k=$[i+1];k<=9;k++))do if [ ${arg[$i]} -lt ${arg[$k]} ];then num=${arg[$i]} arg[$i]=${arg[$k]} arg[$k]=$num fi done done echo "逆序排練${arg[*]}" echo "====================" zhengxu echo "====================" nixu
zhengxu() { local num; for((i=0;i<=9;i++))do for((k=$[i+1];k<=9;k++))do if [ ${arg[$i]} -gt ${arg[$k]} ];then num=${arg[$i]} arg[$i]=${arg[$k]} arg[$k]=$num fi done done echo "正序排列${arg[*]}" } nixu() { for ((i=0;i<=9;i++))do for ((k=$[i+1];k<=9;k++))do if [ ${arg[$i]} -lt ${arg[$k]} ];then num=${arg[$i]} arg[$i]=${arg[$k]} arg[$k]=$num fi done done echo "逆序排練${arg[*]}" }
[root@6 bin]# sort.sh 請輸入10個數字:2 5 1 4 6 10 5 9 111 20 正序排列1 2 4 5 5 6 9 10 20 111 ============================== 逆序排練111 20 10 9 6 5 5 4 2 1 ============================= 正序排列1 2 4 5 5 6 9 10 20 111 ============================ 逆序排練111 20 10 9 6 5 5 4 2 1
原創文章,作者:lvasu,如若轉載,請注明出處:http://www.www58058.com/39794
文章對所學的東西有了一個全面的梳理和總結,但對于實際操作部分,寫的過于簡略。