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

2019-05-07  本文已影响0人  YocnZhao

整理几个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
上一篇 下一篇

猜你喜欢

热点阅读