bash 數組和變量

數組可以把多個變量集合起來,不用再一個個的聲明變量,也可以調多個單個的變量使用,極大方便了我們的使用,而且Linux bash中的數組還支持同一個數組中同時有數字和字符串。下面讓我們來了解一下數組。

一,數組的簡介

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

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

數組名和索引

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

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

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

聲明數組:

declare -a ARRAY_NAME

declare -A ARRAY_NAME:  關聯數組

創建數組.PNG

二,數組的賦值和引用

數組元素的賦值:

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

    ARRAY_NAME[INDEX]=VALUE

    weekdays[0]="Sunday"

    weekdays[4]="Thursday"

一次賦值.PNG

    (2)  一次賦值全部元素:

    ARRAY_NAME=("VAL1" "VAL2" "VAL3" …)

    (3)  只賦值特定元素:

    ARRAY_NAME=([0]="VAL1" [3]="VAL2" …)

只賦特定值.PNG

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

    read -a ARRAY

引用數組元素:${ARRAY_NAME[INDEX]}

    注意:省略[INDEX] 表示引用下標為0的元素

數組的長度( 數組中元素的個數): :

    ${#ARRAY_NAME[*]}

    ${#ARRAY_NAME[@]}

示例:生成10 個隨機數保存于數組中,并找出其最大值和最小值
#!/bin/bash
declare -a rand
declare -i max=0
declare –i min=32767
for i in {0..9}; do
    rand[$i]=$RANDOM
    echo ${rand[$i]}

    [ ${rand[$i]} -gt $max ] && max=${rand[$i]}
    [ ${rand[$i]} -lt $min ] && min=${rand[$i]}
done
echo "Max: $max Min:$min"

數組示例1.PNG

三,數組數據處理

引用數組中的元素:

    所有元素:${ARRAY[@]}, ${ARRAY[*]}

    數組切片:${ARRAY[@]:offset:number}

        offset:  要跳過的元素個數

        number:  要取出的元素個數

        取偏移量之后的所有元素

        ${ARRAY[@]:offset}

數組切片.PNG

向數組中追加元素:

    ARRAY[${#ARRAY[*]}]

數組追加元素.PNG

刪除數組中的某元素:導致稀疏格式

    unset ARRAY[INDEX]

刪除數組的某個元素.PNG

關聯數組:

    declare -A ARRAY_NAME  注意:必須先聲明,再調用

    ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘…)

四,字符串處理

bash 的字符串處理工具:

字符串切片:

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

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

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

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

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

    ${var:offset: -lengh} :從最左側跳過offset 字符,一直取到字符串的最右側lengh個字符之前。

字符切片.PNG

基于模式取字符串:

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

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

基于模式取字符串.PNG

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

    示例:

        file="var/log/messages“

        ${file#*/}: log/messages

        ${file##*/}: messages

基于模式取字符串 2.PNG

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

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

        file="/var/log/messages"

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

基于模式取字符串 3.PNG

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

示例:

    url=http://www.magedu.com:80

    ${url##*:} 80

    ${url%%:*} http

基于模式取字符串 4.PNG

查找替換:

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

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

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

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

基于模式取字符串 5.PNG

查找并刪除:

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

    ${var//pattern} :所有

    ${var/#pattern} :行首

    ${var/%pattern} :行尾

基于模式取字符串 6.PNG

字符大小寫轉換:

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

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

基于模式取字符串 7.PNG

五,變量賦值

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

變量賦值.PNG

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

變量賦值2.PNG

    ${var:=value} :如果var 為空或未設置,那么返回value ,并將value 賦值給var ;否則,則返回var的值。

變量賦值3.PNG

    ${var:?error_info} :如果var 為空或未設置 ,那么在當前終端打印error_info ;否則,則返回var 的值。

變量賦值4.PNG

為腳本程序使用配置文件, 實現變量賦值

    (1)  定義文本文件,每行定義“name=value”

    (2)  在腳本中source 此文件即可

六,高級變量用法- 有類型變量

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

declare [ 選項]  變量名

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

    -i  將變量定義為整型數

declare -r 和  -i 只讀和整數.PNG

    -a  將變量定義為數組

    -A  將變量定義為關聯數組

declare  -A 索引.PNG

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

declare -f 只看函數.PNG

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

declare -F 只看函數名.PNG

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

    -l 將變量值轉為小寫字母 declare –l var=UPPER

    -u 將變量值轉為大寫字母 declare –u var=lower

declare -l 和 -u 大小寫.PNG

間接變量引用

    如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱為間接變量引用。

    variable1=variable2

    variable2=value

    variable1 的值是variable2 ,而variable2 又是變量名,

    variable2 的值為value ,間接變量引用是指通過variable1獲得變量值value的行為

    bash Shell 提供了兩種格式實現間接變量引用

    eval tempvar=\$$variable1

    tempvar=${!variable1}

間接變量.PNG

示例:

    [root@server ~]# N=NAME

    [root@server ~]# NAME=an

    [root@server ~]# N1=${!N}

    [root@server ~]# echo $N1

    an

    [root@server ~]# eval N2=\$$A

    [root@server ~]# echo $2

    an

eval 命令

    eval 命令將會首先掃描命令行進行所有的置換,然后再執行該命令。該命令適用于那些一次掃描無法實現其功能的變量。該命令對變量進行兩次掃描。

示例:

    [root@server ~]# CMD=whoami

    [root@server ~]# echo $CMD

    whoami

    [root@server ~]# eval $CMD

    root

eval.PNG

七,bash 如何展開命令行

    把命令行分成單個命令詞

    展開別名

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

    展開波浪符聲明(~) )

    命令替換$() 和 “) )

    再次把命令行分成命令詞

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

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

    運行命令

防止擴展

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

    $ echo Your cost: \$5.00

    Your cost: $5.00

加引號來防止擴展

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

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

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

        ` (反引號) - 命令替換

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

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

八,創建臨時文件

mktemp 命令:創建的臨時文件可避免沖突

mktemp [OPTION]… [TEMPLATE]

    TEMPLATE: filename.XXX

    X 至少要出現三個

OPTION: :

    -d:  創建臨時目錄

    -p DIR 或–tmpdir=DIR :指明臨時文件所存放目錄位置

示 例 :

    #mktemp /tmp/test.XXX

    #tmpdir=`mktemp –d /tmp/testdir.XXX`    

    #mktemp –tmpdir=/testdir test.XXXXXX

mktemp  創建臨時文件或目錄.PNG

九,安裝復制文件

install 命令:

    install [OPTION]… [-T] SOURCE DEST  單文件

    install [OPTION]… SOURCE… DIRECTORY

    install [OPTION]… -t DIRECTORY SOURCE…

    install [OPTION]… -d DIRECTORY… 創建空目錄

install 安裝復制.PNG

選項:

    -m MODE ,默認755

    -o OWNER

    -g GROUP

install -m -o -g.PNG

示例:

    install -m 700 -o wang -g admins file1 file2

    install –m –d /testdir/installdir

install  -d 創建目錄.PNG

十,shell 登錄兩種方式

交互式登錄:

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

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

執行順序:

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

bash 數組和變量

bash 數組和變量

優先級 2.PNG

非交互式登錄:

    (1)su UserName

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

    (3) 執行腳本

執行順序:

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

按功能劃分,存在兩類:

profile 類和bashrc類

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

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

        個人:~/.bash_profile

    功用:

        (1)  用于定義環境變量

        (2)  運行命令或腳本

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

        全局:/etc/bashrc

        個人:~/.bashrc

    功用:

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

        (2)  定義本地變量

bash 的配置文件

按生效范圍劃分,存在兩類:

    全局配置:

        /etc/profile

        /etc/profile.d/*.sh

        /etc/bashrc

    個人配置:

        ~/.bash_profile

        ~/.bashrc

編輯配置文件生效

    修改profile 和bashrc 文件后需生效

    兩種方法:

        1 重新啟動shell 進程

        2 .  或source

    例

        . ~/.bashrc

Bash退出任務

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

    在退出登錄shell 時運行

用于

    創建自動備份

    清除臨時文件

原創文章,作者:AN0519,如若轉載,請注明出處:http://www.www58058.com/39883

(0)
AN0519AN0519
上一篇 2016-08-24 20:24
下一篇 2016-08-24 21:21

相關推薦

  • linux系統啟動流程

    linux系統啟動流程 CentOS(5、6)系統啟動流程 具體流程: 加載BIOS的硬件信息與進行自我測試,并依據設置取得第一個可啟動的設備; 讀取并執行第一個啟動設備內MBR的boot Loader 依據boot Loader的設置加載Kernel,Kernel會開始檢測硬件與加載驅動程序 硬件驅動成功后,Kernel會主動調用init進程,而init會…

    Linux干貨 2016-09-11
  • N25_第十一周的作業

    1、詳細描述一次加密通訊的過程,結合圖示最佳。 2、描述創建私有CA的過程,以及為客戶端發來的證書請求進行辦法證書。 3、描述DNS查詢過程以及DNS服務器類別。          第一段:主機到運營商的DNS服務器(遞歸)    &nbs…

    Linux干貨 2017-02-22
  • Linux基礎學習總結(六)

    一、創建一個10G分區,并格式為ext4文件系統; 1、要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl; [root@blog ~]# fdisk /dev/sdfCommand (m for help): nCommand action e extended p primary partition (1…

    2016-11-06
  • 管理分區和文件系統及掛載設備

    管理分區 列出塊設備 lsblk       分區工具fdisk fdisk -l /dev/sdX 查看硬盤分區信息 CentOS7: fdisk -l /dev/sda 默認開啟dos及扇區顯示模式    開啟dos及柱面顯示模式:fdisk -c=dos -u=cylinders -l /dev/sda…

    2017-08-26
  • N26-博客作業-week11

    1、詳細描述一次加密通訊的過程,結合圖示最佳。 加密過程 1、先用單向加密算法計算出數據的特征碼 2、私鑰加密特征碼,并將結果附加在數據之后 3、生成一個臨時的對稱密鑰,并使用對稱密鑰加密整段數據 4、獲取對方的公鑰,使用該公鑰加密之前生成的臨時對稱密鑰,并附加在數據之后 5、將所有數據發送給對方解密過程 1、先使用私鑰解密加密的對稱密鑰 2、用對稱密鑰解密…

    2017-04-18
  • > 輸出重定向

    重定向輸出 > >> 追加 目 錄 1、 >正確定向等同于1> 2、 2> 錯誤定向 3. &> 把錯誤導成正確的{洗錢} 4. 正確的變成錯誤的 5. > 覆蓋 6. 舉一反三 最近學的命令中學到了一些很有意思的命令,分享一下 > 重定向輸出 最…

    Linux干貨 2017-08-13
欧美性久久久久