if [ 条件 ] ;then
statement1 #条件成立后声明的内容
elif [ 条件2 ];then
statement2
elif [ 条件3 ];then
statement3
……
else
statementn
fi
[ -f "somefile" ] #判断文件是否存在
[ -d "testResults/" ] #判断目录testResults/是否存在
[ -x "/bin/ls" ] #判断/bin/ls文件是否存在并有可执行权限
[ -n "$var" ] #判断$var变量是否有值
[ "$a" = "$b" ] #判断$a和$b是否相等
[ -a FILE ] 如果 FILE 存在则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -e FILE ] 如果 指定的文件或目录存在时返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
[ -r FILE ] 如果 FILE 存在且是可读的则返回为真。
[ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)
[ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。
[ -z STRING ] 如果STRING的长度为零则为真 ,即判断是否为空,空即是真;
案例:
[root@localhost ~]# cat if.sh
#!/bin/bash
mysqlpath=/usr/local/mysql
nginx=/usr/local/nginx/bin/nginx
if [ -f $nginx ];then
echo "$nginx"
elif [ -d $mysqlpath ];then
echo "mysql 路径$mysqlpath"
else
echo "莫得"
fi
[root@localhost ~]# sh if.sh
mysql 路径/usr/local/mysql
[root@localhost ~]# sh if.sh 1 1
相等
[root@localhost ~]# sh if.sh 1 2
不想等
[root@localhost ~]# cat if.sh
a=$1
b=$2
if [ $a = $b ];then
echo "相等"
else
echo "不想等"
fi
for bt in t1 t2 #by in t1 t2 定义循环体
do
command1 #循环的命令1
command2 #循环的命令2
done
for ((i=1;i<9;i++));do
echo "$i"
done
for i in {1..10}
do
echo $(expr $i \* 3 + 1);
done
案例:
[root@localhost ~]# cat if.sh
a=$1
b=$2
if [ $a = $b ];then
for i in `expr $a + $b `;do
echo "$i 次"
done
else
echo "不想等"
fi
[root@localhost ~]# sh if.sh 3 3
6 次
[root@localhost ~]# sh if.sh 1 1
2 次
[root@localhost ~]# sh if.sh 1 2
不想等
case expression in #expression 判断条件
pattern1)
statement1 #如果 condition1 成立,那么就执行 if 后边的 statement1;
;; #如果 condition1 不成立,那么继续执行 elif,判断 condition2
pattern2)
statement2
;;
pattern3)
statement3
;;
……
*)
statementn #如果所有的 if 和 elif 判断都不成立,就进入最后的 else,执行 statementn
esac
案例:
[root@localhost ~]# cat case.sh
echo "1.mysql 2.nginx 3.lnmp"
read -p "输入 1-3 或者 mysql nginx lanp " M
case $M in
1|mysql)
echo "mysql"
;;
nginx|[2n])
echo "nginx"
;;
3|lnmp)
echo "lnmp"
;;
*)
echo "请输入 1-3 或 mysql nginx lanp"
esac
[root@localhost ~]# sh case.sh
1.mysql 2.nginx 3.lnmp
输入 1-3 或者 mysql nginx lanp 1
mysql
[root@localhost ~]# sh case.sh
1.mysql 2.nginx 3.lnmp
输入 1-3 或者 mysql nginx lanp 2
nginx
[root@localhost ~]# sh case.sh
1.mysql 2.nginx 3.lnmp
输入 1-3 或者 mysql nginx lanp 3
lnmp
[root@localhost ~]# sh case.sh
1.mysql 2.nginx 3.lnmp
输入 1-3 或者 mysql nginx lanp n
nginx
[root@localhost ~]# sh case.sh mysql
1.mysql 2.nginx 3.lnmp
输入 1-3 或者 mysql nginx lanp mysql
mysql
[root@localhost ~]# sh case.sh
1.mysql 2.nginx 3.lnmp
输入 1-3 或者 mysql nginx lanp la^H^H
请输入 1-3 或 mysql nginx lanp
[root@localhost ~]# sh case.sh
1.mysql 2.nginx 3.lnmp
输入 1-3 或者 mysql nginx lanp lnmp
lnmp
字段介绍
* 表示任意字符串。
[abc] 表示 a、b、c 三个字符中的任意一个
[m-n] 表示从 m 到 n 的任意一个字符
| 表示多重选择,类似逻辑运算中的或运算
while expression #循环条件
do
statement1 #循环内容
done
案例:
[root@localhost ~]# cat while.sh
#!/bin/bash
i=1
while [ $i -lt 10 ]
do
echo "$i"
i=`expr $i + 1`
done
[root@localhost ~]# sh while.sh
1
2
3
4
5
6
7
8
9
[root@localhost ~]# cat while.sh
[root@localhost ~]# cat d.sh
#!/bin/bash
read -p "请输入三角形的高:" h
i=1
while [ $i -le $h ]
do
j=1
while [ $j -le $i ]
do
echo -n "*"
let j++
done
echo
let i++
done
函数介绍
Shell 中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别
语法:
#!/bin/bash
function name() {
statements #命令语句及代码
[return value]
}
name #函数调用
$@表示函数的所有参数,$?表示函数的退出状态(返回值)
字段介绍:
function是 Shell 中的关键字,专门用来定义函数;
name是函数名;
statements是函数要执行的代码,也就是一组语句;
return value表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写
示例1:
function install_hint(){
echo "选择需要安装的程序"
echo "docker"
echo "nginx"
echo "mysql"
echo "php"
echo "redis"
echo "zabbix"
echo "lnmp"
info "默认安装lnmp"
}
install_hint
示例2:
function install_hint(){
local a=1 #local定义临时变量 只可在当前函数使用的变量
if [ ! "$a" -eq 0 ];then #判断$a是否不等于0 #!取反 当结果是正确的时候加!T变F
echo "123"
fi
}
install_hint
my_array=(A B "C" D)
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"
a=1
for ((i=0;i<4;i++));do
echo "第`expr $i + 1`个值${my_array[$i]}"
# echo "第$[i+a]个值${my_array[$i]}"
done
n=$1 #传参变量
path=/usr/local/nginx #可直接定义路径
command=`ls -d` #调用命令
game=(石头 剪刀 布) #可直接定义内容
num=$[RANDOM%3] #产生一个0-2的随机数
computer=${game[$num]} #将定义的内容以 0为石头 1为剪刀 2为布 结合
$! #上一个参数的路径
$USER #系统当前登录用户
$? #命令执行状态 0成功 1-255错误
$FN
$NR
介绍下Shell中的${}、##和%%使用范例,本文给出了不同情况下得到的结果。
假设定义了一个变量为:
代码如下:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
${file##*.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
-d :判断制定的是否为目录
-z:判断制定的变量是否存在值
-f:判断制定的是否为文件
-L:判断制定的是否为符号链接
-r:判断制定的是否可读
-s:判断存在的对象长度是否为0
-w:判断制定的是否可写
-x:判断存在的对象是否可以执行
!:测试条件的否定符号
[ $a -eq $b ] == #比较两边数值是否相等
[ $a -ne $b ] != #比较两边数值是否不相等
[ $a -gt $b ] > #比较左边数值是否大于右边
[ $a -lt $b ] < #比较左边数值是否小于右边
[ $a -ge $b ] >= #比较左边数值是否大于等于右边
[ $a -le $b ] <= #比较左边数值是否小于等于右边
a=`expr 1 + 4`
a=`expr 1 \* 4`
i=2
y=3
a=$[i+y+9]
echo "$((1+3))"
read -p "fsdfd" a
echo $a