簡體   English   中英

為什么我的Bash腳本會生成一元運算符預期錯誤?

[英]Why does my Bash script generate a Unary operator expected error?

我試圖制作一個在Bash中輸出三角星的程序。

這是它的樣子:

在此輸入圖像描述

但是,我得到line 8: [: 1: unary operator expected error

這是我的代碼

#! /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

我是bash腳本的初學者,所以在我學習的時候請耐心等待。

這是一個修訂版,充分利用算術評估 - ((...)) - 和擴展$((...))

#!/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技巧替換內部循環(從這里借用):

#!/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

試試用引號

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

應該解決它。 你可以在$ input上有空格。

看到不同。 這有效

echo $(( 1+1 ))

而這一個沒有

echo $( ( 1+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 ))    #fixed
   done
  echo -n "" 
    ((tri1= $tri1 + 1 )) #fixed
    tri2=1
  echo ""      # need add a return, otherwise, all output in one line.
done

兩個起始括號((必須是一個算術表達式的單個標記,因此不能與兩個嵌套的子殼( ...; ( ... ))混淆( ...; ( ... ))

(())你可以在表達式的操作數和運算符周圍有任意數量的空格。

代碼中的第一個表達式也應該是讀取的

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

要么

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

我認為這是一種更快,更易讀的方式來打印字符或字符串的倍數。

#!/bin/bash

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

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

在這里使用引號很重要,因為*否則會擴展到當前目錄中的文件名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM