炒沙作縻终不饱,缕冰文章费工巧。这篇文章主要讲述#yyds干货盘点#linux shell 脚本,将变量拼接到命令中。相关的知识,希望能为你提供帮助。
@[TOC]
有这个一个场景:需要写多个定时任务提交到yarn,这些任务都是同一时间启动的。原先的做法是,所有的启动命令都使用linux的crontab,但是因为任务过多,所以crontab里的内容越来越多,不好管理,改时间也不方便,所以这里写脚本进行管理。
同时为了方便查看任务,每个任务的名字,将当前时间的时分拼接到yarn的任务的name上。
linux拼接字符串
这个就涉及到了linux获取当前时间和拼接字符串的问题了。本人不是主攻这个方向,所以就是边百度边写,获取时间:
time1=$(date"+%Y_%m_%d-%H_%M")
echo $time1
linux拼接字符串的规则:
#!/bin/bash
name="Shell"
url="http://c.biancheng.net/shell/"
str1=$name$url#中间不能有空格
str2="$name $url"#如果被双引号包围,那么中间可以有空格
str3=$name": "$url#中间可以出现别的字符串
str4="$name: $url"#这样写也可以
str5="$nameScript: $urlindex.html"#这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
运行结果:
Shellhttp://c.biancheng.net/shell/
Shell http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
ShellScript: http://c.biancheng.net/shell/index.html
对于第 7 行代码,$name 和 $url 之间之所以不能出现空格,是因为当字符串不被任何一种引号包围时,遇到空格就认为字符串结束了,空格后边的内容会作为其他变量或者命令解析。
命令行里拼接字符串 获取到date了,拼接进命令行就行。
这里先举个其他例子:
name="abc"
touch /home/$name
这样等同于
touch /home/abc
。如果涉及到拼接的字符串前后都还有内容:
name="abc"
touch /home/$name123
这样等同于
touch /home/abc123
。我碰到的问题 按理说万事俱备,只欠东风。我将命令写成了:
time1=$(date"+%Y_%m_%d-%H_%M")
... "name":"abc$time1" ...
但是执行以后去yarn的ui去看,任务名字不是我想像的前缀加时间,而是abc$time1,非常郁闷,想不通,开始找哪里出问题了。
最后发现,问题出在了引号上。
name那条语句,是被单引号括起来的,shell脚本中,在单引号里,变量是不被替换的,问题出在这里了。那么如何解决呢?
time1=$(date"+%Y_%m_%d-%H_%M")
... "name":"abc$time1" ...
把变量排除在单引号之外即可。
单引号的一些注意的地方 在单引号中的任何字符都会原样输出,单引号字符串中的变量是无效的。
#!/bin/bashname="abc"
echo 123 $name echo 在单引号中使用\\"$name\\"也是没有用的哦
输出:
123 $name
在单引号中使用\\"$name\\"也是没有用的哦
顺便说一下,shell脚本中字符串可以使用双引号、单引号、不使用引号来定义。在不使用引号的情况下字符串中间不可以有空格。
#!/bin/basha="aaa";
b=bbb;
c=cccecho $a
echo $b
echo $c
【#yyds干货盘点#linux shell 脚本,将变量拼接到命令中。】 执行脚本输出:
aaa
bbb
ccc
推荐阅读
- 多线程加锁#yyds干货盘点#
- #yyds干货盘点# linux加入域环方法
- K8SCentOS7.x通过kubeadm安装Kubernetes1.15.2
- centos 添加多个pip源
- SangFor授权上架网络配置(AC12.0.46)
- JavaScript之预编译学习(内含多个面试题) #yyds干货盘点#
- 使用VM虚拟机安装CentOS-stream系统
- 带你了解HTML基本标签的使用#yyds干货盘点#
- 微软与维珍航空圣诞节福利狂送Windows 8平板