02.用过的shell命令(整理中)

2021-11-19  本文已影响0人  笑着字太黑

1.基本规则

这里记录个人使用的规则,与通用规则可能有冲突的地方

1.1.文件名使用[_]分割,函数名使用文件名+驼峰命名
SHELL里面是不区分大小写的,命名规则通常时使用下划线分割,
SHELL里面也没有命名空间的概念,
导致划分文件规划代码的时候非常困难,
目前想到的办法也只能是采用强行违反通用规则的命名方式来凑合着用

1.2.全局常量,局部变量

SHELL并没有常量,变量,全局,局部的概念,
SHELL里面在任意文件任意位置定义的都是全局的
这里也只是使用类似的机能强行划分一下

1.2.1.全局常量,大写,使用_开头,readonly
readonly _ABC='abc'
1.2.2.局部变量,小写,local
local abc='abc'
1.3.函数内将收到的参数重新赋值(可读性)
local XXX=$1
local XXX=$2

2.取得路径

readonly current_path=$(
cd $(dirname $0)
pwd
)

3.引入文件

source ${current_path}/../config/con.env
source ${current_path}/../lib/lib1.sh

4.大写转小写

readonly LLETTER=$(echo ${XXX} | tr '[A-Z]' '[a-z]') 

5.写文件

5.1.覆盖(>)
"XXXX" > [file]
5.2.追加(>>)
"XXXX" >> [file]

6.文件内容置换

注意特殊字符需要转义
比如代码中的[replace_org]
是因为[和]是特殊字符,所以进行了转义
实际是将文件中的[replace_org],替换为变量${replace_target}的值

sed -i "s#\[replace_org\]#${replace_target}#" ${repalce_file}

7.删除空行

sed -i "/^$/d" ${OUTPUT_FILE_PATH_PASSPORT}

8.if判断

8.1.数值比较

-eq等于,对应的其他英文缩写还有比如以下:
大于等于-ge
大于-gt

if [ ${XXX} -eq 0 ]; then
else
fi
8.2.字符串比较

一个等号好像跟两个等号是一样的,
不喜欢使用一个等号,因为容易跟赋值混淆,
没有详细测试过

if [ “${XXX}” == “XXX” ]; then
else
fi

9.多行字符串赋值

sql=$(cat<<EOF
            sql1;
            sql2;
EOF
)

10.删除文件中的CR(\r)

sed -i 's/\r//' ${file_path}

11.读取CSV文件

local index=1
cat ${CSV_PATH} | while read line
    do
        #跳过一行
        if [ ${index} -ge 2 ]; then
            #取得逗号分割的第一列
            local col1=$(echo ${line} | awk -F"," '{print $1}')
            #通过取得的第一列的值查找${IMG_PATH} 目录下的文件
            local file_name="$(find ${IMG_PATH} -type f -name "${cole}\.*")"
            if [ ! $file_name ]; then
                local mime_type=""
            else
                #取得文件的mime-type
                local mime_type="$(file --mime-type -b ${file_name})"
            fi
            #取得文件名(去掉路径)
            file_name=$(basename ${file_name})
            #在${CSV_PATH}文件对应行的末尾追加${file_name},${mime_type}
            sed -i "${index},${index}s#\$#&,${file_name},${mime_type}#" ${CSV_PATH}
        fi
        let index+=1
    done

