2015-06-13 4 views
0

Я хочу сортировать вход пользователя с sort в случае (и функции). Но я никогда не использовал это раньше. Должен ли я использовать массив или что-то еще?using -sort in linux

Например, пользователь делает:

bash test.sh 50 20 35 50 

Обычно в моем сценарии это будет происходить:

ping c -1 "192.168.0.$i" 

Это приводит к

192.168.0.50 
192.168.0.20 
192.168.0.35 
192.168.0.50 

Теперь я хочу, что последние цифры сортируется, а также пингируется от самого маленького до самого большого числа: 20 35 50, а также если у вас есть 2 т imes то же самое число, скрипт только пингует номер один раз.

SortNumbers(){ 


} 


... 

case 

-sort) SortNumbers;; 

esac 

ответ

0

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

#!/bin/bash 

# 1. copy the scripts arguments into an array 
array=([email protected]) 
# 2. Set internal field separator to newline 
IFS=$'\n' 
# 3. pass the array contents to sort's stdin using here-string 
sorted=($(sort <<<"${array[*]}")) 
# 4. pass the output of sort to uniq utility using the same technique 
uniq=($(uniq <<<"${sorted[*]}")) 
# 5. print the final array 
printf "%s\n" "${uniq[@]}" 

lcd047 «s сокращенный вариант: результат

IFS=$'\n' sorted=($(sort -nu <<<"$*")) 
set "${sorted[@]}" 
printf "%s\n" "[email protected]" 

Run:

$> bash test.sh 3 2 1 45 45 3 4 4 4 1 1 1 1 
1 
2 
3 
4 
45 
+0

Не могли бы вы объяснить это немного, пожалуйста? Я новичок в сценариях оболочки. – gladius

+0

Или просто 'IFS = $ '\ n' sorted = ($ (sort -nu <<<" $ * ")); set "$ {sorted [@]}" ' – lcd047

+0

@ lcd047: отлично!thanks :) –

1

Вы можете использовать это:

#!/bin/bash 
array=($(printf '%s\n' "[email protected]"|sort -nu)) 
echo ${array[@]} 

Если вы запустите test.sh 34 1 45 1 5 6 6 6, это даст выход:

1 5 6 34 45 

Теперь вы можете использовать переменную $array с for петли, как:

for i in ${array[@]};do 
#do something with $i 
done 

Пояснение:

аргументы сценария передаются по команде sort, и выход назначается в массив с именем array. Варианты -n для численного сортировки и -u для уникальных.

Предполагаемый полный код для вас (для уточнения):

#!/bin/bash 
array=($(printf '%s\n' "[email protected]"|sort -nu)) 
for i in ${array[@]};do 
ping -c -1 "192.168.0.$i" 
done 

Использование функции:

sortNumbers(){ 
array=($(printf '%s\n' "[email protected]"|sort -nu)) 
} 
sortNumbers 43 1 2 8 2 4 98 45 
echo ${array[@]} ##this is just a sample use, you can put for loop here 

Таким образом, вы можете объявить массив array=([email protected]) в начале вашего скрипта. затем вызовите функцию sortNumbers с аргументами (не забудьте исключить из аргумента -sort), когда необходимо их сортировать (она изменит переменную $array с отсортированным контентом). Поместите цикл for вне функции, поэтому он принимает значение в переменной $array (отсортировано или несортировано), таким образом вы будете иметь его на своем пути (выбор для сортировки или нет).

+0

Итак, чтобы пинговать мои ip-адреса, мне нужно только ввести ping c -1 «192.168.0. $ I» в цикл for? Пример: array = ($ (printf '% s \ n' "$ @" | sort -u)) SortNumbers() { echo $ {array [@]} для i в $ ({array [ @]}; do ping 192.168.0. $ i case -sort) SortNumbers ;; esac – gladius

+0

Нет, вам не нужно использовать функцию sortNumber и эхо. – Jahid

+0

@gladius Я добавил полный образец кода для вашего конкретного случая. Вам не нужно использовать какую-либо функцию для сортировки, это просто дополнительная строка над циклом for. – Jahid