bash脚本基础(一)

如何创建新shell脚本?

1. 创建包含bash命令的文本文件。文件的第一行应为:
#!/bin/bash
2. 使文件可执行(使用chmod +x scripts)
3. 将文件放置在用户的$PATH的目录中
~/bin – 用于用户的私有程序
/usr/local/bin – 本地开发、系统上的其他人使用的脚本
/usr/local/sbin - 本地开发、由root使用的脚本
直接运行脚本和使用source命令运行脚本是不同的!
脚本调试模式:
#!/bin/bash -x

# bash -x scripts

示例如下:

bash脚本基础(一)

引用和转义

引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字
面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。
引用有三种类型:

弱引用
将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。换言之,变量
扩展和命令扩展在双引号内仍起作用。
echo “can I have a $FRUIT”
echo “The current time is $(date +%r).”

强引用
将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展:
echo “Make $$$ Fast”
rm 'untitled folder'

转义
非引用的\是转义字符。它保留了下一个字符的文字值。(例如,\$PATH是确切的字符串$PATH,而
不是PATH变量的内容。)
echo Make \$\$\$ Fast\!
ls untitled\ folder

[[email protected] ~]# echo # not a comment #
[[email protected] ~]# echo \# not a comment #
# not a comment
[[email protected] ~]# echo \# not a comment \#
# not a comment #
[[email protected] ~]# echo '# not a comment #'
# not a comment #
[[email protected] ~]# echo '$HOME'
$HOME
[[email protected] ~]# echo '`pwd`'
`pwd`
[[email protected] ~]# echo '"Hello,world"'
"Hello,world"

[[email protected] ~]# echo "$HOME"
/root
[[email protected] ~]# echo "`pwd`"
/root
[[email protected] ~]# echo ""Hello, world""
Hello, world
[[email protected] ~]# echo "\$HOME"
$HOME
[[email protected] ~]# echo "\`pwd\`"
`pwd`
[[email protected] ~]# echo "\"Hello, world\""
"Hello, world"

示例,如何显示出“5”:

bash脚本基础(一)

Shell变量

shell变量用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变
量的脚本。
若要定义或指定值:
FRUIT=apple
若要参考或使用变量:
$FRUIT
${FRUIT}
[[email protected] ~]# FIRST=John
[[email protected] ~]# LAST=Doe
[[email protected] ~]# echo $FIRST $LAST
John Doe
[[email protected] ~]# echo $FIRST_$LAST
Doe
[[email protected] ~]# echo ${FIRST}_$LAST
John_Doe

示例:

bash脚本基础(一)

Shell计算命令:

用$[]表示数学运算。
# echo $[1+2]
# a=1; echo $[$[$a+1]*2]

bash脚本基础(一)
用expr表示数学运算。
# echo `expr 1 + 2`
用let指示数学运算。
# let A=1+2
# echo $A
用(())表示数学运算。bash内建功能,效率高。
#!/bin/bash
for ((i=1;i<10;i++))
do
((j+=i))
done
echo $j

示例倒计时5s:

#!/bin/bash
for ((SEC=5;SEC>=0;SEC--))
do
        echo -n "After ${SEC}s is end "
        sleep 1
        echo -ne "\r    \r"
done

bash脚本基础(一)


循环

for循环用于值列表中的相同命令的重复。
[[email protected] ~]# for HOST in host{1..3};do echo $HOST;done
host1
host2
host3
[[email protected] ~]# for NUM in $(seq 2 2 8);do echo $NUM;done
2
4
6
8

示例测试1到10号主机的连通性,并进行显示:

#!/bin/bash

for NUM in {1..10}

do

 ping -c1 -w1 172.25.254.$NUM >/dev/null && echo "172.25.254.$NUM is up" || echo "172.25.254.$NUM is down"

done

bash脚本基础(一)


循环与计算结合:

#!/bin/bash
for ((i=1;i<=100;i++))
do
((j+=i))
#j=`expr $j + $i`
#let j+=i
#j=$[j+=i]
done
echo $j
也可以写成一行:
# for((i=0; i<=100; i++));do j=`expr $j + $i` ;done;echo $j

示例倒计时1分10秒:

#!/bin/bash
MIN=1
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" ]
        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 "
        sleep 1
        echo -ne "\r    \r"
done

bash脚本基础(一)


数据库备份示例:

#!/bin/bash
for DB in $(mysql -e "show databases;" -E -N | grep -v '^*' | grep -v 'schema$')
do
echo "Backing up $DB"
mysqldump $DB > /dbbackup/$DB.dump
done
echo ""
for DBDUMP in /dbbackup/*
do
SIZE=$(stat --printf "%s\n" $DBDUMP)
echo "$DBDUMP
$SIZE"
done

数据库备份:

bash脚本基础(一)