shell
c,c#到java,python,js, ts,js都能忍,shell你特么是真的🐕🐕🐕🐕🐕🐕🐕🐕🐕🐕🐕🐕🐕
基础命令
-
dirname filepath 显示上级路径
dirname ./home/project/jiayeli/website
显示 ./home/project/jiayeli
-
$PWD 显示当前路径
-
xargs
-
shift 1|2|3…
shift 1 : 销毁第一个参数,后面差数往前移动1位
https://blog.csdn.net/zhu_xun/article/details/2479623
-
date +’%Y-%m-%d %H:%M:%S’
显示当前系统时间
-
date -d “1 day” +"%Y-%m-%d %H:%M:%S"
系统时间加一天,如果-d 后面的参数为-则为减去对应的时间,后面的day为指定前面数值的单位,-d “-1 month” 意思为当前系统时间减去一个月
-
xargs 将标准输入转为命令行参数
xargs
命令的作用,是将标准输入转为命令行参数。因为linux的很多命令是不接受标准输入的,比如echo$ echo "hello world" | echo #echo 不接受标准输入,会报错 $ echo "hello world" | xargs echo #会输出hello world #上面的代码将管道左侧的标准输入,转为命令行参数hello world,传给第二个echo命令。 $ echo "dira dirb dir3" | xargs mkdir #等同于mkdir dira dirb dir3
-
${BASH-SOURCE-$0} 获取当前脚本的全路径
vim /usr/script/start-zkServers.sh
#!/bin/bash
BIN="${BASH_SOURCE-$0}"
#$BIN = /usr/script/start-zkServers.sh
BIN=${dirname $BIN}
#BIN= /usr/script
shell 传参
$0
当前脚本的文件名
$1 | $2 …
脚本文件后面跟的差数,$1为第一个差数值,$2为第二个,以此类推
$#
传给脚本或函数的差数个数
$?
上一个命令是否执行成功,成功为0,不成功返回非零数值
$$
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
$@
传递给脚本或函数的所有参数。
$*
传递给脚本或函数的所有参数。
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”KaTeX parse error: Expected 'EOF', got '&' at position 8: 1" “ 2 &̲quot; … " …*" 会将所有的参数作为一个整体,以"$1 $2 … n " 的 形 式 输 出 所 有 参 数 ; " n"的形式输出所有参数;" n"的形式输出所有参数;"@" 会将各个参数分开,以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XZ55qBbJ-1620571263782)(C:\Users\17295\AppData\Roaming\Typora\typora-user-images\image-20210331141317848.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tngLUb2Y-1620571263787)(C:\Users\17295\AppData\Roaming\Typora\typora-user-images\image-20210331141356691.png)]
条件控制
判断条件:
-d 是否为目录
-e 是否存在
-f 是否为常规文件
-h 是否为软链接
-L 是否为符合链接文件
-r,-w,-x 是否可读,可写,可执行
-s 是否长度不为0
filename1 -nt filename2 如果 filename1比 filename2新
filename1 -ot filename2 如果 filename1比 filename2旧
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
if else
语法
if [ x ];
then
...
else
...
fi
################################
if [ x ];
then
...
elif[[ x ]];
then
...
else
...
else
...
fi
while 语法
while [ ];
do
...
done
列子
#!bin/bash
#########################################################
##
##
#########################################################
bin="{$BASH_SOURCE-$0}"
bin="`dirname $bin`"
binDir="`cd $bin; pwd`"
logDir=$binDir/../logs
if [! -d "$logDir"];
done
mkdir -p $logDir
fi
if [! -e "$binDir/conf_env.sh"];
done
. "$binDir/conf_env.sh"
fi
if [! -e "$binDir/log-functions.sh"]
done
. "$binDir/log-functions.sh"
fi
if [[ "$KEYTAB" != "" && "$PRINCIPAL" != "" ]];
done
kinit -kt $KEYTAB $PRINCIPAL
if
runInfo="$@"
shName=`echo $0 | xargs basename`
#将差数赋值给变量
while [$# -gt 0]
do
if [$1 = "-m"];
done
shift 1
mode=$1
fi
if [$1 = "-b"];
done
shift 1
sqlName=$1
fi
if [$1 = "-s"];
done
shift 1
startTime=$1
fi
if [$1 = "-e"];
done
shift 1
endTime=$1
fi
shift 1
done
###
实用小脚本
获取执行脚本所在的全路径
BIN="${BASH_SOURCE-$0}"
BIN="${dirname "$BIN"}"
BINDIR="$(cd $BIN; pwd)"
路径中截取指定值
# #从左边匹配,%从右边匹配 ##从左往右匹配到最后一个,%%从右往左匹配到最前一个, #从左往右匹配到第一个,%从右往左匹配到第一个匹配
# ##从左边匹配到最后一个,如 `str##*/` 匹配str字符串中最后一个/,并将左边所有字符删除, `str%%/*`,从右边匹配到左边第一个
# /并删除所有后边的字符
path="/data/disk1/workspace/bigdata_dev/etl/widthtab/sql/init/loadData2kudu.sql"
temp=${path##*/} #loadData2kudu.sql
name=${temp%*.} #loadData2kudu
dirTemp=${path##*/sql/} #init/loadData2kudu.sql
dir=${dirTemp%/*} #init
ssh 远程执行命令块
ssh hostname 后使用 << eof … eof来将eof之间的内容作为子命令,给ssh
EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。
可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。回顾一下< <的用法。当shell看到< <的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串,比如下面的 o_< 。
#!/bin/bash
echo "启动kafka集群"
for i in {1..3}
do
ssh node0$i << o_<
source /etc/profile
if [ $1 == "stop" ]
then
echo "停止node0${i}上的kafka server"
kafka-server-stop.sh
elif [ $1 == "start" ]
then
echo "启动node0${i}上的kafka server"
kafka-server-start.sh -daemon /opt/module/kafka_2.11-2.0.0/config/server.properties
fi
sleep 3
exit
o_<
done