amazzzzzing

导航

Shell脚本示例

Shell脚本示例

输入与输出

#!/bin/bash

var_filename='date.txt'

# 输出命令的执行结果
# 注意这里的符号不是引号
echo `date`

# 输出至文件
echo `date` > ${var_filename}

# 从文件读内容
var_txt=$(cat ${var_filename})
echo ${var_txt}

# 从文件读取内容的另一个方式
var_text=`cat ${var_filename}`
echo ${var_text}

字符串测试

#!/bin/sh

STRING="1911"
STRING_2="1912"

# 字符串相同
if [ "$STRING" = "$STRING_2" ]; then echo "same string"; fi

# 字串长度为零
if [ -z "$STRING" ]; then echo "zero string"; fi

# 字符串长度非零
if [ -n "$STRING" ]; then echo "not zero string"; fi
if [ "$STRING" ]; then echo "not zero string"; fi

文件测试

#!/bin/sh

# 文件测试
TESTFILE="testfile"

# 文件
if [ -e "$TESTFILE" ]; then echo "exist"; fi

# 可读文件
if [ -r "$TESTFILE" ]; then echo "exist"; fi

# 可写文件
if [ -w "$TESTFILE" ]; then echo "exist"; fi

# 可执行文件
if [ -x "$TESTFILE" ]; then echo "exist"; fi

# 普通文件
if [ -f "$TESTFILE" ]; then echo "exist"; fi

# 文件夹
if [ -d "$TESTFILE" ]; then echo "exist"; fi

# 大小比较
if [ $log_size -gt 0 ]; then echo "bigger"; fi

流程控制

#!/bin/sh

TEST=$1

printf

#!/bin/sh

# 格式化输出

var_width=20
var_format_head="%-${var_width}s %-${var_width}s %-${var_width}s\n"
var_format_content="%-${var_width}s %-${var_width}s %-${var_width}.2f\n"

echo ${var_format_head}
echo ${var_format_content}

printf "${var_format_head}" "姓名" "性别" "战斗力"
printf "${var_format_content}" "张无忌" "男" 90
printf "${var_format_content}" "张三丰" "男" 93
printf "${var_format_content}" "杨过" "男" 90

内置变量

#!/bin/bash

# 参数的个数
echo "arg number:$#"
# 参数组合成字串
echo "args: $*"
# 当前进程
echo "pid: $$"
# 上一个进程
echo "last pid: $!"
# 当前配置
echo "option: $-"
# 上一个推出状态
echo "exit state: $?"

变量

#!/bin/bash

# 变量定义
var_ref="pwd"

# 引用变量执行命令
${var_ref}

# 引用变量执行命令
# 输出执行命令的结果
echo $(${var_ref})

# 通过指令定义
var_path=$(pwd)
echo ${var_path}

# 单引号格式按原样解析
var_name='path: $var_path'
echo ${var_name}

# 变量可以被重新赋值
# 双引号格式会解析其中的变量
var_name="path: $var_path"
echo ${var_name}

数组

#!/bin/bash

var_array_str=("A" "B" "C")

# 数组的访问
echo ${var_array_str[0]}
echo ${var_array_str[1]}
echo ${var_array_str[2]}
echo ${var_array_str[3]}

# 全部成员,两种写法等价
echo ${var_array_str[*]}
echo ${var_array_str[@]}

# 成员的遍历,以及计数
i=0
for var_str in ${var_array_str[*]}
do
    echo "array[${i}]=$var_str";
    # 变量计数的方式
    # let i+=1
    ((i++))
done

分隔符调整


# 用ffprobe探测文件夹中的所有文件的信息

OLDIFS="$IFS"
IFS=$'\n'

for file in `find . -type f`
do 
echo "$file"
ffprobe "$file" -loglevel quiet -show_streams
echo ""
sleep 0.2
done

IFS="$OLDIFS"

生成时间

echo Pack time: $(date +"%Y-%m-%d %T") > version.txt

获取配置文件中的 = 后的名字

DeviceModel = IPC_NYX_JZ_ID_P10

echo "AAA_BV1 = CCC_DV123" | sed "s/.*= *\(.*\)/\1/g"

按列求和

line 761, (rtsp_ts) send seq(38691), expect seq(38690), lost num(1), sum(1302), timeout_ms(101)
line 761, (rtsp_ts) send seq(40251), expect seq(40250), lost num(1), sum(1210), timeout_ms(101)

找出其中lost num后所有数字的和

