[英]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.