技術共有

【Linux】【シェル】【シェル変数】を詳しく解説

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


1. ローカル変数

  • シェル変数を定義します。変数名を追加する必要はありません$
  • ローカル変数ユーザーの現在のシェル存続期間中のみ有効です

2. 変数の定義

  • 変数名の要件: 文字、数字、アンダースコアで構成されます。文字またはアンダースコアで始めることができます。
  • 変数名では大文字と小文字が厳密に区別されます

3. 変数値を取得する

  • アポストロフィ: 見たものは得られるもの、力強い引用
  • 二重引用符: すべての内容を引用符で囲んで出力し、特殊記号、弱参照を識別します。
  • 引用符なし: 連続する記号には引用符を使用しなくてもかまいません。スペースがある場合は、二重引用符を使用することをお勧めします。
  • バックティック: コマンドの実行結果を参照します。$()使用法

4.特殊変数

  • シェルの特別な変数。パラメータを渡すためにスクリプトや関数で使用されます。

  • 次の特別な位置パラメータ変数があります。

    変数効果
    $0シェルスクリプトのファイル名とスクリプトのパスを取得します。
    $nシェルスクリプトのn番目のパラメータを取得します。nは1から9の間です。9より大きい場合、いくつかの値が返されます。{}、のように{$10}
    $#実行されたシェルスクリプトの背後にあるパラメータの総数を取得します
    $*引用符なしでシェル スクリプトのすべてのパラメータを取得します。これは次と同等です。$@関数に引用符 "$*" を加えたものは次のとおりです。すべてのパラメータを単一の文字列として受け取ります
    $@引用符を使用しない場合、効果は上記と同じです。すべてのパラメータを独立した文字列として受け取ります

5.特殊な状態変数

  • 検索方法man bash、検索Special Parameters

    変数効果
    $?最後のコマンド実行ステータスの戻り値、0が正常、0以外が失敗
    $$現在のシェルスクリプトのプロセス番号
    $!最後のバックグラウンドプロセスのPID
    $_最後のコマンドの最後のパラメータを取得します

6. シェル組み込み変数コマンド

1.エコー

  • パラメータ
    • -n: 内容を改行せずに出力します
    • -e: エスケープ文字を解釈します
      • n: 改行
      • r: 入力
      • t:タブ
      • b:バックスペース
      • v:垂直タブ文字

2.評価

  • 関数:複数のコマンドを実行する
  • eval ls; cd ~

3.実行

  • 関数: 子プロセスを作成して後続のコマンドを実行しないでください。exec実行後は自動的にexit

7. インターセプト文字列

  • 文法

    文法効果
    #先頭から最も短い一致を削除します
    ##先頭から最長一致を削除します
    %最も短い一致を末尾から削除します
    %%末尾から最長一致を削除します
    #指定された文字コンテンツのインターセプト
    a*ca で始まり、途中に任意の数の文字があり、c で終わる文字列と一致します。
    ${变量}戻り変数の値
    ${#变量}変数長、文字長を返す
    ${变量:start}変数オフセット値の後の文字を返します。
    ${变量:start:length}オフセット後の長さによって制限された文字を抽出する
    ${变量#word}変数の先頭から、一致する最短の単語部分文字列を削除します。
    ${变量##word}変数の先頭から、最も長く一致する単語を削除します
    ${变量%word}変数の末尾から一致する最短の単語部分文字列を削除します。
    ${变量%%word}変数の末尾から最長一致する単語の部分文字列を削除します。
    ${变量/pattern/string}最初に一致したパターンを文字列に置き換えます
    ${变量//pattern/string}すべてのパターンを文字列に置き換えます
  • 操作例:ファイル名を削除

    # 通过⼦串的替换⽅式
    snowk@SnowKYP# f=stu_102999_1_finished.jpg
    
    # 变量的⼦串功能,去掉后缀
    snowk@SnowKYP# echo ${f//_finished/}
    stu_102999_1.jpg
    
    # 利⽤变量的反引⽤替换⽂件名
    snowk@SnowKYP# mv $f `echo ${f//_finished/}`
    
    # 剩下的⽂件,利⽤循环操作
    # 找出剩下所有需要替换的jpg⽂件
    snowk@SnowKYP# ls *fin*.jpg
    stu_102999_2_finished.jpg stu_102999_3_finished.jpg stu_102999_4_finished.jpg
    stu_102999_5_finished.jpg
    
    # 写shell循环代码,循环操作
    # 去掉所有jpg⽂件的_finished后缀
    snowk@SnowKYP# for file in `ls *fin*.jpg`;do mv $file `echo ${file//_finished/}`;done
    
    snowk@SnowKYP# ls *.jpg
    stu_102999_1.jpg stu_102999_2.jpg stu_102999_3.jpg stu_102999_4.jpg stu_102999_5.jpg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

8. 特殊シェル拡張変数処理

1. 文法

  • 関数: これら 4 つの拡張変数はいずれも変数値の判定と処理に属します。
  • 文法parameter,参数,范围
    • ${parameter:-word}:もしparameter変数値が空です、戻りますword
    • ${parameter:=word}:もしparameter変数値が空の場合、word変数値を置き換えてその値を返します
    • ${parameter:?word}:もしparameter変数値が空です。wordとしてstderr出力、それ以外の場合は変数値を出力
      • 変数を空に設定したためにエラーが発生した場合に、エラー メッセージを返すために使用されます。
    • ${parameter:+word}:もしparameter変数値が空の場合は何もしません。それ以外の場合は、word戻る

2. 応用シナリオ

  • データのバックアップ、期限切れデータを削除するスクリプト
    # 原脚本命令,有bug,有歧义
    find ${file_path} -name '*.tar.gz' -type f -mtime +7 | xargs rm -f
    
    # 修正后的脚本命令
    # 如果有bug起义,就在当前目录搜索并执行删除
    find ${file_path:=/tmp} -name '*.tar.gz' -type f -mtime +7 | xargs rm -f
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6