shell -- 贝壳语言备忘录

shell

c,c#到java,python,js, ts,js都能忍,shell你特么是真的🐕🐕🐕🐕🐕🐕🐕🐕🐕🐕🐕🐕🐕

基础命令

  1. dirname filepath 显示上级路径

    dirname ./home/project/jiayeli/website

    显示 ./home/project/jiayeli

  2. $PWD 显示当前路径

  3. xargs

    https://blog.csdn.net/xuzhangze/article/details/80931542?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

  4. shift 1|2|3…

    shift 1 : 销毁第一个参数,后面差数往前移动1位

    https://blog.csdn.net/zhu_xun/article/details/2479623

  5. date +’%Y-%m-%d %H:%M:%S’

    显示当前系统时间

  6. date -d “1 day” +"%Y-%m-%d %H:%M:%S"

    系统时间加一天,如果-d 后面的参数为-则为减去对应的时间,后面的day为指定前面数值的单位,-d “-1 month” 意思为当前系统时间减去一个月

  7. xargs 将标准输入转为命令行参数

    xargs命令的作用,是将标准输入转为命令行参数。因为linux的很多命令是不接受标准输入的,比如echo

    image-20210402152824065
    $ 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
    
    
  8. ${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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值