Shell基础:修订间差异

来自牛奶河Wiki
跳到导航 跳到搜索
无编辑摘要
第37行: 第37行:
  DATEID =`date -dyesterday +%Y%m%d`
  DATEID =`date -dyesterday +%Y%m%d`
  DATEID =`date -dtomorrow +%Y%m%d`
  DATEID =`date -dtomorrow +%Y%m%d`
# date "+%Y-%m-%d %H:%M:%S `echo "abc"`"      # 比较常见的用法
   
   
  ## m02(10.10.137.188)
  ## m02(10.10.137.188)
第135行: 第136行:
  echo $STR1 |cut -d ' ' -f2
  echo $STR1 |cut -d ' ' -f2
  echo $STR1 |cut -c 1-4
  echo $STR1 |cut -c 1-4
==== 日期字符串====
date +%Y%m%d%H%M%S
date '+%Y-%m-%d %H:%M:%S.%N'
DAY_Y=$(date -d 'yesterday' +%Y%m%d)          # yesterday
# date "+%Y-%m-%d %H:%M:%S `echo "abc"`"      # 比较常见的用法
====计算 ====
====计算 ====
  V1 = $(expr $1 - $2)        # 须有空格
  V1 = $(expr $1 - $2)        # 须有空格

2023年1月19日 (四) 12:09的版本

语法

环境变量

. ~/.bash_profile

转义

  • '' 单引号,硬转义,所有的shell元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)。
  • “” 双引号,软转义,只允许出现特定的shell元字符($,`,\):$用于变量值替换、`用于命令替换、\用于转义单个字符
  • \ 反斜杠,转义, 去除其后紧跟的元字符或通配符的特殊意义

  *在““中不用使用转义,但再次使用时,变量应该加”“,如:

c="a * b"
echo "$c"

与或非

  • 与 && 或: -a
  • 或 || 或: -o
  • 非 !

根据结果分支

grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"

输出

  • 错误(stderr)信息转为标准输出

2>&1

  • 标准输出(stdout)转为文件

1>/tmp/log.txt

代码

BASE

## 2022/08/29 16:23:01
TIMEID=`date '+%Y/%m/%d %H:%M:%S'`
DATEID=`date +%Y%m%d`
DATEID =`date -dyesterday +%Y%m%d`
DATEID =`date -dtomorrow +%Y%m%d`
# date "+%Y-%m-%d %H:%M:%S `echo "abc"`"      # 比较常见的用法

## m02(10.10.137.188)
HOST=`hostname`
IP=`ping $HOST -c1|xargs|awk -F')' '{print $1}'|awk -F'(' '{print $2}'`
echo "$HOST($IP)"

命令行参数判断

if (( $# >= 1 )); then
    YM=$1
else
    echo $0 'YM=yyyymm'
    exit 1
fi
YY=`echo $YM |cut -c 1-4`

输入

if [ "$1" == "" ];then
    echo "Not Parameter"
fi
if [ "$1" == "" ]; then
    CS=1
#elif … ; then
else
    CS=$1
fi

数值比较

if ((${PS} > 0)); then
   echo "Task: $CMD exist."
   exit 1
else
   echo OK
fi

字符比较

if [ "$HASH_FN" == "$HASH_FN_OLD" ];then
    echo "${FN} & ${FN_OLD} Hash Some."
else
    echo "Backup ${HASH_FN} Finished."
fi

file or path exist

## if file exist, run
[ -f /etc/profile ] && source /etc/profile
# if path not exist, create
[ ! -d $VPATH ] && mkdir -p $VPATH

-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真

按行读文件

while read LN
do
    echo ${LN}
done < ${LN_NAME}

cat ${LN_NAME} | while read LN
do
    echo $LN
done

for FN in ${LN_NAME}
do
    echo ${FN}
done

遍历当前目录下的文件

for FN in ${FILENAME}*
do
    echo ${FN}
done

遍历当前目录下的目录

find /u01/* -maxdepth 0 -type d
# 遍历当前目录下的文件
find /u01/* -maxdepth 0 -type f

字符串 子串

# 包含
[[ $string =~ $sub]]
# 开头
[[ $string = $sub*]]
# 结束
[[ $string = *$sub]]

# 正则
[[ $string =~ ^.*$sub.*$]]
[[ $string =~ ^$sub.*$]]
[[ $string =~ ^.*$sub$]]

字符串 按分隔符取段

# a bc 1 --> a bc
STR1=${STR1% *}--> a bc
STR1=${STR1%% *}  --> a
#  a bc 1 --> bc 1
STR1=${STR1#* }
STR1=${STR1##* } --> 1
# cut
echo $STR1 |cut -d ' ' -f2
echo $STR1 |cut -c 1-4

计算

V1 = $(expr $1 - $2)         # 须有空格
let V1=$1-$2                 # 须无空格

计算主机线程数-10

threads=$(expr `cat /proc/cpuinfo |grep processor|wc -l` - 10)
let c=`cat /proc/cpuinfo |grep processor|wc -l`-10

特殊字符

PA=$(echo -ne '\004')

参数

管道

read VAR1                    # 可从标准输入或管道接收

循环

CS=2
for (( i=1; i<=${CS}; i++ ))
do
   echo $i
done

sleep

time sleep 0.030

real    0m0.032s
user    0m0.000s
sys     0m0.002s

LOG Format