<< 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"
我们习惯的格式