[英]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
另一個變體-使用seq
( man 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
我認為您可以將此擴展到您的情況……如果我正確理解了您的問題,則需要這樣的事情:
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.