bash
(1)输入定向到shell脚本。该方式用输入重定向方式让shell从给定文件中读入命令行,并进行相应处理。其一般形式为:
$bash < 脚本名
例如:
$bash <ex1
shell从文件ex1中读取命令行,并执行他们。当shell到达文件末尾时,终止执行,并把控制返回到shell命令状态。此时,脚本名后面不能带参数。
(2)以脚本名作为bash参数
$bash 脚本名 [参数]
例如:
$bash ex2 /user/meng /user/zhang
如果以目前shell(以.表示)执行一个脚本,则可使用如下简便形式:
$. 脚本名 [参数]
它以脚本名作为shell的命令行参数,这种方式可用来进行程序调试。
(3)将shell脚本加上可执行权限,可在提示符下直接执行。
chmod +x /mnt/ex3
/mnt/ex3 [参数]
便可直接执行
2.引号
‘’:单引号括起来的字符都作为普通字符出现
“”:双引号括起来的字符(除了\,`,$)均可作为普通字符对待.$:变量替换。\:转义(只有后面是$,`,”,\时,\才是转义字符)
` :倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令,并以它的标准输出结果取代整个倒引号部分。但要注意:嵌套使用时内层的倒引号必须用反斜线将其转义。
3.注释
(1)shell程序中以#开头的正文行表示注释
(2)shell脚本第一行以#!开头的,则#!后跟的字符串就是shell的绝对路径名,为解释器。
对于 C shell脚本,第一行通常是:#!/bin/csh
对于bash脚本,第一行通常是#!/bin/bash或#!/bin/sh
这说明,该脚本是用哪一种shell编写的,从而应调用相应的解释程序予以执行。
4.预先定义的特殊变量
在shell中,,预先定义了几个有特殊含义的shell变量,他们的值只能由shell根据实际情况来赋值,而不能由用户重新设置。
(1)$# 表示命令行上参数的个数,但不包含shell脚本名本身。
(2)$? 表示上一条命令执行后的返回值(执行成功为0)
(3)$$ 表示当前进程的进程号(即PID)
(4)$! 表示上一个后台命令对应的进程号,是由1~5位数字构成的数字串
(5)$- 是由当前shell设置的执行标志名组成的字符串。
(6)$* 表示在命令行中实际给出的所有实参字符串,它并不仅限于9个实参。
(7)[email protected] 它与$*功能基本相同,表示在命令行中给出的所有实参。
如:对date的显示,$* 显示一整行,[email protected]则把date每部分分开换行显示。
5.加减乘除
6.for循环
一.解释器
[[email protected] ~]# vim /mnt/bash.sh
[[email protected] ~]# chmod +x /mnt/bash.sh
[[email protected] ~]# /mnt/bash.sh
hello
[[email protected] ~]# cat /mnt/bash.sh
#!/bin/sh ##这是个解释器,不能乱写
echo hello
[[email protected] ~]# vim /mnt/bash.sh
[[email protected] ~]# /mnt/bash.sh ##解释方式是错的
-bash: /mnt/bash.sh: /etc: bad interpreter: Permission denied
[[email protected] ~]# sh /mnt/bash.sh ##加了解释方式,可以执行
hello
[[email protected] ~]# cat /mnt/bash.sh
#!/etc
echo hello
[[email protected] ~]# vim /mnt/bash.sh
[[email protected] ~]# /mnt/bash.sh
hello
二.双引号/单引号/反斜线
[[email protected] ~]# echo “”$5″”
[[email protected] ~]# echo “\'”$5″\'”
\’\’
[[email protected] ~]# echo “\”$5\””
“”
[[email protected] ~]# echo “\”\$5\””
“$5”
[[email protected] ~]# echo \'”$5″\’
“$5”
三.ping主机是否能ping通
#!/bin/bash
for MUN in {1..10}
do
ping -c1 -w1 172.25.254.$MUN &> /dev/null && echo 172.25.254.$MUN is up || echo 172.25.254.$MUN is down
done
完整版:
当没有输入参数时从键盘读入
#!/bin/bash
if [ “$#” -eq “0” ]
then
read -p “please give me an ip: ” $1
fi
ping -c1 -w1 $* &>/dev/null && echo $* is up || echo $* is down
四.倒计时3分10秒
#!/bin/bash
MIN=3
for ((SEC=10;SEC>=0;SEC–))
do
while [ “$SEC” -eq “0” -a “$MIN” -eq “0” ]
do
echo “TIME is END “
exit 0
done
while [ “$SEC” -eq “0” -a “$MIN” -gt “0” ]
do
echo -n “After ${MIN}m${SEC}s is end “
sleep 1
echo -ne “\r \r”
((MIN–))
SEC=59
done
echo -n “After ${MIN}m${SEC}s is end “
echo -ne “\r
\r”
sleep 1
done
五.把/etc/*.conf 文件备份到/mnt目录下,并根据当时时间创建目录
#!/bin/bash
BACKDIR=etconfig-`date +%Y-%m-%d-%S`
mkdir -p /mnt/$BACKDIR
cp /etc/*.conf /mnt/$BACKDIR
六.备份数据库
#!/bin/bash
BACKDIR=time-`date +%Y-%m-%d-%S`
mkdir -p /mnt/database$BACKDIR
for DB in `mysql -uroot -pfentiao -e “show databases;” -N -E |grep -E \’\*|schema$\’ -v`
do
echo “Backing up $DB”
mysqldump -uroot -pfentiao $DB > /mnt/database$BACKDIR/${DB}.dump
done
echo “success!”
for DBDUMP in /mnt/database$BACKDIR/*
do
SIZE=$(stat –printf “%s\n” $DBDUMP)
echo “$DBDUMP
$SIZE”
done
精简版:
#!/bin/bash
for DB in `mysql -uroot -pfentiao -e “show databases;” -N -E |grep -E \’\*|schema$\’ -v`
do
DBNAME=$DB-`date +%Y-%m-%d-%S`
echo “Backing up $DB”
mysqldump -uroot -pfentiao $DB > /mnt/$DBNAME
SIZE=`stat –printf “%s\n” /mnt/$DBNAME`
echo “/mnt/$DBNAME $SIZE”
done
七.显示ip信息
(1)只满足正常输入
[[email protected] ~]# vim /mnt/show_ip.sh
[[email protected] ~]# /mnt/show_ip.sh eth1
please give me a interface:
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 52:54:00:0d:1e:46 txqueuelen 1000 (Ethernet)
RX packets 324310 bytes 31546800 (30.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 302333 bytes 26607948 (25.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[[email protected] ~]# vim /mnt/show_ip.sh
[[email protected] ~]# cat /mnt/show_ip.sh
#!/bin/bash
read -p “please give me a interface: ” $1
ifconfig $1
或
[[email protected] ~]# vim /mnt/show_ip.sh
[[email protected] ~]# /mnt/show_ip.sh
please give me a interface: eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 52:54:00:0d:1e:46 txqueuelen 1000 (Ethernet)
RX packets 361925 bytes 35244977 (33.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 342854 bytes 30165866 (28.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[[email protected] ~]# /mnt/show_ip.sh
please give me a interface: fsr
fsr: error fetching interface information: Device not found
[[email protected] ~]# cat /mnt/show_ip.sh
#!/bin/bash
read -p “please give me a interface: ” A
B=ifcfg-$A
for B in `ls /etc/sysconfig/network-scripts | grep ifcfg`
do
ifconfig $A
break
done
(2)考虑错误输入情况,并提示可以输入的参数
八.判断一个文件是否存在