Bash配列と文字スライス(高度な使い方)


 、case function
 、 
 、 
 .bash 
 . 

一、caseとfunction関数、case文case文:case$VAR in PAT 1)分岐1;PAT 2)分岐2;*)ブランチn;Esac PATTERN:GLOB関数;構造化プログラミング、コード再利用function f_name{関数体}f_name(){関数体}関数定義関数呼び出し:与えられた関数名AcoRG 1 ARG 2//局所変数:local VAR=VALUE 2、配列:プログラム=命令+データ命令:PATHにおける命令データ:変数、ファイル変数ふぁいるへんすう:名前付きメモリ空間変数めいめいなメモリ空間変数めいめいなメモリ空間配列めいめい:1つの要素を格納するメモリ空間配列めいめい:複数の要素を格納する連続メモリ空間配列名めいめい:配列全体に1つの名前しかない配列インデックス:番号0から配列名[インデックス]${ARRAR_NAME[INDEX]//について{}必要//$a[0]//は「a[0]」を変数としてbashサポート疎フォーマットを使用します注意:bash-4以降のバージョンでは、0,1,2だけでなく、カスタムインデックスフォーマットをサポートします.フォーマットこのような配列は「関連配列」declare-a index配列と呼ばれ、インデックス番号は0,1,2,...-A関連配列、カスタムインデックス、辞書の割り当てに似ています:1.単一付与a[0]=dog a[1]=pig 2.一度に複数の//スペースを区切り記号a=(「va 1」,「va 2」,「va 3」,「va 4」,.)/このように直接付与値はa[0]a=(「va 1」「va 2」「va 3」「va 4」に付与する.//これでいいです.特定の要素//疎形式の配列a=([0]=[VA 1][3]=[VA 3]...)/b=([0]=2[3]=5[6]=8)/文字の場合は、「」b=(「1」「2」「3」「54」)/の間にスペース4を用いる.read -a ARRAY_name//world[us]=「ameriacan」//関連配列world[cn]=「china」...echo${wold[us]}注意:参照時に配列名のみが与えられ、次の表0を参照する要素配列の長さ(配列内の要素の個数)を表すdeclare-A wolf//関連配列echo${#a[@]//すべての要素の個数echo${#a[*]//すべての要素の個数echo${#a}//最初の要素の文字の個数echo${a[*]}//すべての要素を参照echo${a[@]}//すべての要素を参照echo${a[2]}//a[2]に使用される文字数[root@MT ~]# declare -a files         [root@MT~]#files=("/var/log/*.log")/このように遊ぶことができます3、配列スライス配列要素スライス:${ARRAR_NAME[@]:offset:uumber}//offset:通過する要素の個数、前のいくつかはnumberではありません:取り出す要素の個数;numberを省略するとdeclare-a files files=(/etc/[pP]*)echo${files[@]:2:3}//2番目から(含む)、後ろに3つの要素echo${aa[1]:2:2}//文字を取り出し、前の2つは不要、取り出した後の2つのecho${aa[1]:-4}//右から左へ、4つ取り出し、注:空白が少なくない配列に要素を追加する:ARRAY_NAME[${#ARRAR_NAME[*]}=value//現在配列要素個数の次のfiles[${#files[*]]="wolf"配列中のある要素unset ARRAY[index]関連配列を削除する:declare-A ARRAY_NAME ab=([a]="wolf"[b]="tom"[c]="com")ab=([a]="wolf"[b]="tom"[c]="com")配列の下付き表示:指定文字4による.bashに内蔵文字列処理ツール1.文字列変数スライス:${var:offset:number}文字列のサブ列name=jerry echo${name:2}//前2個はecho${name:2:2}//前2個は要らず、2個のecho${name:-4}//右から左へ4個取り出し、注意:空白を少なくしてはいけない.検索削除:1.左から右へ:#{var#*word}:wordは指定された区切り記号です.機能:左から右へ、var変数に格納されている文字列の中で、初めて現れたword区切り文字を検索し、文字列の先頭からこの区切り文字までのすべての文字//先頭からwordまで#{var#**word}:wordは所定の区切り文字を指す.機能:左から右に、var変数に格納されている文字列のうち、最後に表示されたword区切り文字を検索し、文字列の先頭からこの区切り文字までのすべての文字//最後のword以降を削除します.最後のワードまで削除[root@MT scripts]# path="/etc/init.d/fucntion/sdf"            [root@MT scripts]# echo ${path#*/}                 etc/init.d/fucntion/sdf             [root@MTscripts]#echo${path##*/}sdf注意:区切り記号は「/」2.右から左//*wordの左か右か、どこから一致するかによって#{var%word*}:wordは指定された区切り記号です.機能:右から左へ、var変数に格納されている文字列の中で、初めて現れたword区切り文字を検索し、文字列の先頭からこの区切り文字までのすべての文字//末尾からwordまで#{var%%%*word*}:wordは所定の区切り文字を指す.機能:右から左へ、var変数に格納されている文字列のうち、最後に表示されたword区切り文字を検索し、文字列の先頭からこの区切り文字までのすべての文字//最後のword以降[root@MT scripts]#  path="/etc/init.d/fucntion/sdf"            [root@MT scripts]# echo ${path%/*}                 /etc/init.d/fucntion             [root@MTscripts]#echo${path%%/*}//は空で、何もありません.小結##*word%%word*//この2つの使い方を記録すればいい#:左から右へ*wordの前で%:右から左へ*wordの後で//:すべて#行の最初の%行尾を置き換える.置換の検索:
       ${var/PATTERN/SUBSTI}:  var , pattern , SUBSTI  
            //  
        ${var//PATTERN/SUBSTI}: //  
        ${var/#PATTERN/SUBSTI}: //  
        ${var/%PATTERN/SUBSTI}: //  
         glob 
            ?:  
         echo ${a/%[^[:digit:]]/N}     
        [root@MT scripts]# echo $path 
            /etc/init.d/fucntion/sdf 
        [root@MT scripts]# b=${path/etc/mmm} 
        [root@MT scripts]# echo $b 
            /mmm/init.d/fucntion/sdf 
        [root@MT scripts]# echo  $path 
            /etc/init.d/fucntion/sdf 
        [root@MT scripts]# b=${path/#etc/mmm} // ,  
        [root@MT scripts]# echo $b 
            /etc/init.d/fucntion/sdf 
        [root@MT scripts]# b=${path/#\/etc/mmm} //  
        [root@MT scripts]# echo $b 
            mmm/init.d/fucntion/sdf

    4.検索削除:${var/PAATTERN}:PATTERNモードでvar文字列の最初の一致を検索し、削除する${var//PAATTERN}:すべての${var/#PATTERN}:行ヘッダ${var/%PATTERN}:行末尾5を削除する.文字創大文字と小文字の変換${var^^}:varのすべての文字を大文字に変換します.${var,,}:varのすべてを小文字6に変換します.変数付与${var:-VALUE}:varが空の場合、または定義されていない場合はvalueを返します.そうでない場合、varを返す値//は戻り値がありますが、${var:=VALUE}:varが空の場合、または定義されていない場合はvalueを返し、値を割り当てます.そうでない場合はvarの値//が空で、${var:+VALUE}を返します.varが空でない場合はvalueを返します.それ以外の場合、nothing//NULL以外の値${var:?ERROF_INFO}:varがNULLの場合、または設定されていない場合、ERROR_を返します.INFO;そうでなければvar値//5を返します.テストスクリプトスクリプト1:配列を定義し、要素は/var/logディレクトリの下にあります.logの最後のファイル;偶数と表示されたファイルの行数の合計を統計します[root@MT ~]# declare -a files     [root@MT~]#files=("/var/log/*.log")/このような参照は誤りであり、「a[0]」[root@MT ~]# echo ${files[*]}  
    #!/bin/bash 
    declare -a files 
    files=(/var/log/*.log)        //  
 
    declare -i line=0 
    for i in $(seq 0 $[${#files[*]}-1]);do  //$(COMMAND ), ${#a[*]} 
        if [ $[$i%2] -eq 0 ] ;then 
            let line+=$(wc -l ${files[$i]} | cut -d' ' -f1) 
        fi 
    done 
    echo "num is $line"

スクリプト2:ベース名とパス名を取り出し、モードを使用してサブシリアルパス名を取る:echo"${path%/*}/";ベース名:echo'${path##*/};注意:コマンドリファレンス:a=$(wc-l/etc/passwd)/カッコ数値のみで計算できます:$[$a-a];let i++echo${aa[0]//配列${var:?ERROF_INFO}[]&[//[]以外の&&,|,![a-o b][c-a b]//[]内の、または、