【shell】if常用判断|if目录是否为空|判断字符串包含关系|与或
作者:bandaoyu 持续更新,连接:http://t.csdn.cn/mVBjJ
shell中的if语句 https://blog.csdn.net/wxx_0124/article/details/95305625
if常用判断
注意:[] 后面是否需要加 “;” ,比较符合(=、<、>……)与左右两个的变量之间要由空格隔开。
1、字符串判断
规则说明:
= 等于 if [ "$a" = "$b" ]
== 与=等价
!= 不等于 if [ "$a" ="$b" ]
< 小于,在ASCII字母中的顺序:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ] #需要对<进行转义
> 大于
-z 字符串为null,即长度为0
-n 字符串不为null,即长度不为0
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真,记得STRING 是带双引号的,如:“$NAME"
[ STRING1 ] 如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。If [ $a = $b ] 如果string1等于string2 字符串允许使用赋值号做等号
if [ $string1 != $string2 ] 如果string1不等于string2
if [ -n $string ] 如果string 非空(非0),返回0(true)
if [ -z $string ] 如果string 为空
if [ $sting ] 如果string 非空,返回0 (和-n类似)
EX1:
#!/bin/sh
SYSTEM=`uname -s` #获取操作系统类型,我本地是linux
if [ $SYSTEM = "Linux" ] ; then #如果是linux的话打印linux字符串
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi #ifend
基本上和其他脚本语言一样。没有太大区别。不过值得注意的是。[]里面的条件判断。
2、数字的判断
比较格式: [ 数值1 比较符 数值2 ] 注意左边的括号与数值1之间有一个空格,同样,数值2和右边的括号之间也有空格。
规则说明:
-eq 等于 if [ "$a" -eq "$b" ]
-ne 不等于 if [ "$a" -ne "$b" ]
-gt 大于 if [ "$a" -gt "$b" ]
-ge 大于等于 if [ "$a" -ge "$b" ]
-lt 小于 if [ "$a" -lt "$b" ]
-le 小于等于 if [ "$a" -le "$b" ]
---发现只要是用作数学变量处理的都是需要加双括号,比如:((index++)),index=$(($index+1))
< 小于(需要双括号) (( "$a"< "$b" ))
<= 小于等于(...) (("$a" <= "$b" ))
> 大于(...) (("$a" > "$b" ))
>= 大于等于(...) (("$a" >= "$b" ))
PS:小数据比较可使用AWK
if [ int1 -eq int2 ] 如果int1等于int2
if [ int1 -ne int2 ] 如果不等于 if [ int1 -ge int2 ] 如果>= if [ int1 -gt int2 ] 如果> if [ int1 -le int2 ] 如果<= if [ int1 -lt int2 ]如果<
3、文件的判断
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果目录存在 如果 FILE 存在且是一个目录则返回为真。
[ -e FILE ] 如果 指定的文件或目录存在时返回为真。
[ -f FILE ] 如果文件存在 如果 FILE 存在且是一个普通文件则返回为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。 [ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则返回为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)
[ -x FILE ] 如果 FILE 存在且是可执行的则返回为真
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
-h 判断对象是否存在,并且为软链接
-nt 判断file1是否比file2新 [
"/data/file1"
-nt
"/data/file2"
]
-ot 判断file1是否比file2旧 [
"/data/file1"
-ot
"/data/file2"
]
if [ -s file ]; 如果文件存在且非空 if [ -r file ] 如果文件存在且可读 if [ -w file ] 如果文件存在且可写 if[ -a FILE ] 如果 FILE 存在则为真。 if [ -a “/mnt/myfile” ],if [ ! -a “/mnt/myfile” ]
例子:文件判断
文件夹不存在则创建
1 2 3 4 5 |
|
文件存在则删除
1 2 3 4 5 |
|
判断文件夹是否存在
1 2 3 4 5 |
|
判断文件是否存在
1 2 3 4 5 |
|
4、复杂逻辑判断
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件逻辑与的表达:
1)、if [ $xxx=a -a $xx=b ]注:-a表示and的意思
2)、if [ $xxx=a ] && [ $xx=b逻辑或的表达:
1)、if [ $xxx=a -o $xx=b ]注:-o表示or的意思
2)、if [ $xxx=a ] || [ $xx=b ]
shell 中的与、或表达式 - https://www.cnblogs.com/zhangqigao/p/6215388.html
语法
注意:[] 后面是否需要加 “;” ,比较符合(=、<、>……)与左右两个的变量之间要由空格隔开。
#!/bin/sh
DIRECTORY=$1
if [ "`ls -A $DIRECTORY`" = "" ]; then
echo "$DIRECTORY is indeed empty"
else
echo "$DIRECTORY is not empty"
fi
或
DIRECTORY=$1
if [ "`ls -A $DIRECTORY`" = "" ]
then
echo "$DIRECTORY is indeed empty"
else
echo "$DIRECTORY is not empty"
fi
shell中[ ]和[[]]的区别
探索shell中[ ]和[[]]的区别_chen1415886044的博客-CSDN博客
多数情况下[ ]和[[]]是可以通用的,单中括号 [ ],bash 的内部命令,[和test是等同的。双中括号[[ ]],[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。
[ ] 和 [[]]区别
[ ]中可用的比较运算符只有==和!=,可用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。
[[ ]] 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ minger == ming? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
[[]]测试 | []测试 |
---|---|
< 排序比较 | 不支持 |
> 排序比较 | 不支持 |
&& 逻辑与 | -a 逻辑与 |
== 模式匹配 | ==字符匹配 |
=~正则匹配 | 不支持 |
判断目录是否为空
ls dirname
如果返回为空则目录为空
或者ls dirname|wc -l
如果结果为0则目录为空
最简单的方法:用ls -A $dir
好用的,测试过,对.file也能好用。
#!/bin/sh
#ifdirec
DIRECTORY=$1
#在此加上是不是目录的判断。
if [ "`ls -A $DIRECTORY`" = "" ]; then
echo "$DIRECTORY is indeed empty"
else
echo "$DIRECTORY is not empty"
fi
shell 判断文件/目录是否为空_jfkidear的专栏-CSDN博客_shell判断文件夹是否为空
#判断文件目录是否为空
第一种:
emptydir.sh
-----------------------------------------------------------
#!/bin/sh
DIRECTORY=$1
if [ "`ls -A $DIRECTORY`" = "" ]; then
echo "$DIRECTORY is indeed empty"
else
echo "$DIRECTORY is not empty"
fi
-----------------------------------------------------------
第二种:
count.sh
-----------------------------------------------------------
#!/bin/sh
count=`ls $*|wc -w`
if [ "$count" > "0" ];
then
echo "file size $count"
else
echo "empty!"
fi
-----------------------------------------------------------
#目录是否存在
ifmkdir.sh
-----------------------------------------------------------
#!/bin/sh
dir="test"
if [ ! -d $dir ]; then
echo "$dir not exists"
mkdir "$dir"
else
echo "$dir exists!"
fi
-----------------------------------------------------------
判断字符串包含关系
https://www.jb51.net/article/100490.htm
方法一:利用grep查找
1 2 3 4 5 6 7 8 9 |
|
先打印长字符串,然后在长字符串中 grep 查找要搜索的字符串,用变量result记录结果
如果结果不为空,说明strA包含strB。如果结果为空,说明不包含。
这个方法充分利用了grep 的特性,最为简洁。
方法二:利用字符串运算符
1 2 3 4 5 6 7 8 |
|
利用字符串运算符 =~ 直接判断strA是否包含strB。(这不是比第一个方法还要简洁吗!)
方法三:利用通配符
1 2 3 4 5 6 7 8 |
|
这个也很easy,用通配符*号代理strA中非strB的部分,如果结果相等说明包含,反之不包含。
方法四:利用case in 语句
1 2 3 4 5 6 |
|
这个就比较复杂了,case in 我还没有接触到,不过既然有比较简单的方法何必如此
方法五:利用替换
1 2 3 4 5 6 7 8 9 10 11 12 |
|
这个也挺复杂
判断字符串是否为数字
方法1
a=1234
echo "$a"|[ -n "`sed -n '/^[0-9][0-9]*$/p'`" ] && echo string a is numbers
第一个-n是shell的测试标志,对后面的串"`sed -n '/^[0-9][0-9]*$/p'`" 进行测试,如果非空,则结果为真。
sed默认会显示所有输入行信息的,sed 的“-n”选项是让sed不要显示,而只显示我们所需要的内容:即后面的表达式所匹配的行,这是通过表达式中加入“p”命令来实现的。
/^[0-9][0-9]*$/ 含义是匹配至少由一位数字构成的行
方法2
if grep '^[[:digit:]]*$' <<< "$1";then
echo "$1 is number."
else
echo 'no.'
fi
方法3
if [ "$1" -gt 0 ] 2>/dev/null ;then
echo "$1 is number."
else
echo 'no.'
fi
方法4
case "$1" in
[1-9][0-9]*)
echo "$1 is number."
;;
*)
;;
esac
方法5
echo $1| awk '{print($0~/^[-]?([0-9])+[.]?([0-9])+$/)?"number":"string"}'
if [ -n "$(echo $1| sed -n "/^[0-9]\+$/p")" ];then
echo "$1 is number."
else
echo 'no.'
fi
方法6
expr $1 "+" 10 &> /dev/null
if [ $? -eq 0 ];then
echo "$1 is number"
else
echo "$1 not number"
fi
if判断写成一行/命令行中用if
https://www.cnblogs.com/shiyiwen/p/8509417.html
1 2 3 |
|
命令行中用if
if [ $a -gt 70 ]; then echo "big";else echo "small"; fi
单引号和双引号的区别
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
shell脚本中字符串单引号和双引号的区别_fkuner的博客-CSDN博客
选项判断
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.
HW 电气项目历史脚本
#this file compiled with GBK (chinese)
________________________./source/script/create_db_script/readme.txt
set_auto_run.sh :设置自启动
Create_station_db.sh: 建立场站级
Create_center_db.sh:建立集团级如果创建的表格是带外键约束的,那么执行新的sql脚本脚本时,可能需要手动删除旧表(先删完子表,才能删父表)后,才能创建同名新表。
./source/script/create_db_script/sql/readme.txt
__________________________这里是建表的SQL脚本
外面的create_xxxx_db 脚本会先创建schema,然后调用建表脚本,将表导入。如果哪个表需要修改结构,只需修改后的表结构导出来,放到对应文件夹内即可。
这里用可视化工具mysql-front 导出sql 时遇到过一个问题,就是表带有触发器时,导出来的脚本有错,执行时报错。用SQLyoy导出(注意把触发器勾上,不然不会导出来)时就没这个问题。
#----------------------------------------------shell 脚本的一些方法说明-------------------
1、.fun文件:在里面定义一些函数,在.sh 脚本中 用 “." 加载后,直接调用里面的函数,如 .db.fun, 可以带参数,函数中的 $1 、$2 ……表示接受的第一个,第二个……参数,
如: create_station_db 20, create_station_db 函数内的$1 就是接收参数20的。脚本中用到的语法方法:
1、加载统一配置的文件
GLOBAL_CFG_FILE= `find ./ |grep global_config.txt` :将global_config.txt的路径赋值给GLOBAL_CFG_FILE,注意1、“`”符号不是单引号 2、. 被加载的文件不能是.sh文件
. {GLOBAL_CFG_FILE} #load cfg file :加载global_config.txt
如果报错,且在当前脚本文件找不到错误源,那可能是被加载的文件有错误(语法错误等)
2、${} 和$()${NAME} 和$NAME 都是引用替换变量NAME替换的内容,但是${}更好的限定了替换的范围 不然${AB}C 用 $ABC 就容易产生歧义
$(find ./ |grep global_config.sh) 和 `find ./ |grep global_config.sh` 一样的效果,都是执行命令,但是%()在有些shell下不支持
3、sed -i '/#hwBegin/,/#hwEnd/d' reame.txt
sed -i '/#hwBegin/,/#hwEnd/d' 就是将#hwBegin到#hwEnd之间内容,包括#hwBegin和#hwEnd都删除
4、echo " hello " > reame.txt 是将“hello”覆盖reame.txt内的内容
echo " hello " 》 reame.txt 是在reame.txt的末尾追加"hello"
5、shell中的if else 语句注意if 、elif和"[" 之间要有空格,"["和文字之间也要留有空格
if [ ${SERVER_NAME} == ${HOPE_CLOUD_SERVER_NAME}]; then
cd center_collector
./center_collector &
cd ..elif [ ${SERVER_NAME} == ${HOPE_VIEW_SERVER_NAME}; then
cd station_collector
./station_collector &
cd ..else
fi
6、xml 的ifif(a==22)
{
return a;
}
else
return b;
<xsl:choose>
<xsl:when test="a=22">
a
</xsl:when>
<xsl:otherwise>
b
</xsl:otherwise>
</xsl:choose>
可以嵌套么:
<xsl:choose>
<xsl:when test="a=22">
<xsl:choose>
<xsl:when test="a=22">
a
</xsl:when>
<xsl:otherwise>
b
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
b
</xsl:otherwise>
</xsl:choose>
7\#执行参数指定的文件夹下面(含子文件夹下面)的所有sql脚本#execute_all_sql_script() $1:在哪个SCHEMA执行sql $2:sql 脚本所在的文件夹
function execute_all_sql_script()
{
for sqlfile in `ls $2`
#$2 为执行脚本时后面跟的第2个参数do
if [ -d $2'/'${sqlfile} ]; then
#如果是个子文件夹 则进去 递归execute_all_sql_script $2'/'${sqlfile}
else
if [ "${sqlfile##*.}" = "sql" ]; then
#判断文件后缀名是否是sql,是就执行mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} $1 < $2/${sqlfile}
fi
fi
done
}
8\如果只显示所在目录的路径:
find 目录 -type d -name "查询目录名" -printf "%h\n"
如果同时显示目录名称和所在目录的路径:
find 目录 -type d -name "查询目录名" -printf "%p %h\n"
find . -name *.txt -mtime +2 -exec rm {} \;
在linux下-exec经常和find一起使用,当匹配到一些文件以后,希望对其进行某些操作,这时就可以使用-exec选项,一旦find命令匹配到了相应的文件,就可以用-exec选项中的命令对其进行操作(在有些操作系统中只允许-exec选项执行诸如ls或ls -l这样的命令),exec选项后面跟随着所要执行的命令,然后是一对儿{},一个空格和一个\ ,最后是一个分号。举个例子:查询当前目录下2天以上的txt文件,然后删除它们find . -name *.txt -mtime +2 -exec rm {} \;{}代表的是由find找到的内容,而-exec一直到“\;”是关键字,代表find额外命令的开始(-exec)到结束(\;),在这中间的就是find命令内的额外命令。