2015-10-10 8 views
2

Как написать скрипт, который получит список параметров и выведет номер, который является самым большим. Если параметры не заданы, выведите сообщение об ошибке.Сценарий оболочки для вывода наибольшего

Я написал следующий код, чтобы проверить, не указаны ли параметры, выводит сообщение об ошибке.

#!/bin/bash 
if [ "$#" -eq "0" ] 
then 
    echo "No arugments supplied" 
else 
    echo "$# Parameter" 

Но я не знаю, как продолжить ...

+0

Является ли это домашнее задание? – melpomene

+0

Вы можете использовать 'sort' и' head' для сортировки списка по убыванию и захвата первого элемента, вы пробовали это? – mikeb

+0

Что поделаешь, если это домашнее задание или нет? Кто любит домашнее задание :) – Alex

ответ

1

Использование сортировки -n (числовое) и -r (реверс), а затем просто выбрать первую строку вывода - как

#!/bin/bash 
if [ "$#" -eq "0" ] 
then 
    echo "No arugments supplied" 
else 
    echo "$# Parameter" 
    for i in $*; do echo ${i}; done | sort -nr | head -1 
fi 

Теперь единственная проблема, с которой вы сталкиваетесь, - это когда ввод (аргументы) не является числом, но вы ничего не сказали о том, что должно произойти тогда.

+0

n * log n сложность. Ты можешь лучше. – Jubobs

+0

@Jubobs Сложность зависит от использования алгоритма 'sort'. Это может быть O (1). – melpomene

+0

@melpomene Алгоритм сортировки на основе сравнения не может быть быстрее, чем n * log n. – Jubobs

1

Вот псевдокод вы могли бы реализовать:

  • сохранить первые пары в переменном с именем max
  • циклом по Params
    • если пары больше max, обновления max
  • max

Вот пример цикла, который печатает все параметры:

for num; do 
    echo $num 
done 

А вот пример сравнения значений:

if ((num > max)); then 
    echo $num is greater than $max 
fi 

Это должно быть более чем достаточно помощь, чтобы закончить свою домашнюю работу.


Ну так как другие уже дали вам реальное решение, вот мое тоже:

#!/bin/bash 

if (($# == 0)); then 
    echo "No arugments supplied" 
    exit 1 
fi 

max=$1 
for num; do 
    if ((num > max)); then 
     max=$num 
    fi 
done 

echo $max 
+0

У вас есть право, теперь все нормально. – Alex

2

Держите ток макс. Перемещайте по входу, при необходимости обновляя max. В конце вы получите глобальный максимум.

Непроверенные:

#!/usr/bin/bash 
if [ $# -eq 0 ]; then 
    echo "Usage: $0 NUMBERS" >&2 
    exit 1; 
fi 

max="$1" 
shift 
while [ $# -gt 0 ]; do 
    if [ "$1" -gt "$max" ]; then 
     max="$1" 
    fi 
    shift 
done 

echo "$max" 

 Смежные вопросы

  • Нет связанных вопросов^_^