shell脚本使用教程1
一.shell基础知识
1.位置变量
位置变量是指函数或脚本后跟的第n个参数。
1
−
1-
1−n,需要注意的是从第10个开始要用花括号调用,例如${10}
shift可对位置变量控制
#!/bin/bash
echo "1: $1"
shift
echo "2: $2"
shift
echo "3: $3"
# bash test.sh a b c
1: a
2: c
3:
2.特殊变量
3.单引号和双引号
单引号是告诉shell忽略特殊字符,而双引号则解释特殊符号原有的意义。
# N=3
# VAR="1 2 $N"
# echo $VAR
1 2 3
# VAR='1 2 $N'
# echo $VAR
1 2 $N
二.字符串处理之${}
1.获取字符串长度
VAR = "hello world"
echo ${#VAR}
2.字符串切片
格式:
${parameter:offset}
${parameter:offset:length}
截取从offset个字符开始,向后length个字符
VAR = "hello world"
#截取倒数第三个字符后的2个字符
echo ${VAR:(-3):2}
3.替换字符串
格式:${parameter/pattern/string}
pattern前面开头一个正斜杠只匹配第一个字符串,两个正斜杠匹配所有字符
# VAR='hello world world!'
将第一个 world 字符串替换为 WORLD:
# echo ${VAR/world/WORLD}
hello WORLD world!
将全部 world 字符串替换为 WORLD:
# echo ${VAR//world/WORLD}
hello WORLD WORLD!
替换正则匹配为空:
# VAR=123abc
# echo ${VAR//[^0-9]/}
123
# echo ${VAR//[0-9]/}
abc
4.字符串截取
格式:
删除匹配前缀
${parameter#word}
${parameter##word}
删除匹配后缀
${parameter%word}
${parameter%%word}
# 去掉左边,最短匹配模式, ##最长匹配模式。
% 去掉右边,最短匹配模式, %%最长匹配模式。
# URL="http://www.baidu.com/baike/user.html"
以//为分隔符截取右边字符串:
# echo ${URL#*//}
www.baidu.com/baike/user.html
以/为分隔符截取右边字符串:
# echo ${URL##*/}
user.html
以//为分隔符截取左边字符串:
# echo ${URL%%//*}
http:
以/为分隔符截取左边字符串:
# echo ${URL%/*}
http://www.baidu.com/baike```
以.为分隔符截取左边:
# echo ${URL%.*}
http://www.baidu.com/baike/user
以.为分隔符截取右边:
# echo ${URL##*.}
html```
5.变量状态赋值
${VAR:-string} 如果 VAR 变量为空则返回 string
${VAR:+string} 如果 VAR 变量不为空则返回 string
${VAR:=string} 如果 VAR 变量为空则重新赋值 VAR 变量值为 string
${VAR:?string} 如果 VAR 变量为空则将 string 输出到 stderr
如果变量为空就返回 hello world!:
# VAR=
# echo ${VAR:-'hello world!'}
hello world!
如果变量不为空就返回 hello world!:
# VAR="hello"
# echo ${VAR:+'hello world!'}
hello world!
如果变量为空就重新赋值:
# VAR=
# echo ${VAR:=hello}
hello
# echo $VAR
hello
如果变量为空就将信息输出 stderr:
# VAR=
# echo ${VAR:?value is null}
-bash: VAR: value is null
6.字符串颜色
#!/bin/bash
# 字体颜色
for i in {31..37}; do
echo -e "\033[$i;40mHello world!\033[0m"
done
# 背景颜色
for i in {41..47}; do
echo -e "\033[47;${i}mHello world!\033[0m"
done
# 显示方式
for i in {1..8}; do
echo -e "\033[$i;31;40mHello world!\033[0m"
done
三.字符串表达式与运算符
1.字符串比较
使用-z或-n判断字符串长度时,变量要加双引号。
运算符 | 描述 | 实例 |
---|---|---|
-n | 字符串长度不等于0为真 | VAR1=1;VAR2="" [ -n “ V A R 1 " ] 为 t r u e [ − n " VAR1" ]为 true [ -n " VAR1"]为true[−n"VAR2” ]为 false |
-z | 字符串长度等于0为真 | VAR1=1;VAR2="" [ -z “ V A R 1 " ] 为 f a l s e [ − z " VAR1" ]为 false [ -z " VAR1"]为false[−z"VAR2” ]为 true |
str | 字符串存在为真 | VAR1=1;VAR2="" [ $VAR1 ]为 true [ $VAR2 ]为 false |
# [ -z $a ] && echo yes || echo no
yes
# [ -n $a ] && echo yes || echo no
yes
# 加了双引号才能正常判断是否为空
# [ -z "$a" ] && echo yes || echo no
yes
# [ -n "$a" ] && echo yes || echo no
no
# 使用了双中括号就不用了双引号
# [[ -n $a ]] && echo yes || echo no
no
# [[ -z $a ]] && echo yes || echo no
yes
2.逻辑判断符
四.shell流程控制
1.if
格式: if list; then list; [ elif list; then list; ] … [ else list; ] fi
实例一.判断crond进程是否运行
#!/bin/bash
NAME=crond
NUM=$(ps -ef |grep $NAME |grep -vc grep)
if [ $NUM -eq 1 ]; then
echo "$NAME running."
else
echo "$NAME is not running!"
fi
2.for
格式: for name [ [ in [ word … ] ] ; ] do list ; done
实例一.检查多个域名是否可以访问
#!/bin/bash
URL="www.baidu.com www.sina.com www.jd.com"
for url in $URL; do
#这条命令是常见的测试网站是否正常的用法
HTTP_CODE=$(curl -o /dev/null -s -w %{http_code} http://$url)
if [ $HTTP_CODE -eq 200 -o $HTTP_CODE -eq 301 ]; then
echo "$url OK."
else
echo "$url NO!"
fi
done
bash是支持C语言的for循环的,sh则会报语法错误。
#!/bin/bash
j=$1
for ((i=1; i<=j; i++))
do
touch file$i && echo file $i is ok
done
3.while
格式:while list; do list; done
while 条件表达式; do
命令
done
实例一.使用while循环逐行播放a.txt文件,有三种方式
3.1
#!/bin/bash
cat ./a.txt | while read LINE; do
echo $LINE
done
3.2
#!/bin/bash
while read LINE; do
echo $LINE
done < ./a.txt
3.3
#!/bin/bash
exec < ./a.txt # 读取文件作为标准输出
while read LINE; do
echo $LINE
done
4.case语句
case 语句一般用于选择性来执行对应部分块命令。
格式: case word in [ [(] pattern [ | pattern ] … ) list ;; ] … esac
case 模式名 in
模式 1)
命令
;;
模式 2)
命令
;;
*)
不符合以上模式执行的命令
esac
每个模式必须以右括号结束,命令结尾以双分号结束。
实例一.根据位置参数匹配不同的模式
#!/bin/bash
case $1 in
start)
echo "start."
;;
stop)
echo "stop."
;;
restart)
echo "restart."
;;
*)
echo "Usage: $0 {start|stop|restart}"
esac
5.select
#!/bin/bash
PS3="Select a number: "
while true; do
select mysql_version in 5.1 5.6 quit; do
case $mysql_version in
5.1)
echo "mysql 5.1"
break
;;
5.6)
echo "mysql 5.6"
break
;;
quit)
exit
;;
*)
echo "Input error, Please enter again!"
break
esac
done
done