1.BASH脚本基础
.BASH = GNU Bourne-Again Shell,BASH 是 GNU 组织开发和推广的一个项目。
.Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具所无法实现的功能。
2.创建新的shell脚本
.脚本的第一行应为: #!/bin/bash(cat /etc/shells 查看脚本可以运行的环境有哪些)
.脚本的运行
<1>chmod +x example.sh
/mnt/example.sh
<2>sh example.sh
.将文件放置在用户的$PATH的目录中 ~/bin – 用于用户的私有程序
/usr/local/bin – 本地开发,系统上的其他人使用的脚本
/usr/local/sbin - 本地开发,由root使用的脚本
.脚本调试
<1>bash -x example.sh
<2>#!/bin/bash -x
3.引用和转义
引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。
弱引用"":将字符串放置在双引号中,保留字符串中所有字符的文字值,$ ` \和!字符除外。换言之,变量扩展和命令扩展在双引号内仍起作用。
强引用'':将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展。
转义\:\是转义字符。它保留了下一个字符的文字值。(例如,\$PATH是确切的字符串$PATH,而不是PATH变量的内容。)
[root@mail-qq ~]# echo "!"
-bash: !: event not found
[root@mail-qq ~]# echo "`"
>
[root@mail-qq ~]# echo "$"
$
[root@mail-qq ~]# echo "\"
>
[root@mail-qq ~]# echo my hostname is $(hostname) ##$()=``
my hostname is mail-qq.qq.com
[root@mail-qq ~]# echo "*** my hostname is `hostname` ***"
*** my hostname is mail-qq.qq.com ***
[root@mail-qq ~]# echo '!"`$'
!"`$
[root@mail-qq ~]# echo '*** my hostname is `hostname` ***'
*** my hostname is `hostname` ***
[root@mail-qq ~]# echo ''hello,world'' ##就近匹配
hello,world
[root@mail-qq ~]# echo "'hello,world'"
'hello,world'
[root@mail-qq ~]# echo "''hello''"
''hello''
[root@mail-qq ~]# echo "\hello"
\hello
[root@mail-qq ~]# echo "\\hello"
\hello
[root@mail-qq ~]# echo "\\\hello"
\\hello
[root@mail-qq ~]# echo \\\hello\\\
> #
\hello\#
4.算术运算
算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。
运算符
++ 自增
-- 自减
- 减法
+ 加法
* 乘法
/ 除法
** 幂运算
% 余数
+= 加等 ## n+=1等价于n=n+1
-= 减等
Shell计算命令:
用$[]表示数学运算。
用expr表示数学运算。
用let指示数学运算。
用(())表示数学运算。
用[]进行比较:-lt小于 -gt大于 -le小于等于 -ge大于等于 -ne不等于 -eq等于
[root@mail-qq ~]# echo $[1+2]
3
[root@mail-qq ~]# echo $[1]
1
[root@mail-qq ~]# a=1
[root@mail-qq ~]# echo $[$[$a+1]*2]
4
[root@mail-qq ~]# echo `expr 1+2`
1+2
[root@mail-qq ~]# echo $( expr 1+2)
1+2
[root@mail-qq ~]# let a=1+2
[root@mail-qq ~]# echo $a
3
[root@mail-qq ~]# echo `expr 2 \* 3` ## *为特殊字符,需要用\转义
6
[root@mail-qq ~]# [ "1" = "2" ] && echo yes || echo no
no
[root@mail-qq ~]# [ "2" = "2" ] && echo yes || echo no
yes
[root@mail-qq ~]# [ "1" -lt "2" ] && echo yes || echo no
yes
[root@mail-qq ~]# [ "1" -le "2" ] && echo yes || echo no
yes
[root@mail-qq ~]# [ "1" -ne "2" ] && echo yes || echo no
yes
[root@mail-qq ~]# [ "1" -eq "2" ] && echo yes || echo no
no
[root@mail-qq ~]# [ "1" -lt "2" -a "1" -gt "2" ] && echo yes || echo no ## -a表示并且
no
5.脚本中的for循环
#!/bin/bash
for NUM in {1..3}
do
echo $NUM
done
test.sh
#!/bin/bash
a=li
b=zhang
echo ${a}_$b ##执行脚本输出li_zhang
show_ip.sh
#!/bin/bash
IPADDRESS=`ifconfig eth0 |grep init |grep inet6 -v |awk -F "" '{print $2}'`
HOSTNAME=`hostname`
echo "$HOSTNAME ipaddress is:$IPADDRESS" ##查看ip
host_check.sh
#!/bin/bash
for IP in 172.25.254.{1..40}
do
ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
done
create_user.sh ##批量创建用户
#!/bin/bash
MAX=$(wc -l $1 | cut -d "" -f 1)
for NUM in $(seq 1 $MAX)
do
NAME=$(sed -n ${NUM}p $1)
PASS=$(sed -n ${NUM}P $2)
useradd $NAME
echo $PASS|passwd --stdin $NAME
done
daojishi.sh ##倒计时
#!/bin/bash
MIN=1
for ((i=5;i>=0;i--))
do
while
[ "$i" -eq "0" -a "$MIN" -gt "0" ]
do
echo -n "After ${MIN}:${i} is end "
echo -ne "\r\r"
i=59
sleep 1
((MIN--))
done
echo -n "After ${MIN}:${i} is end "
echo -ne "\r\r"
sleep 1
done