Управление командой в рамках испытательного заявления в ударе

У меня есть часть кода, чтобы найти первый файл в справочнике:

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

Этот отрывок был тогда добавлен к, если заявление, чтобы управлять различным набором команд, если тот файл был arguprog.sh:

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

Однако, это не делает то, что я хочу. Это возвращается ЛОЖНЫЙ даже при том, что первый файл - arguprog.sh!

Есть ли способ решить это, все еще делание сравнения строк полностью в рамках теста блокирует?

3
nl ja de
Спасибо за всю вашу помощь!
добавлено автор vvrr22, источник

3 ответы

Во-первых, , оценка злая, особенно когда это не необходимо. В вашем случае оценка является не необходимый!

Замените кодирующий ужас, с которым вы показали просто:

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!

Есть искривленные искусственные приемы для этого, но действительно, лучший метод - тот, который я просто дал вам.

Договорились!

6
добавлено
@davak = и == на самом деле эквивалентны в рамках [[...]] . Посмотрите конец этого раздела в справочнике удара. Все же я отредактировал свой ответ, чтобы быть большим количеством POSIX, соответствуют (но я don' t действительно заботятся о том), и чтобы спасти один характер: это может иметь огромное значение в кодовом гольфе! Спасибо ;-) .
добавлено автор gniourf_gniourf, источник
Ошеломите это - настоящее обучение для меня, никакая идея это I' d открыл кучу проблем! Цените это:)
добавлено автор vvrr22, источник

Ценность , который $ (оценка эха "ls | направляются-1") "оценку ls |, направляются-1" не "arguprog.sh" , следовательно почему вы добираетесь ЛОЖНЫЙ .

Смотрите на это:

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

The reason you see arguprog.sh when you run bash~> $( echo eval "ls | head -1" ) is because bash executes the command which is eval ls | head -1 and returns the result which is arguprog.sh.

Чтобы сделать то же самое в вашем если-заявлении, необходимо выполнить его также, приложив его в другом наборе $ (...) , как это:

$ 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 для деталей.

1
добавлено
Намного легче..., но сломанный (см. мой ответ).
добавлено автор gniourf_gniourf, источник

Попробуйте этот путь:

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

Необходимо просто использовать = вместо == и пропускают оценку часть.

0
добавлено
это не работает (и катастрофа), если есть пространство (или другой раздражающий характер) от имени первого файла
добавлено автор lbonn, источник
На самом деле, этот doesn' t выглядят абсолютно закрепляемыми, когда использование ls , как объяснено связью в dogbane' s почта... Удар иногда раздражает меня:D.
добавлено автор lbonn, источник
Измененный. Спасибо за ваше уведомление:)
добавлено автор Adam Sznajder, источник
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.