#!/bin/bash
for tes in Amer Bana Cnada Docum Fir
do
echo "Now ->> $tes"
done
echo "tes is :$tes" #for 语句结束后tes仍保存最后的值
#读取复杂值
for tes in I don't know how this'll work
do
echo "word:$tes"
done
#输出
Now ->> Amer
Now ->> Bana
Now ->> Cnada
Now ->> Docum
Now ->> Fir
tes is :Fir
word:I
word:dont know how thisll
word:work
解决: 转义单引号
#!/bin/bash
#分割包含空格的组
for tes in "ame aa" "bme bb" "cme cc"
do
echo "$tes"
done
#从命令中读取值
#!/bin/bash
#若是文件中含有空格 则同样以空格作为分割符号
#IFS=$'\n' 更改字段的分割符号
#IFS internal field separator 内部字段分隔符
#'\n' 整个的为回车符号
#若要制定多个IFS 可直接串起来 如指定回车 冒号 分号 双引号
# IFS=$'\n':;"
filename=$1
lis=$( cat $filename )
for tes in $lis
do
echo "$tes---"
done
#通配附读取命令
#!/bin/bash
touch /home/user/"abc ame.txt"
temp="`pwd`/*"
for file in /home/user/* $temp #可同时合并多个目录进行搜索
do
if [ -d "$file" ] #Linux中 文件目录名包含空格也是合法的
then
echo "$file is a dir"
else
echo "$file not a dir"
fi
done
C语言风格的for
bash for 循环的基本格式
for (( variable assignment ; condition ; iteration process ))
不同于以往bash shell的标准:
- 赋值变量可以有空格
- 条件中的变量不以美元符号开头
- 迭代过程的算式未用expr命令格式
#没有空格之类的要求 接近于C 但是输出语句中需要$
#!/bin/bash
for ((i= 1;i<=10 ;i++ ))
do
echo "$i"
done
#使用多个变量
#bin/bash
for (( a=10 , b=20 ; a<=20;a++,b--))
do
echo "$a<---->$b"
done
while
while 语句中定义的 test command与if-then无异。可以使用任何普通的bash shell命令。
#!/bin/bash
var1=10
while [ $var1 -gt 0 ]
do
echo "$var1"
var1=0
done
#多个测试命令
#while 是否执行取决与?????
#!/bin/bash
var1=100
while "` cd -`" [ $var1 -gt 20 ]
do
echo "$var1 "
var1=10
done
until
# shell中变量的自加操作
#!/bin/bash
var1=100
until [ $var1 -eq 0 ]
do
echo -n "$var1 "
var1=$[$var1-1]
done
嵌套循环
#!/bin/bash
for (( a=1 ;a<10;a++ ))
do
echo -n "a:$a "
for (( b=2 ;b<30;b))
do
b=$[$b+5]
echo "b:$b"
done
done
循环处理文件数据
#!/bin/bash
#$(cat /etc/passwd) 要熟悉这种方法
#$[] 运算
ifstemp=$IFS
IFS=$'\n'
for line in $(cat /etc/passwd)
do
echo "Values in $line!"
IFS=:
for val in $line
do
echo -n "$val "
done
echo ""
done
break跳出外部循环 输出重定向
# break n 指定跳出到上层第n个循环(本循环为第一个)
#!/bin/bash
for (( a=1;a<4;a++ ))
do
echo "OuterLoop:$a"
for (( b=1;b<=4;b++ ))
do
echo " InnerLoop:$b"
if [ $b -eq 3 ] && [ $a -eq 2 ]
then
break 2
fi
done
done >> break_output.txt # 程序执行错误会直退出 无法重定向
done | sort #对输出排序
PRACTICE
#!/bin/bash
ifstemp=$IFS
IFS=:
n=0
filename=execfile.txt
touch $filename
chmod 777 $filename
for dir in $PATH
do
echo "$dir"
for file in $dir/*
do
#echo "$file"
if [ -x $file ]
then
echo "$n $file"
n=$[$n+1]
fi
done
done >> $filename