1、循环遍历文件每一行,并打印行数
1.1、目标文件
1.2、实现1:
#!/bin/bash
num=0
for i in `cat test.txt`; do #使用cat命令读取test文件
echo $i
((num++))
done
echo num:$num
echo "==========================================="
oldIFS=$IFS
IFS=$'\n' #将环境变量IFS默认分隔符(制表符、空白符、换行符)修改为换行符
num=0
for i in `cat test.txt`; do #使用cat命令读取test文件
echo $i
((num++))
done
echo num:$num
IFS=$IFS
1.3、实现2:
#!/bin/bash
num=0
lines=`cat test.txt | wc -l` #使用cat读取文件,然后使用wc -l来读取文件的行数
for ((i=1; i<=lines; i++)); do
line=`head -$i test.txt | tail -1` #使用head -$i | tail -1来读取文件的前i行的最后一行
echo $line
((num++))
done
echo num:$num
1.4、实现3:
#!/bin/bash
#使用输入重定向"<"来输入test.txt的整个内容
#使用read来读取test.txt的每一行内容,当遇到换行符,即进入下一行的同时,也进入了下一次while循环,read命令对换行符敏感。
num=0
while read line; do
echo $line
((num++))
done < test.txt
echo num:$num
1.5、实现4:
#!/bin/bash
export num=0
#使用管道,左边创建一个子进程来处理cat,右边创建一个子进程来处理while …… done这一部分,最后打印父进程(当前进程)的num。
#export:导出非共享,子进程修改变量,不会影响父进程的变量。
#如果要实现共享,子进程可以将变量写入文件,然后父进程读取文件获取最新的变量。
cat test.txt | while read line; do
echo $line
((num++))
done
echo num:$num
echo "======================="
#当使用管道时,右边创建子进程,子进程遇到小括号,又会创建一个子进程来处理小括号里面的内容,即while …… num:$num这一部分。
#将while …… done这一部分用小括号括起来,done后面使用;连接,直接打印小括号的变量。
num=0
cat test.txt | (while read line; do
echo $line
((num++))
done; echo num:$num)
echo "======================="
#使用大括号和小括号的区别在于:
#1、右边子进程不会再创建子进程来处理,而是由当前子进程来处理大括号里面的内容,即while …… num:$num这一部分。
#2、最后一个命令结尾必须要使用;号。
num=0
cat test.txt | { while read line; do
echo $line
((num++))
done; echo num:$num;}
2、@*和@#
#!/bin/bash
echo $1
echo $2
echo $*
echo $@
#当$*用双引号时,参数列表是作为一个元素
#当$@用双引号时,参数列表中的每个参数都切割成了一个单独的元素
echo "====================="
for i in "$*"; do
echo $i
done
echo "===================="
for i in "$@"; do
echo $i
done
3、七步扩展
- 花括号 mkdir -p d/{a,b,c}d
- 波浪线 cd ~
- 变量&参数 $ $$ ${}(……)
- 命令替换ls -l `echo $path`
- 算术扩展 num=$((3+4))
- word拆分 $IFS
- 路径 * (零到多个任意字符)?
- 引用删除 echo "hello"
- * 重定向 >(发生在执行前)