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