shell5(一些积累到的东西)

<< EOF >>

这个东西能输入多行。

当 shell遇到 <<这个东西就会认为后边的是一个分割符。遇到这个就会结束。而之前的东西都会被当做是输入。 所以可以做很多事情。

多行输入

[root@localhost ~]# vim eoftest.sh
#!/bin/bash

cat << END >> txt.txt 
11111
22222
33333
END


[root@localhost ~]# ./eoftest.sh 
[root@localhost ~]# cat txt.txt 

11111
22222
33333

送命令。

mysql -u root -p123456 << EOF >> /dev/null
	create database db1;
EOF

不过对于mysql来说有更好用方法  mysql -e 可以直接在脚本中写sql语句。

例如:

mysql -e"create database testdb"
创建数据库

mysql -e"use testdb;create table tt1(id int, name char(20));"
mysql testdb -e "create table tt2(id int,name char(20))"
这两个都是在库中建表。

mysql -e 在脚本中可以直接加变量,但是要有双引号。

栗子:

database="test_db"

create_table="create table test_table1(id int , name char(20))"

mysql -h 192.168.1.1 -P 3306 -u root -p123456 ${database} -e"${create_table}" 

-h  指定远程主机
-P  指定端口
-p  指定密码
-u  指定登录用户
-e  加SQL语句
${database} 因为是对表操作,要先指定数据库。要不就要像上边的那样写。

这就可以直接在脚本中创建数据库。

不过最好还是不要这么写,会暴露密码。

还有很多命令都可以这样送,对这些命令来说就,后边的相当于是标准输入嘛。

注释代码

: << COMMENTBLOCK
   shell脚本代码段
COMMENTBLOCK

用这个可以注释脚本的代码片段。

中间的脚本不会执行。

sed中引用变量

sed中是不能用变量的但是一定要使用就在双引号里用。

[root@kickstart-server ~]# IP=172.16.12.222
[root@kickstart-server ~]# sed -i '/NETMASK/aIPADDR='"${IP}"'' ifcfg-ens33
//这样才行。

//错误示范:
[root@kickstart-server ~]# sed -i '/NETMASK/aIPADDR=${IP}' ifcfg-ens33 
[root@kickstart-server ~]# sed -i '/NETMASK/aIPADDR="${IP}"' ifcfg-ens33

//结果
ONBOOT=yes
IPADDR=172.16.12.103
NETMASK=255.255.0.0
IPADDR=172.16.12.222    <-----正确的引用变量方法
IPADDR="${IP}"			<-----错误2
IPADDR=${IP}			<-----错误1
GATEWAY=172.16.0.254                     

另外的方法:

1、eval sed ’s/$IP1/$IP/’ filename
2、sed "s/$IP1/$IP/" filename
3、sed ’s/$IP1/$IP/’ filename 
4、sed s/$IP1/$IP/ filename
while中的一些误区:
while read r
do
	##r 就是IP
	sshpass -p 123456 ssh -o StrictHostKeyChecking=no user1@${r} touch /tmp/f1
done  < /root/ip.txt

上边这个只会执行一次然后就停止了。

ssh会吃掉剩下的,要这样做才行。

sshpass -p 123456 ssh -o StrictHostKeyChecking=no user1@${r} touch /tmp/f1 < /dev/null

后边加上这个/dev/null

while read line
do
	read -p "XXXXX" name
	echo ${name}
done
//这么用时read -p这个不会读,因为最外层的while已经有了个read

//建议用这样
while read line
do
name1=$(echo $line | awk '{print $1}')
name2=$(echo $line | awk '{print $2}')
done

//额外写个文件,文件中这样写:
name1   name2

shell中#,##,#,##,% *,%% *的含义及用法
https://blog.csdn.net/jiezi2016/article/details/79649382

关于随机密码

习惯用熵池。

#!/bin/bash

for i in `seq 1 2`
do
    id user$i
    if  [ $? -ne 0 ]
    then
        useradd user$i
        password=`</dev/urandom tr -dc _A-Z-a-z-0-9|head -c5;echo` //包含大小写字母数字下划线的密码,-c5取5个
        echo $password | passwd user$i --stdin
        echo -e "user$i\t$password" >> userlist.txt
    else
        echo  "user$i is haved "
    fi
done
切换用户 ,以另一个用户身份执行操作
#!/bin/bash
su - test <<EOF
pwd;
exit;
EOF


su - test -c "pwd" 
这个只能是一条

切换用户只执行一条命令的可以用: su - oracle -c command
切换用户执行一个shell文件可以用:su - oracle -s /bin/bash shell.sh
date 时间的记录

date +%s 时间毫秒。
date +"%Y-%m-%d" 我们习惯的格式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值