Shell基础:修订间差异

来自牛奶河Wiki
跳到导航 跳到搜索
→‎BASE
 
(未显示1个用户的4个中间版本)
第8行: 第8行:


====环境变量====
====环境变量====
. ~/.bash_profile
. ~/.bash_profile


====转义====
====转义====
*<nowiki>''</nowiki> 单引号,硬转义,所有的shell元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)。
*<nowiki>''</nowiki> 单引号,硬转义,所有的shell元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)。
*“” 双引号,软转义,只允许出现特定的shell元字符($,`,\):$用于变量值替换、`用于命令替换、\用于转义单个字符
*“” 双引号,软转义,只允许出现特定的shell元字符($,`,\):$用于变量值替换、`用于命令替换、\用于转义单个字符
第21行: 第20行:


====与或非====
====与或非====
*与 && 或: -a
*与 && 或: -a
*或 || 或: -o
*或 || 或: -o
第27行: 第25行:


====根据结果分支====
====根据结果分支====
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"


====输出====
====输出====
*错误(stderr)信息转为标准输出
*错误(stderr)信息转为标准输出
2>&1
2>&1
*标准输出(stdout)转为文件
*标准输出(stdout)转为文件
1>/tmp/log.txt
1>/tmp/log.txt
 
==== 将字符串作为shell命令执行 ====
res=`eval "${CMD}"`
==== 将结果作为字符串赋值给变量 ====
res=$(echo $ABC)
REDIS_PASSWORD=$(kubectl get secret --namespace kube-nodelm redis -o jsonpath="{.data.redis-password}" | base64 -d)


===代码===
===代码===
====Info====
## m02(10.10.137.188)
HOST=`hostname`
IP=`ping $HOST -c1|xargs|awk -F')' '{print $1}'|awk -F'(' '{print $2}'`
- OR -
IP=`ifconfig | grep 'inet ' | grep -v 'inet 127.0.0.1 ' |awk '/broadcast|Bcast/' | awk '{print $2}'`
echo "$HOST($IP)"


====时间====
====时间====
第51行: 第62行:
   
   
  # date "+%Y-%m-%d %H:%M:%S `echo "abc"`"      # 比较常见的用法
  # date "+%Y-%m-%d %H:%M:%S `echo "abc"`"      # 比较常见的用法
====Info====
## m02(10.10.137.188)
HOST=`hostname`
IP=`ping $HOST -c1|xargs|awk -F')' '{print $1}'|awk -F'(' '{print $2}'`
- OR -
IP=`ifconfig | grep 'inet ' | grep -v 'inet 127.0.0.1 ' |awk '/broadcast|Bcast/' | awk '{print $2}'`
echo "$HOST($IP)"


====命令行参数判断====
====命令行参数判断====

2024年7月29日 (一) 11:05的最新版本

Shell 是一个用 C 语言编写的程序,是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell。

语法

环境变量

. ~/.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

将字符串作为shell命令执行

res=`eval "${CMD}"`

将结果作为字符串赋值给变量

res=$(echo $ABC)
REDIS_PASSWORD=$(kubectl get secret --namespace kube-nodelm redis -o jsonpath="{.data.redis-password}" | base64 -d)

代码

Info

## m02(10.10.137.188)
HOST=`hostname`
IP=`ping $HOST -c1|xargs|awk -F')' '{print $1}'|awk -F'(' '{print $2}'`
- OR -
IP=`ifconfig | grep 'inet ' | grep -v 'inet 127.0.0.1 ' |awk '/broadcast|Bcast/' | awk '{print $2}'`
echo "$HOST($IP)"

时间

## 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`
DATEID=`date -d "$date last month" +%Y%m%d`
DATEID=`date -d "$date next month" +%Y%m%d`

DATEID=`date -d "$date -1 day" +%Y%m%d`
DATEID=`date -d "$date -1 month" +%Y%m%d`

# date "+%Y-%m-%d %H:%M:%S `echo "abc"`"      # 比较常见的用法

命令行参数判断

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

current directory

curdir=$( pwd )

curdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
BASH_SOURCE[0] 等价于 BASH_SOURCE, 取得当前执行的 shell 文件所在的路径及文件名。

上一级目录
predir="$(
   cd ..
   pwd
)"

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

读变量列表

HN_L=(
 192.168.0.110-node01
 192.168.0.120-node02
 192.168.0.130-node03
)

for F in ${HN_L[*]};do
  HN=`echo $F|cut -d '-' -f1`
  ND=`echo $F|cut -d '-' -f2`
  echo ${HN} ${ND}
done

循环

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

字符串 子串

# 包含
[[ $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                    # 可从标准输入或管道接收

sleep

time sleep 0.030

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

LOG Format