Run bash & ldquo; find & rdquo; команда в переменной [duplicate]

Для сортировки массива вы должны определить функцию компаратора.

Позволяет создавать некоторые функции, которые сортируют массив по возрастанию или убыванию, и который содержит объектные или строковые или числовые значения.

]
function sorterAscending(a,b) {
    return a-b;
}

function sorterDescending(a,b) {
    return b-a;
}

function sorterPriceAsc(a,b) {
    return parseInt(a['price']) - parseInt(b['price']);
}

function sorterPriceDes(a,b) {
    return parseInt(b['price']) - parseInt(b['price']);
}

Сортировка номеров (в алфавитном порядке и по возрастанию):

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();

Сортировка номеров (в алфавитном порядке и по убыванию):

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
fruits.reverse();

Номера сортировки (числовые и восходящие) :

var points = [40,100,1,5,25,10];
points.sort(sorterAscending());

Номера сортировки (числовые и нисходящие):

var points = [40,100,1,5,25,10];
points.sort(sorterDescending());

Как описано выше, используйте метод sorterPriceAsc и sorterPriceDes с вашим массивом с нужным ключом.

homes.sort(sorterPriceAsc()) or homes.sort(sorterPriceDes())
69
задан Benjamin 11 April 2011 в 01:33
поделиться

4 ответа

Использовать eval:

x="ls | wc"
eval $x
y=$(eval $x)
echo $y
95
ответ дан Vadik 21 August 2018 в 20:49
поделиться
  • 1
    $ (...) теперь рекомендуется вместо backticks. y = $ (eval $ x) mywiki.wooledge.org/BashFAQ/082 – James Broadhead 11 March 2012 в 22:35
  • 2
    в то время как это запутывало в начале, оно работает как ожидалось в обоих направлениях. eval в порядке. Спасибо. – erm3nda 21 May 2015 в 03:09
  • 3
    eval является приемлемой практикой только , если вы доверяете содержимому ваших переменных. Если вы работаете, скажем, x="ls $name | wc" (или даже x="ls '$name' | wc"), то этот код является быстрой дорогой для инъекций или уязвимостей эскалации привилегий, если эта переменная может быть установлена ​​кем-то с меньшими привилегиями. (Итерируя по всем подкаталогам в /tmp, например? Вам лучше доверять каждому пользователю в системе, чтобы он не вызывал имя $'/tmp/evil-$(rm -rf $HOME)\'$(rm -rf $HOME)\'/'). – Charles Duffy 1 June 2016 в 15:22
  • 4
    eval - огромный магнит ошибки, который никогда не рекомендуется рекомендовать без предупреждения о риске неожиданного поведения синтаксического анализа (даже без вредоносных строк, как в примере @ CharlesDuffy). Например, попробуйте x='echo $(( 6 * 7 ))', а затем eval $x. Вы можете ожидать, что для печати «42», но, вероятно, этого не произойдет. Можете ли вы объяснить, почему это не работает? Можете ли вы объяснить, почему я сказал «вероятно»? Если ответы на эти вопросы не очевидны для вас, вы никогда не должны касаться eval. – Gordon Davisson 25 March 2018 в 07:03
  • 5

Использовать не eval!

BashFAQ-50 - Я пытаюсь добавить команду в переменную, но сложные случаи всегда терпят неудачу.

g4]

Поместите его в массив и раскройте все слова с двойными кавычками "${arr[@]}" до not , чтобы IFS разделил слова из-за Разделение слов .

cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')

и посмотреть содержимое массива внутри. declare -p позволяет видеть содержимое массива внутри с каждым параметром команды в отдельных индексах. Если один из таких аргументов содержит пробелы, цитирование внутри при добавлении в массив предотвратит его разделение из-за разделения Word.

declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'

и выполните команды как

"${cmdArgs[@]}"
23:15:18

(или) вообще используют функцию bash для запуска команды

cmd() {
   date '+%H:%M:%S'
}

и вызывают функцию как только

cmd

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

# POSIX sh
# Usage: sendto subject address [address ...]
sendto() {
    subject=$1
    shift
    first=1
    for addr; do
        if [ "$first" = 1 ]; then set --; first=0; fi
        set -- "$@" --recipient="$addr"
    done
    if [ "$first" = 1 ]; then
        echo "usage: sendto subject address [address ...]"
        return 1
    fi
    MailTool --subject="$subject" "$@"
}

18
ответ дан Inian 21 August 2018 в 20:49
поделиться

Не нужно хранить команды в переменных, даже если вам нужно использовать их позже. просто выполните его как обычно. Если вы храните переменную, вам понадобится какой-то оператор eval или вызвать ненужный процесс оболочки для «выполнения вашей переменной».

-7
ответ дан kurumi 21 August 2018 в 20:49
поделиться
  • 1
    Команда, которую я буду хранить, будет зависеть от параметров, которые я отправляю, поэтому вместо того, чтобы иметь массу условных операторов в основной части моей программы, намного легче сохранить команду, которая мне нужна для последующего использования. – Benjamin 11 April 2011 в 01:54
  • 2
    @Benjamin, то, по крайней мере, сохраните параметры как переменные, а не команду. например var='*.txt'; find . -name "$var" – kurumi 11 April 2011 в 02:00
var=$(echo "asdf")
echo $var
# => asdf

Используя этот метод, команда сразу оценивается и сохраняется ее возвращаемое значение.

stored_date=$(date)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015

То же самое с обратным шагом

stored_date=`date`
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015

Использование eval в $(...) не будет оцениваться позже

stored_date=$(eval "date")
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015

Используя eval, он оценивается при использовании eval

stored_date="date" # < storing the command itself
echo $(eval $stored_date)
# => Thu Jan 15 11:07:05 EST 2015
# (wait a few seconds)
echo $(eval $stored_date)
# => Thu Jan 15 11:07:16 EST 2015
#                     ^^ Time changed

В приведенном выше примере, если вам нужно запустить команду с аргументами, поместите их в строку, которую вы храните

stored_date="date -u"
# ...

. Для сценариев bash это редко актуально, но последнее примечание. Будьте осторожны с eval. Eval только строки, которыми вы управляете, никогда не строки, исходящие от ненадежного пользователя или созданные из ненадежного пользовательского ввода.

19
ответ дан Nate 21 August 2018 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: