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
![](https://img.haomeiwen.com/i23414774/2b58a16685302cac.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
![](https://img.haomeiwen.com/i23414774/8a2fe3188f049e3d.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
![](https://img.haomeiwen.com/i23414774/4ce57759f76d44ef.png)
12. 示例十二
for
与awk
联用
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'
的形式,要特别注意外部单引号
的使用
网友评论