4

ディレクトリ内の最初のファイルを見つけるためのコードがあります。

bash~> $( echo eval "ls | head -1" )
arguprog.sh

次に、このスニペットが if ステートメントに追加され、そのファイルが arguprog.sh の場合に別のコマンド セットを実行します。

bash~>  if [[ $( echo eval "ls | head -1" ) == "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi;
FALSE

しかし、これは私が望むことをしていません。最初のファイルが arguprog.sh であるにもかかわらず、FALSE を返します!

テストブロック内で完全に文字列比較を行いながら、これを解決する方法はありますか?

4

3 に答える 3

7

まず、eval特に必要のない場合は悪です。あなたの場合、必要evalありません

あなたが示したコーディングの恐怖を次のように置き換えます。

ls | head -1

それをテストステートメントに含めるには:

if [[ $(ls | head -1) = "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi

しかし、これは間違っていて壊れています (以下を参照)。

より一般的なこと:の出力を解析しないでlsください。現在のディレクトリで最初のファイル (またはディレクトリなど) を見つけたい場合は、グロブと次のメソッドを使用します。

shopt -s nullglob
files=( * )
# The array files contains the names of all the files (and directories...)
# in the current directory, sorted by name.
# The first one is given by the expansion of "${files[0]}". So:
if [[ "${files[0]}" = "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi

メソッドの解析ls間違っていることに注意してください。見て:

$ # Create a new scratch dir
$ mkdir myscratchdir
$ # Go in there
$ cd myscratchdir
$ # touch a few files:
$ touch $'arguprog.sh\nwith a newline' "some other file"
$ # I created 2 files, none of them is exactly arguprog.sh. Now look:
$ if [[ $(ls | head -1) = "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi
TRUE
$ # HORROR!

これにはねじれた回避策がありますが、実際には、私が示した方法が最善の方法です。

終わり!

于 2012-12-28T15:50:20.927 に答える
1

の値は で$( echo eval "ls | head -1" )"eval ls | head -1"ない"arguprog.sh"ため、 を取得する理由はFALSE.

これを見てください:

$ a=$( echo eval "ls | head -1" )
$ echo $a
eval ls | head -1

arguprog.sh実行時に表示される理由bash~> $( echo eval "ls | head -1" )は、bash が であるコマンドを実行しeval ls | head -1、結果である を返すためですarguprog.sh

if 文で同じことを行うには、次のように別の のセットで囲んで実行する必要があります$(...)

$ if [[ $($( echo eval "ls | head -1" )) == "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi;
TRUE

しかし、それをしないでください!単純に使用する方がはるかに簡単です:

$ if [[ $(ls | head -1) == "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi;
TRUE

また、 の出力を解析することはlsお勧めできません。詳細については、 ParsingLsを参照してください。

于 2012-12-28T15:39:11.423 に答える
0

この方法を試してください:

 if [[ `ls | head -1` = "04 dynamic-programming.pdf" ]]; then 
      echo "TRUE"
 else 
      echo "FALSE"
 fi

=代わりに使用して、その部分==をスキップするだけevalです。

于 2012-12-28T15:23:05.627 に答える