cat file | sed -E "s/.*lost num\(([^\)]+)\).*/\1/g" | awk '{sum+=$1}END{print sum}'

md5sum 过滤掉路径

md5sum /home/ambarella_test | awk '{print $1," ambarella_test"}'
echo "74407221ab35e399e5cfb8312b3f67f4  /home/test/code//Smart-D2S-24A-P_RV1109/trunk/partition/script/../rootfs/app/usr/lib/libmcvsdk_video.so" | sed  "s/\/.*\///g"

生成 compile_commands.json

bear make 

截取文件中的指定行

首先找出关键字所在的行

grep "log changed" logfile  -n

832317:1648548254: 4763974: -------------- log changed begin 4059359 -------------
832630:1648548254: 4763975: -------------- log changed end 4059359 -------------
1433902:1648548790: 9082410: -------------- log changed begin 6327523 -------------
1434191:1648548790: 9082411: -------------- log changed end 6327523 -------------
1831422:1648549247: 39757687: -------------- log changed begin 6327523 -------------
1831977:1648549247: 39757696: -------------- log changed end 6327523 -------------
2010277:1648549520: 56874045: -------------- log changed begin 6327523 -------------
2011182:1648549520: 56874046: -------------- log changed end 6327523 -------------
2213778:1648549827: 65926909: -------------- log changed begin 6327523 -------------
2215303:1648549827: 65927626: -------------- log changed end 6327523 -------------
2363449:1648550050: 66983134: -------------- log changed begin 6327523 -------------
2364466:1648550050: 66983135: -------------- log changed end 6327523 -------------
sed -n '2010277,2011182p' logfile > part4.txt
sed -n '2213778,2215303p' logfile > part5.txt
sed -n '2363449,2364466p' logfile > part6.txt

find 查找目录,并过滤掉 svn 相关目录

find . -path *svn* -prune -o -type d

找出所有文件,并按大小排序

find ./ -type f -printf '%s %p\n' | sort -rn

找出一个目录下的全部文件个数

find . -type f | wc -l

找出一个目录下文件名中带有特定字符(比如8K)的某类型文件的总大小

find . -type f | grep -i 8k | grep -i -E "mp4$|ts$" | xargs -d "\n" ls -la | awk '{sum += $5}; END {x=1024*1024*1024;print sum/x " G";}'

分区和格式化

# 注意,分区不是必须的

# 分区
fdisk

# 格式化(建立文件系统)
mkfs.vfat -F 32 /dev/...

文件加密解密

PASS=`cat ~/pass.txt`
OUTPUT=secret-backup.tgz
SRC=secret-backup.md

# encrypt
tar --atime-preserve -zcf - $SRC | openssl des3 -k $PASS -pbkdf2 -nosalt -out $OUTPUT
md5sum $OUTPUT

# decrypt
cp -f $SRC $SRC.bak
openssl des3 -in $OUTPUT -d -k $PASS -pbkdf2 -nosalt | tar zxf -

跟踪某个文件的写入

tail -f -s 1 [file]

mount tmpfs

mount tmpfs ./tmpfs -t tmpfs -o size=1G

当前时间

# 2023-09-26 08:58:35
date +"%F %T"

记录会话内容

# script会记录会话的内容
script

遍历文件夹中的文件


# 遍历所有文件,并修改封装格式(.mkv --> .mp4)
for file in `ls ./*.mkv`
do
new_name=`echo $file | sed -E "s/(.*)\.mkv/\1.mp4/g"`
echo "Processing: $file --> $new_name"
ffmpeg -i $file -codec copy $new_name
done

7z


sudo apt-get install p7zip-full

7z a -t7z -m0=lzma -mx=1 -mfb=32 -md=256k -ms=on -mmt archive.7z dir1

tmux


tmux new -s session_name

tmux ls
tmux at -t session_name

匹配单词(识别单词边界)


\b 表示单词边界

echo "abc abcd" | grep -E "\babc\b"

进程相关


# 判断某个进程是否存在

pidname=adbd
if [ -n $(pidof $pidname) ]
then 
    echo "$pidname exist"
fi

# 当前进程ID
echo $$

# 上一个运行的进程ID
echo $!


# 进程控制

# 脚本中创建的子脚本进程会因为父进程被杀而被接管,不容易查找;
# 可以通过创建标志文件控制这些进程

数字计算


# 计算
param_1=6
param_2=3
result=$(($param_1/$param_2))

posted on 2020-10-31 18:15  amazzzzzing  阅读(136)  评论(0)    收藏  举报