Какой правильный синтаксис для переменных неравенств в bash?
Я немного новичок в bash, так что прошу прощения за любые наивные вопросы или что-то еще, что я делаю.
Поэтому я написал быстрый скрипт, в котором перечислены все цвета tput, и он работает довольно хорошо. Это выглядит так:
unset x; for i in {1..256}; do tput setab $x; echo $x; x=$((x+1)); done
Но я хотел использовать меньше / равно вместо того, что я делал выше. Я пытался сделать кучу таких вещей:
unset x; if [ $x -le 256] ; do tput setab $x ; echo $x ; x=$((x+1)) ; done
И это:
unset x; if [ $x -le 256] then do tput setab $x ; echo $x ; x=$((x+1)) ; done
Но я не могу понять синтаксис правильно, он просто говорит неожиданный токен "сделано" или "сделать". Google не помог мне, и я не нашел ничего, что ответило на мои вопросы здесь, на переполнении стека. Кроме того, я хотел бы иметь возможность отключить x после того, как он достигнет 256, а затем повторять сценарий, чтобы он выглядел триплетно. Так что да, если бы кто-нибудь мог помочь, я был бы благодарен, спасибо.
2 ответа
if
блок не может быть условием для do
петля. использование while
вместо. Кроме того, когда вы unset x
, $x
будет неопределенным и не может сравниваться с числом. Я полагаю, вы действительно хотите что-то вроде этого:
unset x
x=1
while [ $x -le 256 ]; do
tput setab $x
echo $x
x=$((x+1))
done
Последнее выражение (x=$((x+1))
) можно упростить до ((x++))
, И, как указал Уве, должны быть пробелы до и после квадратных скобок (кроме заключительной квадратной скобки и точки с запятой), в противном случае bash
не сможет правильно проанализировать утверждение.
Однако, если вы просто увеличиваете $x
с каждым циклом цикла этот подход не имеет никакого преимущества перед for
цикл:
for x in {1..256}; do
tput setab $x
echo $x
done
Только для полноты вы можете написать свой первый пример как:
for i in {1..256}
do
tput setab $i
echo $i
done
Таким образом, вы можете использовать непосредственно $i
и не нужно использовать / увеличивать $x
,