for命令
# 一般默认是空格分割
for i in a b c d efg hi; do
echo $i
done
# ' " 要转义,方法一:用反斜杠; 方法二:用其他引号
for i in I don\'t know if "this'll" work; do
echo $i
done
# 从变量读取列表
list="a b c"
list=$list" d" # 向变量已有文本字符串尾部添加文本的一个常用方法
for i in $list; do
echo $i
done;
# 从命令值读取
for i in $(cat $file); do
done
更改字段分割符 IFS
IFS
内部字段分隔符(默认为空格,制表符,换行符)
IFS=:
一般赋值
IFS=$'\n':;"
指定多个分割符,只需将分隔符串接起来就可以
IFS.OLD=$IFS
IFS=$'\n' #设置新的IFS
...
IFS=$IFS.OLD
用通配符读取目录
#遍历一个目录下的文件
# 若有多个目录则合并 # for i in /bin/* /etc/*
for i in /home/root/test/*;do
if [ -d "$file" ];then #Linux中文件或者目录中可能存在空格,所以用双引号包起来
fi
if [ -f "$file" ];then
fi
done
C语言风格的for命令
#变量赋值可以没有空格,变量不以美元符开头,算术过程不用expr
for (( a = 1; a < 10; a++ ))
do
done
#多变量
for (( a=1, b=10; a<=10; a++, b-- ))
while命令
while [ $var -gt 0 ]
do
var=$[ $var - 1 ] # var=$(expr $var - 1)
done
#使用多个测试命令,只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环
#有多个命令的while语句中,每次迭代的测试命令都会被执行
while echo $var
[ $var -gt 0 ]
do
var=$[ $var - 1 ] # var=$(expr $var - 1)
done
until命令
until
命令要求测试命令返回的退出状态码不为0,才会继续执行循环中的命令,测试退出状态码为0时,则退出循环
until
测试多条命令时,只有最后一个命令成立时停止循环
until [ $var -eq 0 ]
do
done
#多个测试命令
until echo $var
[ $var -eq 0 ]
do
done
for、while、until
等命令可以嵌套使用
循环处理文件数据
IFS.OLD=$IFS
IFS=$'\n'
for entry in $(cat /etc/passwd)
do
IFS=:
for value in $entry
do
echo $value
done
done
控制循环
break可以退出任意类型的循环
break
默认跳出当前正在执行的循环
break n
n指定了要跳出循环的层级,n=1时跳出当前循环;n=2时,跳出下一级的外部循环
continue
命令可以提前终止某一次循环中的命令,不会完全终止某个循环
continue n
n指定了要继续执行哪一级的循环,n=1时继续当前循环,n=2继续上一级的循环
处理循环的输出
#在done后面增加一个处理命令来实现
for file in /home/tra/*
do
echo $file
done > file.txt
#将循环的结果接管给另一个命令
for state in "a b" d c f a
do
echo $state
done | sort
一些例子:
查找可执行文件
IFS=:
for folder in $PATH
do
for file in $folder/*
do
if [ -x $file ]
then
echo "$file"
fi
done
done
创建多个用户账户(认真看代码呀)
#!/bin/bash
# read命令自动读取文本文件的下一行内容,不需要写个专门的循环来处理
input="users.csv"
while IFS=, read -r userid name
do
echo "adding $userid
useradd -c "name" -m "userid"
done < $input