shell
变量
把命令作为变量
count=$(cat a.txt | grep -v COUNT)
count=`cat a.txt | grep -v COUNT` #反单引号,引用命令执行结果
echo $count #使用变量
也可以把命令获取到的值放到文本里,对文本进行处理
mysql -uzabbix -pzabbix -e "SELECT name,status,available,maintenanceid FROM zabbix.hosts WHERE 'status'=0 AND (available=2) AND MAINTENANCEID IS NULL;" >> a.txt
echo "" >a.txt #再清空a.txt数据,下次使用
日志类的以时间进行命名
TIME=`date +%Y%m%d%H%M%S`
LOG=/home/root/log/sql_$TIME.log
执行脚本时传参至脚本
在执行脚本时传入参数
vim c.sh
#!/bin/bash
echo "第一个参数为:$1";
echo "第二个参数为:$2";
chmod +x c.sh
./c.sh 1 2
在执行脚本后传入参数
#!/bin/sh
echo -n "输入一个值:"
read a
echo "你输入的值是$a"
读取文件read
每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。
读取文件的关键是如何将文本中的数据传送给read命令。最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令
- read 选项 变量
-p 提示信息
-t 等待多久
-s 隐藏输入数据,机密的输入
#!/bin/bash
#这里默认会换行
echo "输入: "
#读取从键盘的输入
read a
echo "你输入的是 $a"
exit 0 #退出
#!/bin/bash
count=1 # 赋值语句,不加空格
cat /mnt/a | while read line # cat 命令的输出作为read命令的输入,read读到>的值放在line中
do
echo "Line $count:$line"
count=$[ $count + 1 ] # 注意中括号中的空格。
done
echo "finish"
exit 0
#!/bin/bash
read -s -p "请输入您的密码:" pass #输入密码与背景色一致,做到隐藏密码
echo "\n您输入的密码是 $pass"
exit 0
shell脚本输出带颜色
echo -e "\033[字背景颜色;文字颜色m字符串 \033[0m"
echo -e "\033[32;5m 字符串 \033[0m"
# -e:echo的拓展属性
# \033[32m 开始,32为绿色字体,5为闪烁,m是颜色和闪烁的结尾,颜色和闪烁或其他参数要使用分号分隔;
# 字符串为输入内容
# \033[0m 结尾
数组
数组用括号来表示,元素用"空格"符号分割开,语法格式如下:array_name=(value1 value2 … valuen)
#!/bin/bash
my_array=( a b 3 5)
echo "第一个元素为: ${my_array[0]}" #0为数组的索引,数组都是从0开始的
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"
echo "第四个元素为: ${my_array[*]}" #输出数组中的所有元素
运算符
原生bash不支持简单的数学运算,expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2
完整的表达式要被 反单引号包含``,注意这个字符不是常用的单引号
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
算术运算符
条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。
* #乘法,变量相乘要加转义符"\" 例:a=10 b=20 `expr $a \* $b` 结果为200。
/ #除法 例:a=10 b=20 `expr $b % $a` 结果为 2。
% #取余 例:a=10 b=20 `expr $b % $a` 结果为 0。
== #相等 例:a=10 b=20 [ $a == $b ] 返回 false。
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
-eq #等于 例:a=10 b=20 [ $a -eq $b ] 返回 false。
-ne #不等于 例:a=10 b=20 [ $a -ne $b ] 返回 true。
-gt #大于
-lt #小于
-ge #大于等于
-le #小于等于
逻辑运算符
&& # 逻辑的 AND 例a=10 b=20 [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| # 逻辑的 OR 例a=10 b=20 [[ $a -lt 100 || $b -gt 100 ]] 返回 true
字符串运算符
= #检测两个字符串是否相等,相等返回true。a=sdf b=asdf,[ $a = $b ] 返回 false。
-z #检测字符串长度是否为0,为0返回 true。a=sdf [-z $a] 返回false
echo
echo -e "OK! \n It is a test" # -e 开启转义换行符\n
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
echo '$name\"' #单引号,强引用,返回值是$name\"
echo `date` #反单引号,显示命令执行结果
流程控制
if else 判断
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi #写成一行在命令行执行
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
for - in循环
通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要
in 后面接的是数组,是有顺序的
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
#!/bin/bash
for((i=1;i<=5;i++));do
echo "这是第 $i 次调用";
done;
while 语句
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
跳出循环break命令,脚本直接结束
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done
跳出循环 continue,只跳出当前循环语句,不结束脚本,且会继续执行循环
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
until
until 循环执行一系列命令直至条件为 true 时停止
#!/bin/bash
a=0
until [ ! $a -lt 5 ]
do
echo $a
a=`expr $a + 1`
done
case … esac
case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
#!/bin/sh
echo -n "输入 1 到 3 之间的数字:"
read a
case "$a" in
1) echo "site=1"
;;
2) echo "site=2"
;;
3) echo "site=3"
;;
*) echo "error"
;;
esac