美文网首页
shell 部分基础需求-持续更新~

shell 部分基础需求-持续更新~

作者: YocnZhao | 来源:发表于2019-05-07 11:58 被阅读0次

    整理几个shell的基础需求
    1、文件不存在时等待

    while true; do
      if [ ! -f "/Users/yocn/Desktop/a.txt" ]; then
        #文件不存在,等待5s
        sleep 5
      else
        #文件存在,停止等待
        break
      fi
    done
    

    2、删除文件夹下除了a.txt和b文件夹下的所有文件

    #除了a.txt和b文件夹和.svn文件夹之外都删除  利用grep -v反选操作,-E指使用正则表达式,支持多个排除
    rm -rf `ls -a|grep -vE "a.txt|b|.svn"`
    

    3、命令输出作为变量
    使用$()包起来或者使用` (键盘左上角 数字键1左边那个)

    v0=`cat aaa.txt`
    echo $v0
    v1=$(cat aaa.txt)
    echo $v1
    
    

    4、拷贝源目录下的.apk文件到目标目录,如果目标目录存在则在xxx.apk的xxx后面加-0变成xxx-0.apk

    #!/bin/bash
    #所有apk文件
    for file in `ls |grep -E ".apk$"`; do
        #目标名字  Avatar-3.0.0.debug-103980.apk
        destFileName=Avatar-${file#*-}
        echo "destFileName->$destFileName"
        if [ -f export/$destFileName ]; then
            # 目标目录中存在同名文件 Avatar-3.0.0.debug-103980开头的apk simpleName -> Avatar-3.0.0.debug-103980
            simpleName=${destFileName%%.apk*}
            echo "simpleName->$simpleName"
            apkNums=0
            for file2 in `ls export|grep -E ^$simpleName`; do
                let apkNums++
                echo $file2
            done
            echo "apkNums----->$apkNums"
            destFileName=${destFileName%%.apk*}-$apkNums.apk
        fi
        echo "destFileName->$destFileName   file->$file"
        cp -rf $file export/$destFileName
    done
    

    这牵扯到某几个小的知识点
    4.1、shell中实现 i++,差不多有这么5种方法

    a=1
    
    a=$(($a+1))
    a=$[$a+1]
    a=`expr $a + 1`
    let a++
    let a+=1
    

    4.2、字符串的匹配删除

    #!/bin/bash
    string="Avatardebug-3.0.0.debug-103980.apk"
    # # 号截取,删除左边字符,保留右边字符。保留从左到右第一个 - 右边的 -> 3.0.0.debug-103980.apk
    s1=${string#*-}
    # ## 号截取,删除右边字符,保留左边字符。保留从左到右最后一个 - 右边的 -> 103980.apk
    s2=${string##*-}
    # % 号截取,删除左边字符,保留右边字符。保留从左到右最后一个 - 左边的 -> Avatardebug-3.0.0.debug
    s3=${string%-*}
    # % 号截取,删除右边字符,保留左边字符。保留从左到右第一个 - 左边的 -> Avatardebug
    s4=${string%%-*}
    echo "s1->$s1" 
    echo "s2->$s2"
    echo "s3->$s3" 
    echo "s4->$s4"
    

    5、找到文件夹中最新创建的文件并打印名字 -- 转自这里

    ls -lt /dirname/ | grep filename | head -n 1 |awk '{print $9}'
    
    逐条解释:
    ls -lt /dirname/ 
    列出此目录下的所有文件并按照时间先后排序
    grep filename 
    过滤出包含关键字的文件
    head -n 1
    查看排名第一的文件
    awk '{print $9}'
    打印出第九字段,此处为文件名
    

    6、遍历数组

    for f in ${filelist[@]}
    do
        echo " $f"
    done
    

    7、遍历文件夹下所有文件存到数组

    c=0
    for file in `ls`
    do
        echo "$file"
        filelist[$c]=$file
        let c++
    done
    

    8、文件中替换string

    #替换第一个
    sed -i 's/原字符串/新字符串/' /home/1.txt
    #替换所有的
    sed -i 's/原字符串/新字符串/g' /home/1.txt
    

    mac上需要是
    sed -i '' 's/原字符串/新字符串/' /home/1.txt

    9、shell文件参数个数

    #!/bin/bash
    
    if [ $# -gt 0 ]; then
            echo "参数个数为$#个"
    else
            echo "没有参数"
    fi
    

    相关文章

      网友评论

          本文标题:shell 部分基础需求-持续更新~

          本文链接:https://www.haomeiwen.com/subject/kukeoqtx.html