Shell基础:修订间差异
跳到导航
跳到搜索
(创建页面,内容为“===语法=== ====环境变量==== . ~/.bash_profile ====转义==== *<nowiki>''</nowiki> 单引号,硬转义,所有的shell元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)。 *“” 双引号,软转义,只允许出现特定的shell元字符($,`,\):$用于变量值替换、`用于命令替换、\用于转义单个字符 *\ 反斜杠,转义, 去除其后紧跟的元字符或通配符的特殊意义 …”) |
无编辑摘要 |
||
第89行: | 第89行: | ||
-s filename 如果文件长度不为0,则为真 | -s filename 如果文件长度不为0,则为真 | ||
-h filename 如果文件是软链接,则为真 | -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 | |||
====字符串 子串==== | |||
# 包含 | |||
<nowiki>[[ $string =~ $sub]]</nowiki> | |||
# 开头 | |||
<nowiki>[[ $string = $sub*]]</nowiki> | |||
# 结束 | |||
<nowiki>[[ $string = *$sub]]</nowiki> | |||
# 正则 | |||
<nowiki>[[ $string =~ ^.*$sub.*$]]</nowiki> | |||
<nowiki>[[ $string =~ ^$sub.*$]]</nowiki> | |||
<nowiki>[[ $string =~ ^.*$sub$]]</nowiki> | |||
====字符串 按分隔符取段 ==== | |||
# 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 | |||
==== 日期字符串==== | |||
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) # 须有空格 | |||
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 ==== | |||
[[分类:Develop]] | [[分类:Develop]] | ||
[[分类:Linux]] | [[分类:Linux]] | ||
[[分类:Shell]] | [[分类:Shell]] |
2023年1月19日 (四) 12:07的版本
语法
环境变量
. ~/.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` ## 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
日期字符串
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) # 须有空格 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