簡體   English   中英

在條件外殼腳本中循環

[英]loops inside condition shell scripting

我是shell腳本的初學者,並嘗試實現以下目標,如果我將兩個數字作為參數傳遞,例如= 0 5,則控制台將輸出1 2 3 4 5,但是如果我通過5 0,則控制台應輸出5 4 3 2 1 ,第一個效果不錯,但是第二個效果在我的腳本中什么也不做,它不會拋出任何錯誤。

腳本

if [[ $1 -lt $2 ]]; then
  for((i=$1;i<$2;i++))
  do
    if [[ "$i" -lt $2 ]]; then
      echo -n "$i "
    else 
      echo -n "$i"
    fi
  done
else
  for((i=$2;i>=$1;i--))
  do
    if [[ "$i" -gt $1 ]]; then
      echo -n "$i "
    else 
      echo -n "$i"
    fi
  done
fi

如我所說,第一個條件有效-例如數字是0 5,但是當第一個條件大於第二個條件時第二個條件無效。 我該如何解決?

您的第二個for循環中存在邏輯錯誤:

for((i=$2;i>=$1;i--))
# should have been:
for((i=$1;i>=$2;i--))

如果您淘汰了代碼,您將在else -statement中看到$1始終大於或等於$2

if [[ $1 -lt $2 ]]; then
  # ...
else
  # now $1 is equal or bigger than $2

您當然也想更改if語句:

if [[ "$i" -gt $1 ]]; then
# change to $2 because $i will never be bigger than $1
if [[ "$i" -gt $2 ]]; then

說完所有這些后,您應該真正考慮使用現有的工具,例如seq [fisrt] [increment] last

seq 1 5 | xargs; # 1 2 3 4 5
seq 5 -1 1 | xargs; # 5 4 3 2 1

這將打印“ 1 2 3 4 5”或“ 4 3 2 1 0”而不是“ 5 4 3 2 1”,但是我認為這是一個更合理的輸出。 如果您需要非對稱輸出,則很容易修復。

#!/bin/bash   

i=$1            
test $2 -gt $1 && op=+ || op=- 
while test $i != $2; do printf "%d " $(( i=$i $op 1)); done  
echo

有沒有必要嵌套if在這兒-這是更明智的決定測試使用和迭代檢測事前,然后只有一個循環,它總是使用:

#!/bin/bash

delta=${3:-1} # if $3 is given, treat it as number to increment/decrement by
if (( $1 < $2 )); then
  delta=$(( delta < 0 ? -delta : delta)); cmp=-lt
else
  delta=$(( delta > 0 ? -delta : delta)); cmp=-gt
fi

i=$1
while test "$i" "$cmp" "$2"; do
  printf '%s ' "$i"
  i=$(( i + $delta ))
done
printf '\n'

這與@William Pursell的現有(出色)答案有很多共通之處 ,但是增加了安全提供跳過值(例如,從0到100乘10s計數)的功能,使用精確的相等檢查不會不行

您可以將一些工作分配給外部工具:

if (( $1 > $2 )); then
    seq $1 -1 $(($2+1))
else
    seq $(($1+1)) 1 $2
fi | paste -sd " "

暫無
暫無

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

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