ユーザー変数にチルダを使用する

ユーザー変数にチルダを使用する

インターネット上の関連投稿をたくさん見ましたが、好きな方法で動作させることはできません。

パスユーザーから入力を受け取りました。たとえば、ユーザーが ~/Desktop/ と入力すると、チルダのため、grep やその他のコマンドに $ans を使用することはできません。

以下は私のコードの例です。 2行目は今私の主な問題です。

read -p "Enter new path or type 'exit':   " ans
file=`grep -x $ans ~/.Log` 

助けてくれてありがとう。

ベストアンサー1

ここにはいくつかの質問があります。

  1. 変数への参照はありません。これは、ユーザーが渡すすべての項目が(パラメータ拡張後)スペースのトークン化の対象となることを意味します。そしてグローバル拡張。これは問題を引き起こすでしょう。望むより:

  2. ユーザー入力はハイフンで始めることができます。その場合はオプションとして解釈されますgrep。これを回避するには、このオプションを使用してパラメータに検索パターン(どんな形式でも)を具体的に-e教えてください。grep

  3. 正規表現検索を使用しています。正規表現の代わりに固定テキスト検索を行うこともできます。したがって-F

  4. バックティックは使用されなくなりました。代わりに使用してください$(...)。また見なさい:


これらの点をまとめると、次のようなコードが生成されます。

read -p "Enter new path or type 'exit':   " ans
file="$(grep -Fxe "$ans" ~/.Log)"

しかし、もう別の問題が発生しました。

  1. この変数にはfile以下のみが含まれます。正確にとにかく、ユーザーが入力するもの。または何も含まれていない可能性があります。あるいは、ユーザーが入力したコンテンツの複数のコピーを改行で区切って含めることもできます。

    追加したフラグを省略すると、変数には、-Fユーザーfileが入力した正規表現に一致する行全体が含まれます。

    これらのどれも避けられないことではありません。文書。 その変数に名前を付けたという事実は、fileコードが実際にやっていることよりも、やりたいことには異なる期待があることを示唆しています。

  2. スクリプトにとって重要ではない使用法に関連する潜在的な問題もたくさんありますが、read少なくとも以下を参照する必要があります。

    (該当記事ではシェルの使用について説明していますが、リング(あなたがしていない)テキストを操作しながら、使い方に関連するいくつかの欠点を良い例で説明しますread。 )

  3. fileまた、後でその変数で何をしても、おそらくたくさんパイプを通してより簡単に行われます。

しかし、スクリプトの残りの部分がどのように見えるかわからないので、これについては議論することはできません。

おすすめ記事