首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【趣学程序】Linux流程语句

linux命令流程语句

if语句

在linux中可以通过help命令查看if的格式

代码语言:javascript
复制
[root@CentOS6 shell]# help ifif:    if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi

解释:    if 后面跟命令 ;  then  如果命令成立,在这里可以在执行命令;  [还可以写多个 elif 语句] [最后也可以写 else 语句]  最终以 fi 结束if语句

代码示例:
打印当前目录,如果正确输出打印ok 如果错误输出 打印error[root@CentOS6 shell]# if ls ./; then echo ok; else echo error; fi\  adduser.sh  exporttest.sh  test.shok
如果不想让 ls命令的结果输出到控制台上,可以重定向所有的输出流到 /dev/null[root@CentOS6 shell]# if ls ./ &> /dev/null; then echo ok; else echo error; fiok

条件表达式使用 : test 或者 [   [root@CentOS6 shell]# if [ 2 -eq 3 ]; then echo yes; else echo no; fino

for语句

代码语言:javascript
复制
[root@CentOS6 shell]# help forfor:    for NAME [in WORDS ... ] ; do COMMANDS; done
for ((:     for (( exp1; exp2; exp3 )); do COMMANDS; done

for的格式有两种:     第一种类似于java中的增强for循环    第二种类似于java中的普通for循环

示例:[root@CentOS6 shell]# for i in "upuptop" "趣学程序" "pyfysf" ; do echo $i; doneupuptop趣学程序pyfysf
[root@CentOS6 shell]# for(( i = 0; i<=5; i++ )); do echo $i; done012345

while语句

代码语言:javascript
复制
[root@CentOS6 shell]# help whilewhile:    while COMMANDS; do COMMANDS; done

示例:[root@CentOS6 shell]# mkdir /upuptop[root@CentOS6 shell]# while ls /upuptop &> /dev/null; do echo ok; rm -rf /upuptop; doneok

上述命令:执行ls /upuptop命令,结果为0,则打印ok,删除/upuptop目录。再次执行 ls /upuptop ,结果非0.终止循环。如果不加rm -rf /upuptop 则是死循环

linux中的分割

bash最终的扩展是切割扩展,其通过一个环境变量 IFS 里面定义的分隔符进行分割。默认为空格,制表符,换行符。IFS 的定义是放的三个标识符的ASCII码,例如:我们可以通过$"\n"获去换行符的码值 在脚本中,如果你修改了用完之后一定要记得改回去 可以使用 awk 命令切割字符串

练习

获取指定参数文件夹中包含其子目录中最大文件

代码语言:javascript
复制
1.用户自定义路径2.输出文件带下最大的文件3.递归子目录

[root@CentOS6 shell]# vim maxFile.sh#!/bin/bash
# 备份$IFSoldIFS=$IFS
# 设置IFS的切割只为换行符IFS=$'\n'
# 循环遍历指定参数目录下的所有文件和目录for i in `du -a $1 | sort -nr` ; do
  # 此时 $i=4    ./adduser.sh  对文件进行切割    fileName=$(echo $i | awk '{print $2}')#    echo $fileName  # 判断仅仅是文件的数据    if [ -f $fileName ]; then
    # 打印文件名    echo $fileName    exit 0
    fidone
# 复原IFSIFS=$oldIFSecho "not find ..."exit 2
[root@CentOS6 shell]# chmod +x maxFile.sh [root@CentOS6 shell]# ./maxFile.sh ./1.jpg

循环遍历文件每一行,使用流程控制语句

代码语言:javascript
复制
# 定义一个计数器num# 打印num正好是文件行数
[root@CentOS6 shell]# vim a.txt[root@CentOS6 shell]# cat a.txt a 1b 2c 3

shell脚本:
[root@CentOS6 shell]# vim readFile.sh
#!/bin/bash
# 第一种方式:使用for..in,加cat命令# 备份IFSoldIFS=$IFSIFS=$'\n'
num=0
for i in `cat a.txt`; do    echo $i    ((num++))doneecho fun1:num:$num
IFS=$oldIFS

# 第二方式:使用管道 普通for循环实现
num=0
# 获取行数lines=`cat a.txt | wc -l`
for ((i=1; i<= lines; i++));do    head -$i a.txt | tail -1    ((num++))doneecho fun2: num:$num

# 第三种方式 IO重定向
# 备份0输入流exec 8>&0# 将标准输入指向a.txtexec 0< a.txtnum=0
# read命令默认读取标准输入0 中的内容 遇见换行符结束while read line;do    echo $line    ((num++))done
echo fun3: num:$num# 复原0exec 0<&8


# 第四种方式 第三种的简化
num=0
while read line ; do
    echo $line    ((num++))done 0< a.txt

echo fun4:num:$num
# 第五种方式 使用管道为while读取 注意子进程计数处理# 由于管道会开启左侧与右侧的子进程执行程序,所以这里使用保存文件来计数export num=0rm -rf tempnumcat a.txt | while read line; do    echo $line    if [ -f tempnum ]; then    # 获取之前存在的值    nn=`head -1 tempnum`
    echo $((nn+1)) > tempnum    else echo 1 > tempnum    fi
done
echo fun5:$(cat tempnum)


[root@CentOS6 shell]# chmod +x readFile.sh[root@CentOS6 shell]# ./readFile.sh
举报
领券