shell

数字大小比较

整数比较

1
2
3
4
5
6
#!/bin/bash
if [ $1 -gt $2 ];then 
  echo "参数$1大于参数$2"
else 
  echo "参数$1小于参数$2"
fi

数字判断一些命令:

  • -gt:大于
  • -lt:小于
  • -eq:等于
  • -ne:不等于
  • -ge:大于等于
  • -le:小于等于

小数与整数之间的比较

1
2
3
4
a=1.6
b=6.1
c=`echo "$a > $b" | bc`
# 如果双引号内执行结果为真,c的值就是1,否则c的值就是0.

可以使用的比较符号:

< > == >= <=

字符串比较

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
a="1"
b="2"

if [[ "$a" == "$b" ]]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi
[[ "string1" == "string2" ]] && echo "Equal" || echo "Not equal"
# 判断字符串是否为空
if [[ -z $a ]]; then
  echo "String is empty."
fi
# 正则表达式
if [[ $a =~ .*Linux.* ]]; then
  echo "It's there."
fi
# 匹配*
if [[ $a == *"Linux"* ]]; then
  echo "It's there."
fi

在文件指定行后面加一列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 例如需要在.ansible.cfg中添加deprecation_warnings = False的配置
if [ -f "$HOME/.ansible.cfg" ];then
  cp "$HOME/.ansible.cfg" "$HOME/.ansible.cfg.bak"
  set +e # why:grep 没有的时候,返回码不是0,需要忽略这个错误
  deprecation_warnings=$(cat "$HOME/.ansible.cfg"|grep "deprecation_warnings = False"|wc -l)
  set -e
  if [  $deprecation_warnings -eq 0 ];then
    sed -i '/defaults]/a\\deprecation_warnings = False' $HOME/.ansible.cfg
  fi
fi

grep 反向过滤

1
2
# 过滤掉包含abc的行
cat a.log|grep -v "abc"

去除字符串的前后空格

1
2
3
4
5
echo " A B C " | awk '$1=$1'
# 这个方法是0的时候,就没有输出,要注意
echo ' A B C ' | awk '{sub(/^ */, "");sub(/ *$/, "")}1'
echo ' A B C ' | sed -e 's/^[ ]*//g' | sed -e 's/[ ]*$//g'
eval echo " A B C "

为什么'$1=$1'有问题Changing Fields (The GNU Awk User’s Guide)Assignment Ops (The GNU Awk User’s Guide)Why does awk behave differently for $1 if the value is 0 (number zero)? - Unix & Linux Stack Exchange

$1赋值给$1的时候,awk会通过将通过默认OFS(默认为空格)连接字符串重新计算$0

'$1=$1'是一个赋值操作,如果是0的话,这个表达式为false,所以不会执行print

vim中文乱码

将下述内容放到$HOME/.vimrc

1
2
3
4
syntax on
set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1
set enc=utf8
set fencs=utf8,gbk,gb2312,gb18030

使用指令修复json

如果json因为修改失败,多了逗号,可以使用如下指令

1
yq eval -o json test.json |tee test.json

生成随机字符串

1
2
3
4
head -c 32 /dev/random | base64 # 会阻塞
head -c 32 /dev/urandom | base64 # 不会阻塞
openssl rand -hex 10
echo $RANDOM # 得到的这个随机数是介于 0~32767 之间的一个整数

查看操作系统信息

1
2
3
uname -a
cat /etc/os-release
cat /proc/cpuinfo #cup信息

crontab日志

1
sudo tail -f -n 200 /var/log/syslog|grep CRON

ansible

ansible取其他主机的变量

1
2
# 使用ansible中的A主机的B变量,通常用于目标主机并不存在于A的hosts中的情况
"{{hostvars[groups['A'][0]]['B']}}"

ansible按照shell结果选择执行分支

使用command将结果注册为变量,判断变量的状态Return Values — Ansible Documentation

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
- name: exec
  hosts: A
  tasks:
    - name: Ensure a exit
      command: curl http://{{inventory_hostname}}:8080/healthz
      register: healthz
      failed_when: False

    - name: exec run
      shell: |
                docker run
      when: healthz.rc != 0

git

删除远程仓库文件,不删除本地文件

1
2
3
git rm -r --cached 文件/文件夹名称
git commit -m "提交说明"
git push origin master

kubectl

手动运行一个cronjob

1
kubectl create job --from=cronjob/<name of cronjob> <name of job>