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

81 阅读2分钟

整理几个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

10、echo输出不折行

for i in `seq 1 12`
	do
		sleep 5
    	echo -e ".\c"
	done

11、同时输出到终端和文件

adb logcat | grep "log" | tee t.txt

管道|和重定向>的区别是:

  1. 左边的命令应该有标准输出 | 右边的命令应该接受标准输入
    左边的命令应该有标准输出 > 右边只能是文件
    左边的命令应该需要标准输入 < 右边只能是文件

  2. 管道触发两个子进程执行"|"两边的程序;而重定向是在一个进程内执行