シェル学習ノート

31443 ワード

これは自分でシェルを勉強しているノートです.主に参考にしているのはhttp://www.runoob.com/linux/linux-shell.html
シェル紹介
  • シェルはコマンド言語であり、プログラム設計言語でもあります.
  • は、コマンド言語として、ユーザ入力のコマンドをインタラクティブに解釈して実行する.プログラム設計言語としては、各種変数とパラメータを定義し、循環と分岐を含む多くの制御構造を高度な言語において提供しています.
  • Shellの2つの命令を実行する方法
  • インタラクティブ(Interactive):ユーザーの命令を実行することを説明し、ユーザーがコマンドを入力すると、Shellは1つのコマンドを実行すると説明します.
  • バッチ処理(Batch):ユーザはあらかじめShellスクリプト(Script)を書いておき、その中には多くのコマンドがあり、Shellに一回にこれらのコマンドを実行させて、命令を一つずつ鳴らす必要がない.
  • よくあるシェル
  • bash:Linux標準のshell
  • 他のsh、csh、ksh
  • 最初のshell
    #!/bin/bash 
    echo "Hello World!"
    ヽ約束のマークです.このスクリプトはどのようなインタプリタが実行されるべきかをシステムに教えます.echoコマンドは、テキストをウィンドウに出力します.
    shellの実行方法は2つあります.直接運行またはshellで実行します.
    Shell変数:Shell変数の定義、変数の削除、読み取り専用変数、変数タイプ
    変数を定義
    指定時に直接値を割り当て、使用時には「$」の記号を使用します.
    #!/bin/bash 
    myUrl="blog.csdn.net/charles1e"
    myName="yanke"
    echo ${myUrl}
    echo ${myName}
    myName="Yan Ke"
    echo ${myName}
    読み取り専用変数
  • readonlyコマンドを使用して変数を読み取り専用変数と定義できます.読み取り専用変数の値は変更できません.
    #!/bin/bash 
    myUrl="www.blog.net/charles1e"
    readonly myUrl
    myUrl="www.blog.net/charles"
    実行:
    ./ReadOnlyVariable.sh: line 5: myUrl: readonly variable
    変数を削除
  • は、unsetコマンドを使用して変数を削除することができます.変数が削除された後は再使用できません.unsetコマンドは読み取り専用変数を削除できません.
  • #!/bin/bash 
    myName="Yan Ke"
    unset myName
    echo ${myName}
    出力がありません.
    変数の種類
  • ローカル変数
  • 環境変数
  • shell変数
  • シェル特殊変数
    シェル置換
    Shell演算子:Shell演算子、関係演算子、ブール演算子、文字列演算子など
    算術演算子
  • 式と演算子にはスペースがあります.
  • 完全な表現は「包囲
  • 」になります.
  • 条件式は、四角い括弧の間に配置され、スペース
  • があります.
    a=10
    b=20
    val=`expr $a + $b`
    echo "a+b: ${val}"
    
    val=`expr $a - $b`
    echo "a-b: ${val}"
    
    val=`expr $a \* $b`
    echo "a*b: ${val}"
    
    val=`expr $b / $a`
    echo "b/a: ${val}"
    
    val=`expr $b % $a`
    echo "b%a: $val"
    
    if [ $a == $b ]
    then
        echo "a is equal to b"
    fi
    
    if [ $a != $b ]
    then
        echo "a is not equal to b"
    fi
    
    関係演算子
    #!/bin/bash 
    a=10
    b=20
    
    if [ $a -eq $b ]
    then
        echo "$a -eq $b : a is equal to b"
    fi
    
    if [ $a -ne $b ]
    then
        echo "$a -ne $b : a is not equal to b"
    fi
    
    if [ $a -gt $b ]
    then
        echo "$a -gt $b : a is greater than b"
    else
        echo "$a -gt $b : a is not greater than b"
    fi
    
    if [ $a -lt $b ]
    then
        echo "$a -lt $b : a is lese than b"
    else
        echo "$a -lt $b : a is not less than b"
    fi
    
    if [ $a -ge $b ]
    then
        echo "$a -ge $b : a is greater or equal to b"
    else
        echo "$a -ge $b : a is not greater or equal to b"
    fi
    ブール演算子!:非-o:または-a:
    文字列演算子
  • =は、2つの文字列が等しいかどうかを検出し、trueに戻ります.
  • !=は、2つの文字列が等しいかどうかを検出し、trueに戻ります.
  • -zは、文字列長が0かどうかを検出し、0のためにtrueを返します.
  • -nは、文字列長が0かどうかを検出し、0のためにtrueを返さない.
  • strは、文字列が空であるかどうかを検出し、空のためにtrueを返さない.
  • ファイルテスト
    #!/bin/bash 
    file="./helloworld.sh"
    
    if [ -r $file ]
    then
        echo "File has read access"
    else
        echo "File does not have read access"
    fi
    
    if [ -w $file ]
    then
        echo "File has write access"
    else
        echo "File does not have write permission"
    fi
    
    if [ -x $file ]
    then
        echo "File has execute permission"
    else
        echo "File has no execute permission"
    fi
    
    if [ -f $file ]
    then
        echo "File is an ordinary file"
    else
        echo "This is a special file"
    fi
    
    if [ -d $file ]
    then
        echo "File is a directory"
    else
        echo "This ia not a directory"
    fi
    
    if [ -s $file ]
    then
        echo "File size is zero"
    else
        echo "File size is not zero"
    fi
    
    if [ -e $file ]
    then
        echo "File exits"
    else
        echo "File does not exit"
    fi
    
    File has read access
    File has write access
    File has execute permission
    File is an ordinary file
    This ia not a directory
    File size is zero
    File exits
  • -b fileは、ファイルがブロックデバイスファイルであるかどうかを検出し、もしそうであれば、trueに戻ります.
  • -c fileは、ファイルが文字デバイスファイルであるかどうかを検出し、もしそうであれば、trueに戻ります.
  • -d fileは、ファイルがディレクトリであるかどうかを検出し、もしそうであれば、trueに戻ります.
  • -f fileは、ファイルが通常のファイルであるかどうか(ディレクトリでもデバイスファイルでもない)を検出し、もしそうであれば、trueに戻ります.
  • -g fileは、ファイルがSGIDビットを設定しているかどうかを検出し、もしそうであれば、trueに戻ります.
  • -k fileは、ファイルに粘着ビットが設定されているかどうかを検出し、もしそうであれば、trueに戻ります.
  • -p fileは、ファイルが有名なパイプであるかどうかを検出し、もしそうであれば、trueに戻ります.
  • -u fileは、ファイルにSUIDビットが設定されているかどうかを検出し、もしそうであれば、trueに戻ります.
  • -r fileは、ファイルが読み込まれているかどうかを検出し、もしそうであれば、trueに戻ります.
  • -w fileは、ファイルが書き込み可能かどうかを検出し、もしそうであれば、trueに戻ります.
  • -x fileは、ファイルが実行可能かどうかを検出し、もしそうであれば、trueに戻ります.
  • -s fileは、ファイルが空かどうか(ファイルサイズが0より大きいかどうか)を検出し、空のためにtrueに戻りません.
  • -e fileは、ファイル(ディレクトリを含む)が存在するかどうかを検出し、もしそうであれば、trueに戻ります.
  • Shellコメント
  • #で始まる行は注釈であり、解釈器によって無視されます.
  • shには複数行の注釈がありません.
    シート文字列
  • 文字列と数字だけがあります.
  • 文字列はシングルクォーテーションマークでもいいし、ダブルクォーテーションマークでもいいです.
  • 単引用符文字列の制限:単引用符の中の任意の文字はそのまま出力されます.単引用符文字列の変数は無効です.単引用符文字列に単引用符が現れません.
  • ダブルクォーテーションの利点:ダブルクォーテーションには変数のダブルクォーテーションがあります.
    文字列スティッチング
    #!/bin/bash 
    name="yanke"
    greeting="hello, "${name}"!"
    greeting1="hello, ${name}!"
    echo ${greeting} ${greeting1}
    文字列の長さ
    $ string="abcd"
    $ echo ${#string}
    4
    文字列の切り取り
    $ string="Talk is cheap,show me the code!"
    $ echo ${string:1:4}
    alk
    
    シェル配列
    bashは1次元配列をサポートしています.配列のサイズを制限していません.配列の下付きは0から始まります.
    配列の定義
    array_name=(value0 value1 value2 value3)
  • は、配列の各成分
  • を個別に定義することができる.
  • は、連続した下付きスケーリングを使用しなくてもよく、かつ、下付きの範囲には制限がない.
  • リード配列
    ${array_name[index]}
    #!/bin/bash 
    Name[0]='Zara'
    Name[1]='Qadir'
    Name[2]='Mahnaz'
    Name[3]='Ayan'
    #        
    echo "first index: ${Name[0]}"
    echo "Second inde;inde;x: ${Name[1]}"
    #       
    echo "First Method:${Name[*]}"
    echo "Second Method:${Name[@]}"
    #       
    length=${#Name[*]}
    #   
    #length=${#Name[@]}
    #         
    lengthn=${#Name[2]}
    echo "The length of Name:${length}"
    echo "The length of Name[2]:${lengthn}"
    first index: Zara
    Second inde;inde;x: Qadir
    First Method:Zara Qadir Mahnaz Ayan
    Second Method:Zara Qadir Mahnaz Ayan
    The length of Name:4
    The length of Name[2]:6
    Shell echoコマンド
    #!/bin/bash 
    #echo       :
    #echo arg
    
    #      
    echo "\"It is a test\""
    
    #    
    name="OK"
    echo "${name} It is a test"
    
    #    
    echo -e "OK! 
    "
    #-e echo "It's a test" # echo -e "OK!\c" echo "It's a test" # echo "It is a test" > myfile # echo '$name\"' # echo `date`
    "It is a test"
    OK It is a test
    OK! 
    
    It's a test OK!It's a test
    $name\" Thu Sep 29 22:08:53 CST 2016
    Shell printfコマンド
    #!/bin/bash 
    #printf      :
    #printf format-string [arguments..]
    #format-string        
    #arguments     
    
    echo "Hello, Shell!"
    printf "Hello Shell
    "
    #printf ## printf "%-10s %-8s %-4s
    "
    kg printf "%-10s %-8s %-4.2f
    "
    66.1234 printf "%-10s %-8s %-4.2f
    "
    48.6543 printf "%-10s %-8s %-4.2f
    "
    47.9876 #format-string printf "%d %s
    "
    1 "abc" # printf '%d %s
    '
    1 "abc" # printf %s abcdef # , printf %s abc def printf "%s
    "
    abc def printf "%s %s %S
    "
    a b c d e f g h i j # guments, %s NULL ,%d 0 printf "%s and %d
    "
    変換記号:
  • \a警告文字は、通常ASCIIのBEL文字
  • である.
  • \b後退
  • \cは、出力結果の任意の終端の改行文字(%bフォーマット・インジケータによって制御されたパラメータ文字列のみで有効)を抑制し、また、パラメータ内に残された文字、次のパラメータ、および任意のフォーマット文字列内に残された文字は無視される.
  • \fページを切り替える

  • 改行
  • \rリターン
  • \t水平タブ
  • \v垂直タブ
  • \\文字の上のバックボーン
  • \dddは、1から3桁の8進数の値を表す文字です.フォーマット文字列だけで有効です.
  • \0dddは、1から3ビットの8進数文字
  • を表しています.
    シェルフロー制御
    #!/bin/bash 
    #for  
    for loop in 1 2 3 4 5
    do
        echo "The value is : $loop"
    done
    
    #while  
    i=1
    while(( ${i}<=5 ))
    do
        echo $i
        let "i++"
    done
    
    #while      
    #echo "  <CTRL-D>   "
    #echo -n "          :"
    #while read FILM
    #do
    # echo "  !${FILM}      "
    #done
    
    #until  :     , while   
    
    #case    
    echo "  1 4     "
    echo -n "       :"
    read aNum
    case ${aNum} in
        1) echo "    1"
            ;;
        2) echo "    2"
            ;;
        3) echo "    3"
            ;;
        4) echo "    4"
            ;;
        *) echo "     1 4    "
            ;;
    esac
    
    #    
    #break      
    #continue      
    while :
    do
        echo -n "  1 5     :"
        read num
        case ${num} in
            1|2|3|4|5) echo "       $num"
                ;;
            *) echo "        1 5  ,    !"
                break
                ;;
        esac
    done
    
    
    while :
    do
        echo -n "  1 5     :"
        read num
        case ${num} in
            1|2|3|4|5) echo "       $num"
                ;;
            *) echo "        1 5  "
                continue
                echo "    "
                ;;
        esac
    done
    
    シェル関数$#からスクリプトに渡されたパラメータ個数$*は、スクリプトに渡されたすべてのパラメータ$$シナリオによって実行されている現在のプロセスID番号$!のバックグラウンドで実行されている最後のプロセスのID番号$@$*と同じであるが、使用時に引用符を付けて各パラメータを返す.$-は、Shellが使用していることを表示する.現在のオプションは、setコマンド機能と同じです.$?は最後のコマンドの終了状態を表示します.0はエラーがないことを示しています.他のどの値もエラーがあることを示しています.
    #!/bin/bash 
    #    
    #1、   function fun()   ,     fun()   ,      。
    #2、    ,     :return   ,    ,            ,     。 return    n(0-255)))
    
    demoFuc()
    {
        echo "Hello world!"
    }
    
    echo "--------      -----------"
    demoFuc
    echo "--------      -----------"
    
    
    #        :    return
    fucWithReturn()
    {
        echo "          "
        echo -n "        :"
        read num1
        echo -n "        :"
        read num2
        echo "        ${num1} ${num2}"
        return $((${num1} + ${num2}))
    }
    
    fucWithReturn
    echo "  :$? ."
    
    #       :$n     
    
    funWithParam()
    {
        echo "      :$1 ."
        echo "      :$2 ."
        echo " 10    :${10} ."
        echo "      :$#  ."
        echo "       : $* ."
    }
    
    funWithParam 1 2 3 33 544 5 33 23 23 53 45 22 33
    
    シェル入出力リダイレクトcommand > fileは出力をfileにリダイレクトします.command < fileは入力をfileにリダイレクトします.command >> fileは出力を追加的にfileにリダイレクトします.n > fileはファイル記述子がnのファイルをfileにリダイレクトします.n >> fileはファイル記述子がnのファイルを追加的にfileにリダイレクトします.n >& mは出力ファイルmとnをマージします.679142は入力ファイルmとnを結合し、n <& mは開始フラグと終了フラグの内容を入力とする.
    Here Dcument
    Here DcumentはShellの特殊なリダイレクト方式で、入力を対話式Shellスクリプトまたはプログラムにリダイレクトするために使用されます.その基本的な形式は以下の通りです.
    command << delimiter
        document
    delimiter
    2つのdelimiterの間の内容を入力としてcommandに伝える役割を果たしています.注意:1.エンディングのdelimiterは必ずトップに書いてください.前には文字がなく、後ろにはスペースやtabを含めて字を詰めてはいけません.2.最初のdeliterの前後のスペースは無視されます.
    //dev/nullファイル
    コマンドを実行したいが、出力結果を画面に表示したくない場合、出力を<< tag:/dev/null $ command > /dev/nullにリダイレクトすることができ、特殊なファイルであり、書き込みの内容は全部破棄されます.このファイルからコンテンツを読み取ることを試みると、何も読めません.しかし、/dev/nullファイルは非常に有用で、コマンドの出力をリピートします.方向を向けると、「出力禁止」の効果があります.もしシールドしたい場合は、/dev/nullと書いてもいいです.
    Shellファイルが含まれています
    他の言語と同様に、Shellも外部スクリプトを含んでいます.このように、独立したファイルとしていくつかの共通コードを実装するのに便利です.Shellファイルに含まれる構文フォーマットは以下の通りです.$ command > /dev/null 2>&1または. filename # (.) は、2つのshellスクリプトファイルを作成する.test 1.shコードは以下の通りです.
    #!/bin/bash
    # author:    
    # url:www.runoob.com
    
    url="http://www.runoob.com"
    test 2.shコードは以下の通りです.
    #!/bin/bash
    # author:    
    # url:www.runoob.com
    
    #   .     test1.sh   
    . ./test1.sh
    
    #             
    # source ./test1.sh
    
    echo "        :$url"
    次に、私達はtest 2 shに実行可能な権限を追加して実行する.source filename $ chmod +x test2.sh $ ./test2.sh注:含まれるファイルtest 1.shは実行可能な権限を必要としない.