Featured image of post 日常shell分享

日常shell分享

前言

最近自测个项目,为了方便发起交易写了几个shell脚本。期间也是发现太久没写了很多基础的都忘了,写个博客记录下常用操作。

常用

list

mylist=(1 2 3)
echo ${#mylist[@]}
3
echo ${mylist[1]}
2
echo ${mylist[-2]}
2
echo ${mylist[@]}
1 2 3
echo ${mylist[*]}
1 2 3
for i in ${mylist[@]};do
	echo ${i}
done

if判断

if [[ $1 = 'tomcat' ]];
then
  echo "Input is tomcat"
elif [[ $1 = 'redis' ]] || [[ $1 = 'zookeeper' ]];
then
  echo "Input is $1"
else
  echo "Input Is Error."
fi

# 文件测试运算符:
-f FILE: 文件 FILE 存在且是一个常规文件。
-d DIR: 文件 DIR 存在且是一个目录。
-e FILE: 文件 FILE 存在。
-s FILE: 文件 FILE 存在且不为空。
-r FILE: 文件 FILE 存在且可读。
-w FILE: 文件 FILE 存在且可写。
-x FILE: 文件 FILE 存在且可执行

# 字符串测试运算符:
STRING1 = STRING2: 字符串 STRING1 和 STRING2 相等。
STRING1 != STRING2: 字符串 STRING1 和 STRING2 不相等。
-z STRING: 字符串 STRING 的长度为零。
-n STRING: 字符串 STRING 的长度非零

# 整数比较运算符:
INTEGER1 -eq INTEGER2: 整数 INTEGER1 等于 INTEGER2。
INTEGER1 -ne INTEGER2: 整数 INTEGER1 不等于 INTEGER2。
INTEGER1 -gt INTEGER2: 整数 INTEGER1 大于 INTEGER2。
INTEGER1 -ge INTEGER2: 整数 INTEGER1 大于等于 INTEGER2。
INTEGER1 -lt INTEGER2: 整数 INTEGER1 小于 INTEGER2。
INTEGER1 -le INTEGER2: 整数 INTEGER1 小于等于 INTEGER2

# 逻辑运算符:
! EXPRESSION: 条件 EXPRESSION 不成立。
EXPRESSION1 -a EXPRESSION2: 条件 EXPRESSION1 和 EXPRESSION2 都成立(逻辑与)。
EXPRESSION1 -o EXPRESSION2: 条件 EXPRESSION1 和 EXPRESSION2 有一个成立(逻辑或)

for循环

for((i=1;i<=10;i++));
do
echo $(expr $i \* 3 + 1);
done

for i in $(seq 1 10)
do
echo $(expr $i \* 3 + 1);
done


for i in {1..10}
do
echo $(expr $i \* 3 + 1);
done

字符串截取

STR="1234567890asdfghjkl"
echo "first character ${STR:0:1}"
echo "The three characters ${STR:0:3}"
echo "第四个字符开始显示:${STR:3}"
echo "显示第4到6个字符:${STR:3:3}"
echo "显示最后1个字符:${STR:0-1}"
echo "显示最后3个字符:${STR:0-3}"
echo "从右边数第7个,取3个字符${STR:0-7:3}"

STR=abc123bcd456123abc777 
echo ${STR#*123}    #bcd456123abc777
echo ${STR##*123}   #abc777
echo ${STR%123*}    #abc123bcd456
echo ${STR%%123*}   #abc

date +%Y-%m-%d.%H:%M:%S.%N|cut -c 1-23  //截取前23位,为毫秒
2019-04-25.00:49:31.100

date +%Y-%m-%d.%H:%M:%S.%N|cut -c 1-26  //截取前26位,为微秒
2019-04-25.00:51:15.191520

echo $STR|grep -o "ui.*h"

字符串替换

s1=12345678
s2=abcdefghijk

echo ${s1/78/${s2}}         # 123456abcdefghijk  替换首次出现的78
echo ${s1//78/${s2}}        # 123456abcdefghijk  替换所有78
echo ${s1/#78/${s2}}        # 12345678           替换开头
echo ${s1/%78/${s2}}        # 123456abcdefghijk  替换结尾
echo $s1 | tr '78' $s2      # 123456ab
echo $s1 | sed "s/78/$s2/g" # 123456abcdefghijk

字符串包含

s1=12345678
result=`echo $s1|grep "5678"`
if [[ "$result" != "" ]];then
	echo "包含"
else
	echo "不包含"
fi

参考

笔记 | Bash 中 if 判断选项
shell中常用的变量处理 Shell中for循环的几个常用写法