1、位置变量
$$ 返回程序的PID
$0 代表脚本本身名
$1 代表脚本运行时接的第一个参数(常用)
$2 代表脚本运行时接的第二个参数
$3 代表脚本运行时接的第三个参数
$* 代表所有参数
$@ 也是代表所有参数
$# 显示后面接的参数的个数
$? 上一条命令执行成功则返回0,失败则返回非0 (常用)
2、变量运算
常用的数值计算命令:
(())、let、expr、bc、$[]
# a=100
# b=200
# c=$(($a+$b)) --算术运算,只能计算整数,二个括号,不能少
# c=$[$a+$b] --算术运算,只能计算整数
# let c=a+b --算术运算,只能计算整数
# expr $a + $b --算术运算,只能计算整数 ,注意格式,等号两侧有空格
# a=3.14
# b=1.23
# echo "$a+$b" | bc --算术运算,整数小数都能计算,bc是一个计算器
4.37
bc是一个计算器
# bc
无论是整数还是小数都可以使用bc来计算,用 | 管道传入即可
3、逻辑判断与顺序
; --前面执行完,不管成功与否,都执行后面 没有逻辑关系
&& --前面执行成功,才执行后面;前面执行失败,后边不执行 逻辑与
|| --前面执行失败,才执行后面;前面执行成功,后边不执行 逻辑或
; && || 这些符号都是连接命令
--正确判断方法:
# ls /test/ && echo 'existed' || echo 'not existed'
--错误判断方法:
# ls /testfsdafas/ || echo 'existed' && echo 'not existed'
二. 条件判断
1. 条件判断语法
[语法]
格式1:test<测试表达式> --不常用
例:test -f 1.txt && echo 1||echo 0
格式2:[<测试表达式>] --常用
例:[ -f 1.txt ] && echo 1||echo 0
格式3:[[<测试表达式>]] --不常用
例:[[ -f 1.txt ]] && echo 1||echo 0
2. 各种条件判断
(1)文件存在和文件类型的判断
-e 是否存在(exist)
-f 是否为普通文件
-d 是否为目录
-S socket文件
-p pipe 管理文件
-c character字符文件
-b block块文件
-L 软连接
# test -f 1.txt && echo 1||echo 0
1
# [ -f 1.txt ] && echo 1||echo 0 --注意表达式与[]前后各有一个空格
1
# [[ -f 1.txt ]] && echo 1||echo 0 --注意表达式与[]前后各有一个空格
1
# [[ ! -f 1.txt ]] && echo 1||echo 0
0
输入一个文件,判断它属于哪种类型
#!/bin/bash
read -p "请输入一个文件名:" filename
[ -e $filename ] || echo "文件不存在"
[ -f $filename ] && echo "${filename}是普通文件"
[ -d $filename ] && echo "${filename}是目录"
[ -S $filename ] && echo "${filename}是socket文件"
[ -p $filename ] && echo "${filename}是管道文件"
[ -c $filename ] && echo "${filename}是字符文件"
[ -b $filename ] && echo "${filename}是块文件"
[ -L $filename ] && echo "${filename}是软链接文件"
--------------------------------------------
#!/bin/bash
[ -e $1 ] || echo "文件不存在"
[ -f $1 ] && echo "${1}是普通文件"
[ -d $1 ] && echo "${1}是目录"
[ -S $1 ] && echo "${1}是socket文件"
[ -p $1 ] && echo "${1}是管道文件"
[ -c $1 ] && echo "${1}是字符文件"
[ -b $1 ] && echo "${1}是块文件"
[ -L $1 ] && echo "${1}是软链接文件"
(2)文件权限相关的判断
-r 当前用户对其是否可读 --对于普通用户有效,root用户不准确(rw不准)
-w 当前用户对其是否可写
-x 当前用户对其是否可执行 --常用
-u 是否有suid
-g 是否sgid
-k 是否有t位
-s 是否为空白文件 --不为空是真,为空是假
#!/bin/sh
[ -e $1 ] || echo "文件不存在"
[ -x $1 ] && sh $1 || echo "没有执行权限"
(3)两个文件的比较判断
file1 -nt file2 比较file1是否比file2新 (new than)
file1 -ot file2 比较file1是否比file2旧 (old than)
file1 -ef file2 比较是否为同一个文件
(4)整数之间的判断
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
(5)字符串之间的判断
-z 是否为空字符串 --判断变量是否为空
-n 是否为非空字符串
string1 = string2 是否相等
string1 != string2 不等
# a=
# [ -z $a ] && echo 1 || echo 0
1
# a=1
# [ -z $a ] && echo 1 || echo 0
0
(6)逻辑判断
-a 两个条件同时满足,才为true
-o 两者满足其一,就为true
! 非
(7) 判断的三种格式的区别
在(())中使用(算术运算) 在[]和[[]]中使用(算术运算) 说明
== -eq equal,等于
!= -ne not equal,不等于
> -gt greater than,大于
>= -ge greater equal,大于等于
< -lt less than,小于
<= -le less equal,小于等于
在[]中使用的逻辑操作符 在[[]]中使用的逻辑操作符 说明
-a && 与
-o || 或
! ! 非
# [ -e install.log -a -f install.log ] && cat install.log || echo "文件不存在"
# [ -e 1.sh -a -x 1.sh ] && ./1.sh || echo "文件不存在或者文件没有执行权限"
# [[ -e 1.sh && -x 1.sh ]] && ./1.sh || echo "文件不存在或者文件没有执行权限"
3. 分支结构
(1)单分支结构
if condition(条件,真或假)
then --要么单独一行,要么在if后面,要加一个分号
statement
fi
或
if condition;then
statement
fi
if(如果/假设) 条件(真/假) --条件为真时,就执行代码
then(那么)
代码;
fi
(2)双分支结构
if condition(条件,真或假)
then
statement --条件为真,执行的部分
else
statement --条件为假,执行的部分
fi
(3)多分支结构
if condition(条件,真或假)
then
statement
elif condition
then
statement
elif condition
then
statement
else
statement
fi
输入一个文件,判断是否存在,以及文件类型
#!/bin/bash
[ -e $1 ] && echo "文件存在" || echo "文件不存在"
[ -f $1 ] && echo "${1}是普通文件"
[ -d $1 ] && echo "${1}是目录"
[ -S $1 ] && echo "${1}是socket文件"
[ -p $1 ] && echo "${1}是管道文件"
[ -c $1 ] && echo "${1}是字符文件"
[ -b $1 ] && echo "${1}是块文件"
[ -L $1 ] && echo "${1}是软链接文件"
-----------------------------
输入一个文件判断文件类型 if的单分支:
#!/bin/bash
if [ -e $1 ];then
echo "文件存在"
fi
# 用逻辑操作符来判断文件不存在
if [ ! -e $1 ];then
echo "文件不存在"
fi
# 判断文件类型
if [ -f $1 ];then
echo "$1是普通文件"
fi
if [ -d $1 ];then
echo "$1是目录文件"
fi
if [ -S $1 ];then
echo "$1是socket文件"
fi
if [ -p $1 ];then
echo "$1是管道文件"
fi
if [ -c $1 ];then
echo "$1是字符文件"
fi
if [ -b $1 ];then
echo "$1是块文件"
fi
if [ -L $1 ];then
echo "$1是链接文件"
fi
----------------------------
双分支和多分支
# 判断文件是否存在
#!/bin/bash
# 判断文件是否存在
if [ -e $1 ]
then
echo "文件存在"
else
echo "文件不存在"
fi
# 判断文件类型
if [ -f $1 ];then
echo "${1}是普通文件"
elif [ -d $1 ];then
echo "${1}是目录"
elif [ -S $1 ];then
echo "${1}是socket文件"
elif [ -p $1 ];then
echo "${1}是管道文件"
elif [ -c $1 ];then
echo "${1}是字符文件"
elif [ -b $1 ];then
echo "${1}是块文件"
else
echo "${1}是软链接文件"
fi
-------------------------------------------
如何判断一台主机是否在线?
#!/bin/bash
ping $1 -c 2 &> /dev/null
if (( $? == 0 )) ;then
echo "$1在线"
else
echo "$1不在线"
fi
-----------
#!/bin/bash
ping $1 -c 2 &> /dev/null
if [ $? -eq 0 ];then
echo "$1在线"
else
echo "$1不在线"
fi