目录
if常用判断
多数情况下[ ]和[[]]是可以通用的,单中括号 [ ],bash 的内部命令,[和test是等同的。双中括号[[ ]],[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。
[ ] 和 [[]]区别
[ ]中可用的比较运算符只有==和!=,可用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。
[[ ]] 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ minger == ming? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
[[]]测试 | []测试 |
< 排序比较 | 不支持 |
> 排序比较 | 不支持 |
&& 逻辑与 | -a 逻辑与 |
== 模式匹配 | ==字符匹配 |
=~正则匹配 | 不支持 |
ls dirname
如果返回为空则目录为空
或者ls dirname|wc -l
如果结果为0则目录为空
最简单的方法:用ls -A $dir
好用的,测试过,对.file也能好用。
#ifdirec
DIRECTORY=$1
#在此加上是不是目录的判断。
if [ "`ls -A $DIRECTORY`" = "" ]; then
echo "$DIRECTORY is indeed empty"
else
echo "$DIRECTORY is not empty"
fi
#判断文件目录是否为空
第一种:
emptydir.sh
-----------------------------------------------------------
DIRECTORY=$1
if [ "`ls -A $DIRECTORY`" = "" ]; then
echo "$DIRECTORY is indeed empty"
else
echo "$DIRECTORY is not empty"
fi
-----------------------------------------------------------
第二种:
count.sh
-----------------------------------------------------------
count=`ls $*|wc -w`
if [ "$count" > "0" ];
then
echo "file size $count"
else
echo "empty!"
fi
-----------------------------------------------------------
#目录是否存在
ifmkdir.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 | |
这个也挺复杂
单引号和双引号的区别单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
if常用判断注意[] 后面是否需要加 “;”
文件表达式
if [ -f file ]; 如果文件存在
if [ -d ... ]; 如果目录存在
if [ -s file ]; 如果文件存在且非空 if [ -r file ] 如果文件存在且可读 if [ -w file ] 如果文件存在且可写 if [ -x file ] 如果文件存在且可执行
整数变量表达式
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 ]如果<
字符串变量表达式
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类似)
条件表达式引用变量要带$
if [ a = b ] ;then
echo equal else echo no equal
fi
[macg@machome ~]$ sh test.sh input a: 5 input b: 5 no equal (等于表达式没比较$a和$b,而是比较和a和b,自然a!=b)
改正:
if [ $a = $b ] ;then
echo equal else echo no equa
l fi
[macg@machome ~]$ sh test.sh input a: 5 input b: 5 equal
前言:
if list then
do something here
elif list then
do another thing here
else
do something else here
fi
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
基本上和其他脚本语言一样。没有太大区别。不过值得注意的是。[]里面的条件判断。
1、字符串判断
str1 = str2 当两个串有相同内容、长度时为真
str1 != str2 当串str1和str2不等时为真
-n str1 当串的长度大于0时为真(串非空) ,记得str1是带双引号的,如:“$NAME"
-z str1 当串的长度为0时为真(空串)
str1 当串str1为非空时为真
2、数字的判断
int1 -eq int2 两数相等为真
int1 -ne int2 两数不等为真
int1 -gt int2 int1大于int2为真
int1 -ge int2 int1大于等于int2为真
int1 -lt int2 int1小于int2为真
int1 -le int2 int1小于等于int2为真
3、文件的判断
-r file 用户可读为真
-w file 用户可写为真
-x file 用户可执行为真
-f file 文件为正规文件为真
-d file 文件为目录为真
-c file 文件为字符特殊文件为真
-b file 文件为块特殊文件为真
-s file 文件大小非0时为真
-t file 当文件描述符(默认为1)指定的设备为终端时为真
4、复杂逻辑判断
-a 与
-o 或
! 非
结尾
语法虽然简单,但是在SHELL里使用的时候,他的功能变得强大了。
=====================================================================
附 表:
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 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 如果 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 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ] “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。
[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 != STRING2 ] 如果字符串不相等则为真。
[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
[ 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.
#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 "
如果同时显示目录名称和所在目录的路径:
find 目录 -type d -name "查询目录名" -printf "%p %h "
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命令内的额外命令。
二,shell语句的比较操作符
1,整数比较
规则说明:
-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
示例代码:
[root@squid-2 script]# cat com1.sh
a=$1
b=$2
if [ "$a" -eq "$b" ];then
echo"a = b true."
elif [ ! "$a" -gt "$b" ];then
echo"a > b true."
else echo "a < b true."
fi
[root@squid-2 script]#
测试结果如下:
[root@squid-2 script]# sh com1.sh 1 1
a = b true.
[root@squid-2 script]# sh com1.sh 1 2
a > b true.
[root@squid-2 script]# sh com1.sh 1 0
a < b true.
[root@squid-2 script]#
2,字符串比较
2.1,规范以及使用
规则说明:
= 等于 if [ "$a"= "$b" ]
== 与=等价
!= 不等于 if [ "$a" ="$b" ]
< 小于,在ASCII字母中的顺序:
if [[ "$a" < "$b" ]]
if [ "$a" < "$b" ] #需要对<进行转义
> 大于
-z 字符串为null,即长度为0
-n 字符串不为null,即长度不为0
SHELL 与或表达逻辑与的表达:
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 判断文件夹或文件是否存在文件夹不存在则创建
1 2 3 4 5 | |
文件存在则删除
1 2 3 4 5 | |
判断文件夹是否存在
1 2 3 4 5 | |
判断文件是否存在
1 2 3 4 5 | |
文件比较符
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
本文摘自 :https://blog.51cto.com/l