Linux: for 循环

2023-09-25  本文已影响0人  LET149

shell中的基本循环语句之一,用法与R和Python中的用法类似,但要注意具体语法的变化

基本语法

for i in {数字序列或其他}  #其中的i可以是任意字符
do
    执行语句  #循环主题
done  #循环全部运行结束后用来终止循环
1. 示例一
(base) [zhiyong@malab Learn]$ cat tt.sh 
#! /bin/bash

for i in {1..5}
do
    echo "这个数字是:$i"
done


(base) [zhiyong@malab Learn]$ bash tt.sh 
这个数字是:1
这个数字是:2
这个数字是:3
这个数字是:4
这个数字是:5

2.示例二

(base) [zhiyong@malab Learn]$ cat tt.sh 
#! /bin/bash

for i  #这里没有给出循环的范围,此时可在脚本外部指定循环范围
do
    echo "这个数字是:$i"
done

(base) [zhiyong@malab Learn]$ bash tt.sh 11 22 33  #给出循环范围为11,22,33,算是一种参数的传入操作
这个数字是:11
这个数字是:22
这个数字是:33

3.示例三

判断一个年份是平年还是闰年并输出结果

(base) [zhiyong@malab Learn]$ cat kk.sh 
#! /bin/bash

for i in  {1..401}
do
    if [[ $[i%4] -eq 0 && $[i%100] -ne 0 || $[i%400] -eq 0 ]]
        then echo "$i年是闰年"
        echo " "
    else 
        echo "$i年是平年"
        echo " "
    fi
done

(base) [zhiyong@malab Learn]$ bash kk.sh 
1年是平年
 
2年是平年
 
3年是平年
 
4年是闰年
 
5年是平年
 
6年是平年
 
7年是平年
 
8年是闰年
 
9年是平年
 
10年是平年
 
11年是平年
 
12年是闰年

4. 示例四

for循环中的限制范围可以是一个已经存在的文件

(base) [zhiyong@malab Learn]$ cat aa
aaa
bbb
ccc
ddd

(base) [zhiyong@malab Learn]$ for i in $(cat aa)  #用aa当作限制主体,注意其中cat命令和外面$()的使用
> do 
> echo "$i"
> done

aaa
bbb
ccc
ddd

(base) [zhiyong@malab Learn]$ for i in `cat aa`  #用aa当作主体,注意其中cat命令和 ` ` 的使用
> do 
> echo $i
> done

aaa
bbb
ccc
ddd

5. C语言风格的循环语句,示例一

语法

for i in ((expr_1 ; expr-2 ; expr_3))
do
    执行语句
done
  • expr_1 , expr_2 和 expr_3都是数学表达式
  • expr_1用来初始赋值;expr_2是判断语句;expr_3是对变量的处理
  • 循环执行到不满足expr_2则会结束
(base) [zhiyong@malab Learn]$ for ((i=1;i<=5;i++))
> do
> echo "$i"
> done

1
2
3
4
5

上述示例中,i=1 是初始值;i<=5 是判断条件;i 自加一是对i的处理

6. C语言风格的循环语句,示例二

(base) [zhiyong@malab Learn]$ for ((i=1,j=1;i<=5;i++,j++))
> do
> echo "$i $j"
> done

1 1
2 2
3 3
4 4
5 5

7.示例五

(base) [zhiyong@malab Learn]$ cat tt.sh 
#! /bin/bash

for ((i=9,j=1;i>=1;i--,j=(j+1)*2))
do 
    echo "第$i天的起始香蕉量是$j"
done

(base) [zhiyong@malab Learn]$ bash tt.sh 
第9天的起始香蕉量是1
第8天的起始香蕉量是4
第7天的起始香蕉量是10
第6天的起始香蕉量是22
第5天的起始香蕉量是46
第4天的起始香蕉量是94
第3天的起始香蕉量是190
第2天的起始香蕉量是382
第1天的起始香蕉量是766

8. 示例六

(base) [zhiyong@malab Learn]$ cat tt.sh 
#! /bin/bash

j=1
for i in {1..8}
do 
    j=$[(j+1)*2]
done
echo "初始香蕉量为$j" 

(base) [zhiyong@malab Learn]$ bash tt.sh 
初始香蕉量为766

9. 示例七

#! /bin/bash

for i in {1..10}
do
        for k in $(seq 1 $[ 11-$i ])
    do
        echo -n " "
    done

    for j in $(seq 1 $i)
    do
                echo -ne "\033[102m \033[0m"
        done
    
    for h in $(seq 1 $i)
    do
        echo -ne "\033[102m \033[0m"
    done
    
    for p in $(seq 1 $[ 10-$i ])
        do
                echo -n " "
        done    

        echo
done


for i in {10..1}
do
        for k in $(seq 1 $[ 11-$i ])
        do
                echo -n " "
        done

        for j in $(seq 1 $i)
        do
                echo -ne "\033[102m \033[0m"
        done

        for h in $(seq 1 $i)
        do
                echo -ne "\033[102m \033[0m"
        done

        for p in $(seq 1 $[ 10-$i ])
        do
                echo -n " "
        done

        echo
done
打印形状.png

10.示例十

(base) [zhiyong@malab Learn]$ cat tt_2.sh 
#! /bin/bash 

for i in {1..8}
do
    if [ $[$i%2] -eq 0 ]
    then    
        for j in {1..8}
        do
            if [ $[$j%2] -eq 0 ]
            then echo -n -e "\033[47m  \e[0m"

            else echo -n -e "\033[46m  \e[0m"
            fi
        done
    echo 
    else 
        for j in {1..8}
        do
                    if [ $[$j%2] -eq 0 ]
                    then echo -n -e "\033[46m  \e[0m"

            else echo -n -e "\033[47m  \e[0m"
                    fi
        done
    echo
        fi

done
打印国际象棋棋盘.png

11.示例十一

(base) [zhiyong@malab Learn]$ cat tt_3.sh 
#! /bin/bash

for i in {1..9}
do
    for j in $(seq 1 $i)
    do
        if [ $i -gt 2 ] && [ $i -lt 5 ] && [ $j -eq 2 ]
        then    echo -n -e "\033[47m\033[33m$i*$j=$[$i*$j]\033[0m    "
        else    echo -n -e "\033[47m\033[33m$i*$j=$[$i*$j]\033[0m   "
        fi
    done
    echo
done
打印九九乘法表.png

12. 示例十二

forawk联用

for i in $(seq -s' ' 0 11)
  do  '#注意缩进
  cat seurat_found_marker_all.txt|awk '{print $2"\t"$(NF-1)"\t"$NF}'|sed '1d'|awk '{if($2=='$i') print $0}' > "seurat_found_marker_cluster_"$i".txt"  #注意缩进
done

awk中调用外部变量时,注意使用'$i'的形式,要特别注意外部单引号的使用

上一篇 下一篇

猜你喜欢

热点阅读