2014-02-16 3 views
0

Я начинающий в стиле bash, поэтому, пожалуйста, несите меня, когда я учусь.Почему мой сценарий Bash генерирует ожидаемую ошибку оператора Unary?

Мне была поручена задача создания программы, которая выводит треугольник звезд в bash.

вот что это будет выглядеть так:

enter image description here

Однако я получаю строку 8: [: 1: унарный оператор ожидаемой ошибки

вот мой код

#! /bin/bash 

read -p "Plese input a number for a magical surprise diagram : " input 

tri1="1" 
tri2="1" 

while [ $tri1 -le $input ]; do 
    while [ $tri2 -le $tri1 ]; do 
    echo -n "*" 
    tri2=$(($tri2 + 1)) 
    done 
    echo -n "" 
    tri1=$(($tri1 + 1)) 
    tri2=1 
done 

ответ

0

Вот затруднительного положения

#! /bin/bash 

read -p "Plese input a number for a magical surprise diagram : " input 

tri1="1" 
tri2="1" 

while [ $tri1 -le $input ]; do 
    while [ $tri2 -le $tri1 ]; do 
    echo -n "*" 
    ((tri2=$tri2 + 1)) #fixed 
    done 
    echo -n "" 
    ((tri1= $tri1 + 1)) #fixed 
    tri2=1 
    echo ""  # need add a return, otherwise, all output in one line. 
done 
+1

Спасибо, это решило! Я не знал о последней эхо-линии. – user3317098

0

Попробуйте использовать котировки

while [ "$tri1" -le "$input" ]; do 
    while [ "$tri2" -le " $tri1" ]; do ... 

следует исправить. Возможно, у вас есть пробелы на $ input.

+0

Спасибо за ответ, но теперь он говорит, что есть строка 8: [:: integer expression expected – user3317098

0

См. Разницу. Это работает

echo $((1+1)) 

в то время как это делает не

echo $((1+1)) 
+0

Спасибо за ответ, я исправил его и добавил кавычки, но я все еще получаю строку 8: [:: integer Ожидаемое выражение – user3317098

+0

Как только я исправил эту ошибку, я прекратил эту ошибку. –

2

Вот пересмотренная версия, которая полностью использует преимущества оценки арифметического - ((...)) - и расширение $((...)):

#!/usr/bin/env bash 

read -p "Please input a number for a magical surprise diagram: " input 

tri1=1 
tri2=1 

while ((tri1 <= input)); do 
    while ((tri2 <= tri1)); do 
    printf '*' 
    ((++tri2)) 
    done 
    printf '\n' 
    ((++tri1)) 
    tri2=1 
done 

Также используется более портативный printf, который дает более четкое представление.


Обновление:

упрощенный вариант с for ((...;...;...)) петель в вместо while:

#!/usr/bin/env bash 

read -p "Please input a number for a magical surprise diagram: " input 

for ((tri1 = 1; tri1 <= input; tri1++)); do 
    for ((tri2 = 1; tri2 <= tri1; tri2++)); do 
    printf '*' 
    done 
    printf '\n' 
done 

Даже дальнейшее упрощение, заменив внутреннюю петлю с printf трик (заимствованного из here):

#!/usr/bin/env bash 

read -p "Please input a number for a magical surprise diagram: " input 

for ((i = 1; i <= input; i++)); do 
    printf '*%.s' $(seq $i) 
    printf '\n' 
done 
+0

Спасибо большое, я не знал, что вы могли бы это сделать, и плохо попытайтесь его реализовать! – user3317098

+0

@ user3317098: Добро пожаловать; Я также должен был упомянуть 'for ((...; ...; ...))' loops, которые лучше подходят для вашей задачи - см. Мой обновленный ответ. – mklement0

0

Две стартовые скобки (( должны быть одним токеном для арифметического выражения, так что его нельзя спутать с двумя вложенными подоболочками (...; (...)).

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

Первое выражение в коде следует читать либо

tri2=$((tri2 + 1)) # POSIX 

или

((tri2=tri2 + 1)) # valid in bash and ksh93 
0

Я думаю, что это быстрее и более удобным для чтения способ печати в пределах кратные символа или строки.

#!/bin/bash 

read -p "Please input a number for a magical surprise diagram : " input 

for i in $(seq $input); do 
    c+="*" 
    echo "$c" 
done 

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

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