12.遍历目录中所有文件

    for temp_file in ${path}/*
    do
    done

13.取得前一行语句执行结果

    #処理結果
    RC=$?
    if [ $RC -eq 0 ]; then
        #正常终了
    else
        #异常终了
        exit $RC
    fi

14.判断文件第二行逗号数量

local line2=$(sed -n 2p ${temp_file})
local commaCount=$(echo ${line2} | awk -F',' '{print NF-1}')
if [ ${commaCount} -ge 2 ]; then
    #File Type A
else
    #File Type B
fi

15.数值整形

不足三位前面补零

local id03d=$(printf "%03d" "${id}")

16.查找文件中指定字符串开头的行

查找SearchContent开头的行,并解析逗号分割的第二列值,赋值给value

local value=$(cat ${CSV_PATH} | grep ^SearchContent.* | awk -F"," '{print $2}')

17.LF转CRLF

#LF转CRLF
sed -i ':a;N;$!ba;s/\n/\r\n/g' ${FILE_PATH}
#末尾如果有LF的话上面命令转换不了,使用下面命令直接吃掉
truncate -s -1 ${OUTPUT_FILE_PATH_ACTIVENGLIST}

18.取得毫秒时间

start=$[$(date +%s%N)/1000000]
date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23

19.置换文件内容

sed -i "s/${KEY_TARGET}/${REPLACE}/" ${file}

20.数组遍历的几种方式

首先创建一个数组 array=( A B C D 1 2 3 4)

20.1.标准的for循环
for(( i=0;i<${#array[@]};i++)) do
echo ${array[i]};
done;
20.2.for … in

遍历(不带数组下标):

for element in ${array[@]}
#也可以写成for element in ${array[*]}
do
echo $element
done

遍历(带数组下标):

for i in "${!arr[@]}";   
do   
    printf "%s\t%s\n" "$i" "${arr[$i]}"  
done 
20.3.While循环法:
i=0  
while [ $i -lt ${#array[@]} ]  
do  
    echo ${ array[$i] }  
    let i++  
done

21.grep +正则表达式

-P:使用正则表达式
-o:取得匹配部分,不加-o取得包含指定字符串的一行数据

split_str() {
    local str="14d3h5m2s"
    local h=$(echo ${str} | grep -Po "\d+d")
    echo ${h}
}

22.CURL

local start_date=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)
res=`curl -S --stderr curl.log -X POST -k [url] \
          -H "Content-Type: application/json" \
          -H "XXX: xxx" \
          -d '{
                "XXX":"xxx", 
                "XXX":"xxx"
              }'`
          
local end_date=$(date "+%Y-%m-%d %H:%M:%S.%N" | cut -b 1-23)
        
local start_ms=$[$(date -d "${start_date}" +%s%N)/1000000]
local end_ms=$[$(date -d "${end_date}" +%s%N)/1000000]
let rsp_time=${end_ms}-${start_ms}
        
contain_result=$(echo $res | grep "XXX")
if [[ -z $contain_result ]]
then
    error_log=$(grep -o "curl.*" curl.log)
    echo "XXX"
fi

23.no hang up与后台运行&

nohup sh test.sh  & 

查看程序PID

ps -ef | grep test

杀死进程

kill -9 进程号

查看占用某端口的进程

netstat-tln|grep+被占端口。
lsof-i:+被占端口
netstat -ap|grep +被占端口

24.判断数组中是否存在某个值

echo "${XXX_NAME_LIST[@]}" | grep -wq "${XXX_NAME}"
RESULT=$?
case ${RESULT} in
#XXX_NAME_LIST中存在XXX_NAME
0)
    #do something
    ;;
#XXX_NAME_LIST中不存在XXX_NAME
*)
    #do something
    ;;
esac

25.接收YYYYMMDD格式的输入值

while read -p "XXXDate(YYYYMMDD):" xxxDate
do
    if [[ ${xxxDate} =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]]; then
        break
    else
        echo "Pls input date with YYYYMMDD format"
    fi
done

26.echo 输出时不换行

echo -e "XXXX\c"

27.echo grep结果时保持换行效果

换行效果是受到echo影响的,grep结果里面是保留有换行符的

grepResult=$(grep -h "[grep content]" [file name(文件名中可以使用*)])

#输出有换行效果
echo "${grepResult}"

#输出无换行效果
echo ${grepResult}

28.变量名做Key名

    #注意这里定义数组需要使用双引号而不是小括号
    VALUE_LIST_KEYXXXX="value1 value2"

    keyName="KEYXXXX"
    valueList=`eval echo '$'VALUE_LIST_${keyName}`

    echo "ValueList1:${valueList}"
    echo "ValueList2:${valueList[@]}"
    for value in ${valueList[@]}
    do
        echo "VALUE: ${value}"
    done

29.数组内容太长时折行

NAME_LIST=(
  0001 0002 0003 0004 0005
  0030 0031 0032 0033
)

30.逐行遍历grep文件后的多行结果

grep -E -o -h "${_GREP_KEY}" ${_FILE} | while read -r line; do
    echo ${line}
done
上一篇下一篇

猜你喜欢

热点阅读