簡體   English   中英

要不斷循環使用for in shell腳本

[英]To Continuously loop using for in shell scripting

for m in $count
  do
        `cat $op ${arr[$m]} > $op1`
        `rm -f $op`
        `touch $op`
        `cat $op1 ${arr[$m+1]} > $op`
        if [ $m ge $count ]; then
        `rm -f $op1`
        `touch $op1`
        fi
        m=$((m+1))
  done

我想從開始計數2到結束計數10連續循環播放。 $ count = 10。 但是上面的代碼只執行一次for循環。

雨天-有很多空閑時間-)

您的腳本有很多問題,一些推薦的解決方案。 因為您使用了構造m=$((m+1)) -將bash用作“ shell”。 (考慮添加bash標簽)

對於循環-幾種可能性

count=10
m=2                           #start with 2
while (( $m <= $count ))      #while m is less or equal to 10
do                            #do
        echo $m               #this action
        let m++               #increment m (add one to m)
done                          #end of while

或者,如果計數是一個常數(不是變量),則可以編寫

for m in {2..10}    #REMEMBER, will not works with a variables, like  {2..$count}
do
    echo "$m"
done

另一個變體-使用seqman seq )命令進行計數

for m in $(seq 2 ${count:=10})  # ${count:=10} - defaults the $count to 10 if it is undefined
do
    echo $m
done

或類似C的for循環

let count=10
for ((m=2; m<=count; m++))
do
        echo $m
done

所有4個循環都會產生:

2
3
4
5
6
7
8
9
10

因此,現在有一個正確的周期。 現在添加您的特定操作。

的:

rm -f $op
touch $op

可以用一個命令代替

echo -n > $op  #echo nothing and write the "nothing" into the file

它更快,因為echo內置bash (不啟動兩個外部命令)

所以你的動作看起來像

cat $op ${arr[$m]} > $op1
echo -n > $op
cat $op1 ${arr[$m+1]} > $op

在這種情況下, echo是沒有用的,因為第二cat將無論如何都將其輸出寫入$ op(並且在寫入之前將文件縮短為零大小),因此此結果與上面的結果相同

cat $op ${arr[$m]} > $op1
cat $op1 ${arr[$m+1]} > $op      

使用bash的>>追加到文件重定向,可以將這兩個cat命令簡化為一個

cat ${arr[$m]} ${arr[m+1]} >> $op

整個腳本看起來像下一個

#making a testing environment

for f in $(seq 12)               #create 12 files opdata-N 
do
    arr[$f]="opdata-$f"          #store the filenames in the array "arr"
    echo "data-$f" > ${arr[$f]}  #each file contains one line "data-N"
done
#echo ${arr[@]}

#setting the $op and $op1 filenames
#consider choosing more descriptive variable names
op="file_op"
#op1="file_op1"   #not needed

#add some initial (old) value to $op
echo "initial value" > $op
#end of creating the testing environment

#the script
count=10
for m in $(seq 2 $count)
do
    cat ${arr[$m]} ${arr[m+1]} >> $op   
done

最后,文件$op將包含:

initial value
data-2
data-3
data-3
data-4
data-4
data-5
data-5
data-6
data-6
data-7
data-7
data-8
data-8
data-9
data-9
data-10
data-10
data-11

順便說一句,你確定結果嗎? 因為如果只想在$op的末尾添加file-2 .. file-10 (不重復條目),則可以簡單地編寫:

cat file-{2..10} >> $op    #the '>>' adds to the end of file...

或使用您的數組:

startpos=2
count=10
cat ${arr[@]:$startpos:$count} >> $op   

Ufff ..;)

附:通常,將變量用雙引號引起來是一個好習慣,例如"$filename" -為了更好的可讀性,在上述示例中,我省略了它們。

任何循環都需要“保持循環的條件”。 當您使用

for m in count

循環類型,條件是“如果集合count有更多元素,請選擇下一個並繼續”。 這似乎不是您想要的。 您正在尋找相當於的bash

for(m = 0; m < 10; m++)

我認為。 最好的方法是-完全使用這種循環(但請注意-額外的一對括號和分號):

#!/bin/bash
# Display message 5 times
for ((i = 0 ; i < 5 ; i++)); do
  echo "Welcome $i times."
done

參見nix工藝原創

我認為您可以將此擴展到您的情況……如果我正確理解了您的問題,則需要這樣的事情:

for ((m = 2; m <= 10; m++))
  do
    cat $op ${arr[$m]} > $op1
    rm -f $op
    touch $op
    cat $op1 ${arr[$m+1]} > $op
    if [ $m ge $count ]; then
      rm -f $op1
      touch $op1
    fi
  done

請改用while循環。

for循環是當您有多個要迭代的對象時。 您只有一個,即$ count。

暫無
暫無

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

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