1.定义
BASH = GNU Bourne-Again Shell,BASH 是 GNU 组织开发和推广的一个项目。
Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具所无法实现的功能。
bash是一个解释器,解释给内核,运行效率低。
2.创建新shell脚本:
1)创建包含bash命令的文本文件。文件的第一行应为:
chmod +x scripts ##添加可执行权限
3)将文件放置在用户的$PATH的目录中
~/bin – 用于用户的私有程序
/usr/local/bin – 本地开发、系统上的其他人使用的脚本
/usr/local/sbin - 本地开发、由root使用的脚本
直接运行脚本和使用source命令运行脚本是不同的!
脚本调试模式:
#!/bin/bash -x
3.引用和转义
引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字
面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。
引用有三种类型:
弱引用:
将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。换言之,变量
扩展和命令扩展在双引号内仍起作用。
强引用:
将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展:
转义:
非引用的\是转义字符。它保留了下一个字符的文字值。(例如,\$PATH是确切的字符串$PATH,而
不是PATH变量的内容。)
量的脚本。
若要定义或指定值:
FRUIT=apple
若要参考或使用变量:
$FRUIT
${FRUIT}
语法:
$(shell command)
6.算术运算符
算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。
operator meaning
<VARIABLE>++ 增量后
<VARIABLE>-- 减量后
- 减法
+ 加法
** 幂运算
* 乘法
/ 除法
% 余数
+= 加等
-= 减等
Shell计算命令:
用$[]表示数学运算。
7.Bash位置参数
有两种简单的方法可以将用户输入读入bash中的变量。
第一个方法是使用read提示用户输入(使用-p选项)并将其直接存储到一个或多个变量:
交互式输入
指定的位置参数总数:$#
位置参数自身:$0、$1、$2、$3....
所有位置参数: $@、$*
#!/bin/bash
echo \$1 is $1
echo \$2 is $2
echo \$3 is $3
echo \$* is $*
echo \$@ is $@
echo \$# is $#
例如:grep的退出状态的含义:
0 – 在指定的文件中找到了模式
1 – 在指定的文件中未找到模式
>1 – 一些其他错误(无法打开文件、错误的搜索表达式等)
推出状态的值被存储在"?"中,可以使用以下命令查看:
# echo $?
######脚本######
1.检测1~10主机是否开机,开机则显示172.25.254.X is up,关机则显示172.25.254.X is down
A && B || C ##A为真则执行B,为假则执行C
#!/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
#!/bin/bash
for NAME in `cat $1`
do
useradd $NAME
3.备份/etc/目录下以.conf结尾的所有文件,并且备份后的文件名为etcconfig-时间戳
#!/bin/bash
BACKDIR=etcconfig-`date +%Y-%m-%d-%S`
mkdir -p /mnt/$BACKDIR
cp /etc/*.conf /mnt/$BACKDIR
#!/bin/bash
for ((SEC=5;SEC>0;SEC--))
do
echo -n After ${SEC}s is end
echo -ne "\r \r"
sleep 1
done
#!/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" -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
mkdir -p /mnt/DB_BACK/
for DB in `mysql -uroot -e "show databases;" -E -N | grep -E '\*|schema$' -v`
do
DBNAME=$DB-`date +%Y-%m-%d-%S`
echo "Backing up $DB"
mysqldump $DB > /mnt/DB_BACK/$DBNAME
done
for DBNAME in `ls /mnt/DB_BACK/*`
do
SIZE=`stat --print "%s\n" $DBNAME`
echo $DBNAME\'s size is $SIZE byte
7.输入网段查看ip
#!/bin/bash
read -p "please give me a interface:" ip_show
echo `ifconfig ${ip_show} | grep inet | grep inet6 -v | awk -F ' ' '{print $2}'`
while [ "$#" -eq "0" ]
do
echo "please give me a ip address!"
exit 1
done
ping -c1 -w1 $1 >/dev/null && echo "$1 is up" || echo "$1 is down"
ls $1 &> /dev/null
BASH = GNU Bourne-Again Shell,BASH 是 GNU 组织开发和推广的一个项目。
Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具所无法实现的功能。
bash是一个解释器,解释给内核,运行效率低。
2.创建新shell脚本:
1)创建包含bash命令的文本文件。文件的第一行应为:
#!/bin/bash ##解释器,将脚本里的内容解释给内核,不可随意更改
chmod +x scripts ##添加可执行权限
3)将文件放置在用户的$PATH的目录中
~/bin – 用于用户的私有程序
/usr/local/bin – 本地开发、系统上的其他人使用的脚本
/usr/local/sbin - 本地开发、由root使用的脚本
直接运行脚本和使用source命令运行脚本是不同的!
脚本调试模式:
#!/bin/bash -x
#sh -x scripts
3.引用和转义
引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字
面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。
引用有三种类型:
弱引用:
将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。换言之,变量
扩展和命令扩展在双引号内仍起作用。
强引用:
将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展:
转义:
非引用的\是转义字符。它保留了下一个字符的文字值。(例如,\$PATH是确切的字符串$PATH,而
不是PATH变量的内容。)
4.Shell变量
shell变量用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变量的脚本。
若要定义或指定值:
FRUIT=apple
若要参考或使用变量:
$FRUIT
${FRUIT}
5.命令替换
命令替换在子shell中执行指定命令并用命令输出替换脚本中的命令替换。语法:
$(shell command)
6.算术运算符
算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。
operator meaning
<VARIABLE>++ 增量后
<VARIABLE>-- 减量后
- 减法
+ 加法
** 幂运算
* 乘法
/ 除法
% 余数
+= 加等
-= 减等
Shell计算命令:
用$[]表示数学运算。
echo $[1+2]
expr 1 + 2
let a=1+2;echo $a
for ((i=1;i<10;i++));do echo $i;done
7.Bash位置参数
有两种简单的方法可以将用户输入读入bash中的变量。
第一个方法是使用read提示用户输入(使用-p选项)并将其直接存储到一个或多个变量:
交互式输入
# read -p 'Enter your first and last name: ' FIRST LAST
指定的位置参数总数:$#
位置参数自身:$0、$1、$2、$3....
所有位置参数: $@、$*
#!/bin/bash
echo \$1 is $1
echo \$2 is $2
echo \$3 is $3
echo \$* is $*
echo \$@ is $@
echo \$# is $#
8.退出状态
Linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态。这被bash当作逻辑True值。非零退出状态通常表示发生了错误,并且被bash当作逻辑False值。例如:grep的退出状态的含义:
0 – 在指定的文件中找到了模式
1 – 在指定的文件中未找到模式
>1 – 一些其他错误(无法打开文件、错误的搜索表达式等)
推出状态的值被存储在"?"中,可以使用以下命令查看:
# echo $?
######脚本######
1.检测1~10主机是否开机,开机则显示172.25.254.X is up,关机则显示172.25.254.X is down
A && B || C ##A为真则执行B,为假则执行C
#!/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
for NAME in `cat $1`
do
useradd $NAME
done
3.备份/etc/目录下以.conf结尾的所有文件,并且备份后的文件名为etcconfig-时间戳
#!/bin/bash
BACKDIR=etcconfig-`date +%Y-%m-%d-%S`
mkdir -p /mnt/$BACKDIR
cp /etc/*.conf /mnt/$BACKDIR
4.五秒倒计时
-n 不换行 -e 执行 \r 刷新#!/bin/bash
for ((SEC=5;SEC>0;SEC--))
do
echo -n After ${SEC}s is end
echo -ne "\r \r"
sleep 1
done
5.1分10秒倒计时
-ge 大于等于 -gt 大于 -lt 小于 -a 并且#!/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" -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
6.备份数据库
#!/bin/bashmkdir -p /mnt/DB_BACK/
for DB in `mysql -uroot -e "show databases;" -E -N | grep -E '\*|schema$' -v`
do
DBNAME=$DB-`date +%Y-%m-%d-%S`
echo "Backing up $DB"
mysqldump $DB > /mnt/DB_BACK/$DBNAME
done
for DBNAME in `ls /mnt/DB_BACK/*`
do
SIZE=`stat --print "%s\n" $DBNAME`
echo $DBNAME\'s size is $SIZE byte
done
7.输入网段查看ip
#!/bin/bash
read -p "please give me a interface:" ip_show
echo `ifconfig ${ip_show} | grep inet | grep inet6 -v | awk -F ' ' '{print $2}'`
8.检测ip
#!/bin/bashwhile [ "$#" -eq "0" ]
do
echo "please give me a ip address!"
exit 1
done
ping -c1 -w1 $1 >/dev/null && echo "$1 is up" || echo "$1 is down"
9.检测文件
#!/bin/bashls $1 &> /dev/null
[ "$?" -eq "0" ] && echo $1 is exist || echo $1 is not exist