200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 【shell】if常用判断|if目录是否为空|判断字符串包含关系|与或

【shell】if常用判断|if目录是否为空|判断字符串包含关系|与或

时间:2019-07-09 16:32:19

相关推荐

【shell】if常用判断|if目录是否为空|判断字符串包含关系|与或

目录

shell中[ ]和[[]]的区别

判断目录是否为空

判断字符串包含关系

if判断写成一行/命令行中用if

单引号和双引号的区别

if常用判断

作者:bandaoyu 持续更新,连接:/mVBjJ

shell中的if语句 /wxx_0124/article/details/95305625

shell中[ ]和[[]]的区别

探索shell中[ ]和[[]]的区别_chen1415886044的博客-CSDN博客

多数情况下[ ]和[[]]是可以通用的,单中括号 [ ],bash 的内部命令,[和test是等同的。双中括号[[ ]],[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。

[ ] 和 [[]]区别

[ ]中可用的比较运算符只有==和!=,可用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。

[[ ]] 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ minger == ming? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

判断目录是否为空

lsdirname

如果返回为空则目录为空

或者lsdirname|wc-l

如果结果为0则目录为空

最简单的方法:用ls-A$dir

好用的,测试过,对.file也能好用。

#!/bin/sh#ifdirecDIRECTORY=$1#在此加上是不是目录的判断。if [ "`ls -A $DIRECTORY`" = "" ]; thenecho "$DIRECTORY is indeed empty"elseecho "$DIRECTORY is not empty"fi

shell 判断文件/目录是否为空_jfkidear的专栏-CSDN博客_shell判断文件夹是否为空

#判断文件目录是否为空第一种:emptydir.sh-----------------------------------------------------------#!/bin/shDIRECTORY=$1if [ "`ls -A $DIRECTORY`" = "" ]; thenecho "$DIRECTORY is indeed empty"elseecho "$DIRECTORY is not empty"fi-----------------------------------------------------------第二种:count.sh-----------------------------------------------------------#!/bin/shcount=`ls $*|wc -w`if [ "$count" > "0" ];thenecho "file size $count"elseecho "empty!"fi-----------------------------------------------------------#目录是否存在ifmkdir.sh-----------------------------------------------------------#!/bin/shdir="test"if [ ! -d $dir ]; thenecho "$dir not exists"mkdir "$dir"elseecho "$dir exists!"fi-----------------------------------------------------------

判断字符串包含关系

/article/100490.htm

方法一:利用grep查找

先打印长字符串,然后在长字符串中 grep 查找要搜索的字符串,用变量result记录结果

如果结果不为空,说明strA包含strB。如果结果为空,说明不包含。

这个方法充分利用了grep 的特性,最为简洁。

方法二:利用字符串运算符

利用字符串运算符 =~ 直接判断strA是否包含strB。(这不是比第一个方法还要简洁吗!)

方法三:利用通配符

这个也很easy,用通配符*号代理strA中非strB的部分,如果结果相等说明包含,反之不包含。

方法四:利用case in 语句

这个就比较复杂了,case in 我还没有接触到,不过既然有比较简单的方法何必如此

方法五:利用替换

这个也挺复杂

if判断写成一行/命令行中用if

/shiyiwen/p/8509417.html

命令行中用if

if [ $a -gt 70 ]; then echo "big";else echo "small"; fi

单引号和双引号的区别

单引号字符串的限制:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号的优点:

双引号里可以有变量双引号里可以出现转义字符

shell脚本中字符串单引号和双引号的区别_fkuner的博客-CSDN博客

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和右边的括号之间也有空格。

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 ]如果<

规则说明:

-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" ]

< 小于(需要双括号)(( "$a"< "$b" ))

<= 小于等于(...) (("$a" <= "$b" ))

> 大于(...)(("$a" > "$b" ))

>= 大于等于(...) (("$a" >= "$b" ))

PS:小数据比较可使用AWK

3、文件的判断

-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” ]

[ -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 指向相同的设备和节点号则为真。

例子:文件判断

文件夹不存在则创建

文件存在则删除

判断文件夹是否存在

判断文件是否存在

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 中的与、或表达式 - /zhangqigao/p/6215388.html

选项判断

[ -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 的if

if(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命令内的额外命令。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。