Linux命令行与shell脚本编程大全笔记(更多的结构化命令)

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

猜你喜欢

转载自blog.csdn.net/qq_34595352/article/details/93488654