2014-01-14 7 views
2

Я очень мало программировал на C++, и я не очень понимаю, как использовать код в KornShell (ksh) на ОС Knoppix. Ресурсов, предоставленных нам профессором, было мало, так что трудно работать. Две текстовые книги, которые мы имеем для класса, в основном говорят о командах в вариациях UNIX, хотя мало что касаются ksh.Замечания Ksh и if

Напишите сценарий оболочки, который принимает ровно один аргумент, который должен быть положительным целым числом. (Моя вторая одна имеет два)

КШ Код:

NUMBER=$1 
read -p NUMBER 
# Test that one argument was input. 
if [[ $# -ne 1 ]];then 
    echo "Please enter an integer as an argument" 
    exit 1 
elif [[ $NUMBER -le 0 ]];then # Test value of argument is less than or equal to zero 
    echo "Please enter a number > 0" 
    exit 1 
fi 

while [["$NUMBER" -ne 1]];do 
    printf $NUMBER 
if [[$NUMBER -gt 1]];then 
     printf "," 
    fi 
NUMBER=$(($NUMBER-1)) 
done 
printf $NUMBER 

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

я заметил, что там не было ничего для ввода данных пользователя, поэтому я попытался войти в этих себя с

read -p NUMBER 

до если заявления.

Что мне не хватает в коде, чтобы продолжить работу с остальной частью скрипта, который будет запущен?

+2

Я отбросил этот вопрос. Вы можете сказать спасибо, повысив ответы и комментарии, которые помогли вам и * приняли * тот, который вам больше всего помог. –

ответ

6

Вы должны удвоить свои переменные в [ ... ] условиях или использовать расширенные условия [[ ... ]] (да, третий тип состояния). Для числовых операций обычно используются ((..)) (о мой, четвертый тип!).

См. man bash или Advanced Bash Scripting Guide.

+1

@ user3193284: Попробуйте спросить профессора. Когда я преподавал, я поощрял своих учеников задавать вопросы. – choroba

+0

Сценарий OP совсем не используется с синтаксисом 'csh'. 'elif' определенно поддерживается' bash', 'ksh' и любой совместимой с POSIX оболочкой и не является ключевым словом' csh'. Другой комментарий, вопрос о 'ksh', но вы предлагаете документацию' bash'. Несмотря на то, что они как в основном оболочке POSIX, так и в распределении большого количества расширений, каждая из них имеет свои особенности, поэтому руководство по сценарию bash может смутить OP. – jlliagre

+0

@jlliagre: Вы правы в 'elif'. Тем не менее, я ответил на первоначальный вопрос, который был сильно отредактирован и переделан. В начале он был помечен как «bash» и содержал работу в названии. – choroba

1

Первый прошел аргумент должен быть получен с помощью

NUMBER=$1 

не знаю, что вы имеете в виду $X ..

Примечание: $ 0 является команда выполнена, например, в ./myscript.sh foo

$0 = ./myscript.sh и $1 = foo

После установки его вам переменная NUMBER вы можете проверить, если это положительное целое число:

if [[ $NUMBER =~ ^[0-9]+$ ]]; then 
    echo "It's ok!" 
else 
    echo "BAD :(" 
fi 
+0

Извините, исправлено плохое регулярное выражение;) Сейчас он работает. – Dropout

+1

'NUMBER = $ 1' - это синтаксическая ошибка в оболочке - избавиться от пробелов вокруг' = '. Вы можете сделать это на C или C++ или Python или Perl или ..., но не в bash/ksh/sh (не помните, допустимо ли это в csh, но это нормально, действительно). – twalberg

+0

Спасибо. Я узнал, с помощью, что он очень придирчив к тому, что он воспринимает как синтаксис. Должно быть пробел после [[и до]]. – Lahkra

0

Чтобы принять только один аргумент, вы должны проверить количество аргументов, переданных в скрипт (который является то, что я думаю, что ваш учитель спрашивает):

if [[ $# -ne 1 ]] 

$ # дает количество аргументов, переданных в сценарий, так что это легко проверить количество argumets, которые пропускают его. Теперь вам нужно только проверить, является ли это целым числом и знаком. Я не знаю, что именно то, что ваш учитель хочет, чтобы вы знали, но вы можете использовать функции awk, чтобы проверить, насколько параметром является число, целое число и его знак (знак также легко с ksh).

+0

Я думаю, нет, если ваш учитель попросил сценарий, который принимает ровно 1 параметр $ #, является ответом. Вам нужно всего лишь проверить $ 1, как только вы проверили, что только один параметр передается скрипту. – YoMismo

+0

Просто снимите «» – YoMismo

+0

Я имею в виду, удалите «» и добавьте пробел после [[и другого пространства до]] ----> while [[$ NUMBER -ne 1]]; do – YoMismo

-1

Вы должны удалить инструкцию read -p NUMBER, которая побеждает предыдущую.

Вы Шоуда то исправить эту строку:

elif [[ $NUMBER -le 0 ]];then 

к

elif [ "$NUMBER" -le 0 ];then 

Последняя часть использует неправильные тесты и не хватает концовки новую строку:

while [["$NUMBER" -ne 1]];do 
    printf $NUMBER 
if [[$NUMBER -gt 1]];then 
     printf "," 
    fi 
NUMBER=$(($NUMBER-1)) 
done 
printf $NUMBER 

должен be

while [ $NUMBER -ne 1 ];do 
    printf $NUMBER 
    if [ $NUMBER -gt 1 ];then 
     printf "," 
    fi 
    NUMBER=$((NUMBER-1)) 
done 
printf "%s\n" $NUMBER 
Смежные вопросы