shell小功能备忘

#!/usr/bin/env bash

#========== 获取当前时间戳 ==========#
timestamp=$(date +%s)
echo "当前时间戳:${timestamp}"

#========== 时间戳转日期时间字符串 ==========#
datetime1=$(date -d @"${timestamp}" +'%Y-%m-%d %H:%M:%S')
echo "当前时间(1):${datetime1}"

#========== 直接获取当前日期时间字符串 ==========#
datetime2=$(date +'%Y-%m-%d %H:%M:%S')
echo "当前时间(2):${datetime2}"

#========== 检查文件是否存在 ==========#
filename="/tmp/test.txt"
if [ -f $filename ]; then
  echo "文件[${filename}]存在"
else
  echo "文件[${filename}]不存在"
fi

#========== 检查目录是否存在 ==========#
dirname="/tmp" # 结尾加不加“/”都不影响判断
if [ -d $dirname ]; then
  echo "目录[${dirname}]存在"
else
  echo "目录[${dirname}]不存在"
fi

#========== 获取命令行参数(可缺省) ==========#
# 示例:/tmp/demo.sh -name 张三 -gender 男 -birth 2003
name="匿名"   # 设置name参数缺省值
gender="保密" # 设置gender参数缺省值
birth=1970  # 设置birth参数缺省值
# 获取命令行参数
while [ $# -gt 0 ]; do
  case $1 in
  -name)
    name=$2
    shift
    ;;
  -gender)
    gender=$2
    shift
    ;;
  -birth)
    birth=$2
    shift
    ;;
  *)
    echo "无法识别参数:$1"
    exit 1
    ;;
  esac
  shift
done
echo "俺叫${name}${gender}),出生于${birth}年。"

#========== 自增运算 ==========#
counter=1024
((counter++)) # 自增1,注意必须用两对()围起来
echo "counter = ${counter}"
((counter += 5)) # 自增5,注意必须用两对()围起来
echo "counter = ${counter}"

#========== 数组的使用 ==========#
array=('Jacky' 'Andy' 'Leon' 'Aaron')
length=${#array[@]}
echo "数组长度:${length}"
echo "张学友 <===> ${array[0]}"
echo "刘德华 <===> ${array[1]}"
echo "黎 明 <===> ${array[2]}"
echo "郭富城 <===> ${array[3]}"
# 遍历数组元素
key=0
for value in "${array[@]}"; do
  echo "array[$key] => $value"
  ((key++))
done

#========== 关联数组的使用 ==========#
declare -A profile
profile['name']='李四'
profile['gender']='女'
profile['birth']=2004
echo "俺叫${profile['name']}${profile['gender']}),出生于${profile['birth']}年。"

#========== 打包指定目录 ==========#
dirname='/tmp/test/' # 要打包的目录
dirname=${dirname%/} # 去掉结尾的“/”
if [ -d $dirname ]; then
  # 文件名为:/tmp/test.年月日时分秒.tar.gz
  datetime=$(date +'%Y%m%d%H%M%S')
  filename="${dirname}.${datetime}.tar.gz"

  # 执行打包命令
  cmd="tar -zcPf ${filename} ${dirname}"
  if $cmd; then
    echo '打包成功'
  else
    echo '打包失败'
  fi
else
  echo "打包失败:目录[${dirname}]不存在"
fi

#========== 自定义函数 ==========#
multiplication() {
  local num1=$1         # 参数1
  local num2=$2         # 参数2
  echo $((num1 * num2)) # 返回两数的积,注意是用echo,而不是用return
}
num1=3
num2=7
result=$(multiplication $num1 $num2)
echo "${num1} * ${num2} = ${result}"

#========== for的使用 ==========#
for ((i = 0; i < 10; i++)); do
  echo "for循环 - 第${i}次"
done

#========== case的使用(相当于PHP的switch) ==========#
echo -e "请输入任意月份:\c"
read -r month # 这里会发生阻塞,直到用户输入内容
case ${month} in
1 | 3 | 5 | 7 | 8 | 10 | 12)
  echo "${month}月是大月"
  ;; # 这里两个分号相当于break
4 | 6 | 9 | 11)
  echo "${month}月是小月"
  ;;
2)
  echo "${month}月既不是大月,也不是小月"
  ;;
*) # 这里的星号相当于default
  echo "您输入的月份[${month}]不合法,必须为1~12"
  ;;
esac

#========== while的使用 ==========#
counter=0
while true; do
  # -lt表示小于(less than)
  if [ $counter -lt 5 ]; then
    echo "while循环 - 第${counter}次"
    sleep 1 # 休眠1秒钟
    ((counter++))
  else
    break
  fi
done

#========== 判断两个字符串是否相等 ==========#
str1='hello'
str2='world'
if [ ${str1} == ${str2} ]; then
  echo 'str1和str2相等'
else
  echo 'str1和str2不相等'
fi

#========== 常用的数值比较条件表达式 ==========#
# -eq:等于(equal)
# -ne:不等于(not equal)
# -gt:大于(greater than)
# -ge:大于或等于(greater than or equal)
# -lt:小于(less than)
# -le:小于或等于(less than or equal)

#========== 说明 ==========#
# [root@localhost ~]# /tmp/demo.sh -name 张三 -gender 男 -birth 2003

Copyright © 2024 码农人生. All Rights Reserved