1

変数を使用してファイル内の文字列を検索しようとしています。

3 つまたは 4 つのパラメーターを受け入れるスクリプトがあります。3 つが必要です。4番目は必須ではありません。

同じ行内で一致する 3 つのパラメーターをテキスト ファイルで検索したいと思います。一致する場合は、その行を削除して新しい行に置き換えます。基本的に、設定されている場合は 4 番目のパラメーターを更新し、回避します。重複するエントリ。

現在、これは私が持っているものです:

input=$(egrep -e '$domain\s+$type\s+$item' ~/etc/security/limits.conf)

if [ "$input" == "" ]; then

    echo $domain $type $item $value >>~/etc/security/limits.conf

    echo \"$domain\" \"$type\" \"$item\" \"$value\" has been successfully added to your limits.conf file.


else
    cat ~/etc/security/limits.conf | egrep -v "$domain|$type|$item" >~/etc/security/limits.conf1
    rm -rf ~/etc/security/limits.conf
    mv ~/etc/security/limits.conf1 ~/etc/security/limits.conf

    echo $domain    $type    $item   $value >>~/etc/security/limits.conf

    echo \"$domain\" \"$type\" \"$item\" \"$value\" has been successfully added to your limits.conf file.
    exit 0
fi

input=egrepこれで、 etc.. が機能しないことはすでにわかっています。いくつかの値をハードコーディングすると機能しますが、それらの変数は受け入れられません。基本的に私はdomain=$1type=$2などを持っています。

3つの変数すべてが1行内で一致しない場合は、ファイルの最後にパラメーターを追加するだけで、パラメーターが一致する場合はそれらを削除して、ファイル。sed や awk などの他のものを使用できることはわかっていますが、まだ学習していません。

これは学校の課題のためのものであり、すべての助けに非常に感謝していますが、それが機能する/機能しない理由と方法も知りたいので、それに対する回答も提供していただければ幸いです!

4

3 に答える 3

2

三つのこと:

  • コマンドの出力を割り当てるには、var=$(cmd) を使用します。
  • 割り当ての = の周りにスペースを入れないでください。
  • 式は一重引用符で展開されません。二重引用符を使用してください。

要約する:

input=$(egrep -e "$domain\s+$type\s+$item" ~/etc/security/limits.conf)

また、~ はホーム ディレクトリであること/etc/security/limits.confにも注意してください。/home/youruser/etc/security/limits.conf

于 2013-02-17T04:19:58.240 に答える
0

この行:

input=$(egrep -e '$domain\s+$type\s+$item' ~/etc/security/limits.conf)

シェルが変数値を補間できるように、正規表現を二重引用符で囲む必要があります。

input=$(egrep -e "$domain\s+$type\s+$item" ~/etc/security/limits.conf)

バックスラッシュには注意が必要です。このコンテキストでは、おそらくそれらを 2 倍にする必要はありませんが、その理由を知っていることを確認する必要があります。

最初のコマンドは、ファイルからデータを削除するために使用されるegrep2 番目のコマンドよりも、選択する内容がはるかに制限されていることに注意してください。egrep1 つ目は、1 行に 3 つのフィールドを入力する必要があります。2 つ目は、行を削除するために単語のいずれかと一致することのみを必要とします (それはより大きな単語の一部である可能性があります)。

はファイルであるため、 ;のオプション~/etc/security/limits.confを使用する必要はありません。ディレクトリを削除する場合を除き、 を使用しないことをお勧めします。-rrm-r

于 2013-02-17T04:25:24.280 に答える
0

スクリプトにいくつかのバグがあります。いくつかのコメントが追加されたスクリプトを次に示します

input=$(egrep -e '$domain\s+$type\s+$item' ~/etc/security/limits.conf)
     # use " not ' in the string above or the shell can't expand your variables.
     # some versions of egrep won't understand '\s'. The safer, POSIX character class is [[:blank:]].

if [ "$input" == "" ]; then
     # the shell equality test operator is =, not ==. Some shells will also take == but don't count on it.
     # the normal way to check for a variable being empty in shell is with `-z`
     # you can have problems with tests in some shells if $input is empty, in which case you'd use [ "X$input" = "X" ].

    echo $domain $type $item $value >>~/etc/security/limits.conf
    # echo is unsafe and non-portable, you should use printf instead.
    # the above calls echo with 4 args, one for each variable - you probably don't want that and should have double-quoted the whole thing.
    # always double-quote your shell variables to avoid word splitting ad file name expansion (google those - you don't want them happening here!)

    echo \"$domain\" \"$type\" \"$item\" \"$value\" has been successfully added to your limits.conf file.
    # the correct form would be:
    # printf '"%s" "%s" "%s" "%s" has been successfully added to your limits.conf file.\n' "$domain" "$type" "$item" "$value"

else
    cat ~/etc/security/limits.conf | egrep -v "$domain|$type|$item" >~/etc/security/limits.conf1
    # Useless Use Of Cat (UUOC - google it). [e]grep can open files just as easily as cat can.

    rm -rf ~/etc/security/limits.conf
    # -r is for recursively removing files in a directory - inappropriate and misleading when used on a single file.

    mv ~/etc/security/limits.conf1 ~/etc/security/limits.conf
    # pointless to remove the file above when you're overwriting it here anyway

    # If your egrep above failed to create your temp file (e.g. due to memory or permissions issues) then the "mv" above would zap your real file. the correct way to do this is:
    #     egrep regexp file > tmp && mv tmp file
    # i.e. use && to only do the mv if creating the tmp file succeeded.

    echo $domain    $type    $item   $value >>~/etc/security/limits.conf
    # see previous echo comments.

    echo \"$domain\" \"$type\" \"$item\" \"$value\" has been successfully added to your limits.conf file.
    # ditto

    exit 0
    # pointless and misleading having an explicit "exit <success>" when that's what the script will do by default anyway.

fi
于 2013-02-17T11:57:47.323 に答える