【shell】if判断|if目录是否存在|文件是否存在|判断字符串包含关系|与或

目录

if常用判断

1、字符串判断

2、数字的判断|小数点判断

3、文件/目录判断

4、复杂逻辑判断

语法

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" ],与=等价


注意:==的功能在[[]]和[]中的行为是不同的,如下:

1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true
2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
3
4 [ $a == z* ] # File globbing 和word splitting将会发生
5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true

一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.
但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

!= 不等于,如:if [ "$a" != "$b" ]
这个操作符将在[[]]结构中使用模式匹配.
< 小于,在ASCII字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意:在[]结构中"<"需要被转义.
> 大于,在ASCII字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意:在[]结构中">"需要被转义.
具体参考Example 26-11来查看这个操作符应用的例子.
-z 字符串为"null".就是长度为0.
-n 字符串不为"null"

注意:

使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z
或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可
以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.


awk '{print $2}' class.txt | grep '^[0-9.]' > res

规则说明: 

If [ $a == $b ]   如果string1等于string2,字符串允许使用=做等号,但还是建议严格使用==

if [ $string1 != $string2 ] 如果string1不等于string2

if [ -n $string ]  如果string 非空(非0),记得string 是带双引号的,如:“$NAME"

if [ -z $string ] 如果string 为空,

if [ $sting ]   如果string 非空,返回0 (和-n类似)   

!=    不等于         if [ "$a" !="$b" ] 

<     小于,在ASCII字母中的顺序: 

      if [[ "$a" < "$b" ]]     如果"$a" 字典排序在"$b"前面则返回为真。

      if [ "$a"  \<  "$b" ]         #需要对<进行转义 

>     大于 

[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。

字符串判断使用双中括号[[]]:

解决SHELL编程中的”[: =: BINARY OPERATOR EXPECTED”

if [ -n $curStr ];then
sentence
fi
如果$curStr为空,就会产生”[: =: binary operator expected” 的错误。

解决办法:

if [[ -n $curStr ]];then
sentence
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

基本上和其他脚本语言一样。没有太大区别。不过值得注意的是。[]里面的条件判断。

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

比较:

方法一: if [ ${A} -lt ${B} ]; then ...
这是最基本的比较方法,使用lt(小于),gt(大于),le(小于等于),ge(大于等于),优点:还没发现;缺点:只能比较整数,使用lt,gt等不直观

方法二: if ((${A} < ${B})) then ...
这是CShell风格比较,优点:不用使用lt,gt等难记的字符串;缺点:还是只能比较整数

方法三: if (echo ${A} ${B} | awk '!($1>$2){exit 1}') then ...
这是使用awk比较,优点:可以比较小数;缺点:表达式太复杂,难记

方法四: if (echo ${A} - ${B} | bc -q | grep -q "^-"); then ...
这是使用bc计算比较,优点:可以比较小数;缺点:表达式更复杂,难记

计算:
方法一:typeset C=$(expr ${A} + ${B});
SHELL中的基本工具,优点:方便检测变量是否为数字;缺点:只能计算整数,且只能计算加减法,不能计算乘除法

方法二:let "C=${A}+${B}"; 或 let "C=A+B"
内嵌命令计算,优点:能计算乘除法及位运算等;缺点:只能计算整数

方法三:typeset C=$((A+B))
CShell风格的计算,优点:能计算乘除法及位运算等,简介,编写方便;缺点:不能计算小数

方法四:typeset C=${echo ${A} ${B} | awk '{print $1+$2}')
使用awk计算,优点:能计算小数,可以实现多种计算方式,计算灵活;缺点:表达式太复杂

方法五:typeset C=${echo ${A} + ${B} | bc -q)
使用awk计算,优点:能计算小数,计算方式比awk还多,计算灵活;缺点:表达式太复杂,小数点后面的位数必须使用scale=N来设置,否则可能会将结果截断为整数

3、文件/目录判断

注意事项:

在处理文件名称中包含有空格的文件时,请使用双引号避免出现一些处理问题。

通常需要使用到文件操作符-e-f。第一个-e用来检查文件是否存在,而不管文件类型。第二个-f仅仅用来检查文件是常规文件(不是目录或设备)时返回true。

test命令包含以下文件操作运算符,这些运算符允许你测试不同类型的文件:

  • -b FILE - 如果文件存在并且是块特殊文件,则为True。
  • -c FILE - 如果文件存在并且是特殊字符文件,则为True。
  • -d FILE - 如果文件存在并且是目录,则为True。
  • -e FILE - 如果文件存在并且是文件,则为True,而不考虑类型(节点、目录、套接字等)。
  • -f FILE - 如果文件存在并且是常规文件(不是目录或设备),则为True。
  • -G FILE - 如果文件存在并且与运行命令的用户具有相同的组,则为True。
  • -h FILE - 如果文件存在并且是符号链接,则为True。
  • -g FILE - 如果文件存在并已设置组id(sgid)标志,则为True。
  • -k FILE - 如果文件存在并设置了粘滞位标志,则为True。
  • -L FILE - 如果文件存在并且是符号链接,则为True。
  • -O FILE - 如果文件存在并且由运行该命令的用户拥有,则为True。
  • -p FILE - 如果文件存在并且是管道,则为True。
  • -r FILE - 如果文件存在且可读,则为True。
  • -S FILE - 如果文件存在并且是套接字,则为True。
  • -s FILE - 如果文件存在且大小不为零,则为True。
  • -u FILE - 如果文件存在并且设置了(suid)标志,则为True。
  • -w FILE - 如果文件存在且可写,则为True。
  • -x FILE - 如果文件存在且可执行,则为True。

  • [ -t FD ]  如果文件描述符 FD 打开且指向一个终端则为真。  
  •  [ -N FILE ]  如果 FILE 存在 and has been mod如果ied since it was last read则为真。  
  •  [ 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” ]

01、检查文件是否存在

当你在shell中需要检查一个文件是否存在时,通常需要使用到文件操作符-e-f。第一个-e用来检查文件是否存在,而不管文件类型。第二个-f仅仅用来检查文件是常规文件(不是目录或设备)时返回true。

当检查文件是否存在时,命令中的操作选项通常将test命令不同格式和if语句结合使用。下面的示例shell代码将检查/etc/resolv.conf文件是否存在。

FILE=/etc/resolv.conf
if test -f "$FILE"; then
    echo "$FILE exist"
fi
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE exist"
fi
FILE=/etc/resolv.conf
if [[ -f "$FILE" ]]; then
    echo "$FILE exist"
fi

如果你需要通过判断文件是否存在进行不同的操作,只需要使用类似如下if/then格式语句即可。

FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE exist"
else 
    echo "$FILE does not exist"
fi

在处理文件名称中包含有空格的文件时,请使用双引号避免出现一些处理问题。你也可以在不使用if语句的情况下使用test命令,只有当test命令执行后的结果为true时,跟在test命令&&运算符之后的内容才会被执行。

示例如下:

test -f /etc/resolv.conf && echo "$FILE exist"
[ -f /etc/resolv.conf ] && echo "$FILE exist"
[[ -f /etc/resolv.conf ]] && echo "$FILE exist"

如果要在&&运算符之后运行一系列命令,只需将命令括在用&&分隔的大括号中:

[ -f /etc/resolv.conf ] && { echo "$FILE exist"; cp "$FILE" /tmp/; }

&&相反,只有在test命令的exit状态为false时,才会执行||运算符后面的语句。

[ -f /etc/resolv.conf ] && echo "$FILE exist" || echo "$FILE does not exist"

通配符检查文件是否存在

https://blog.csdn.net/qfzhangwei/article/details/106975622

files=$(ls mydir/*.jar 2> /dev/null | wc -l); 
 
if [ "$files" != "0" ] ;then  #如果存在文件
 
rm adonis/*.jar; 
 
fi

02、检查目录是否存在

Linux系统中运算符-d允许你测试一个文件是否时目录。

例如检查/etc/docker目录是否存在,你可以使用如下脚本:

FILE=/etc/docker
if [ -d "$FILE" ]; then
    echo "$FILE is a directory"
fi
[ -d /etc/docker ] && echo "$FILE is a directory"

如果你喜欢你也可以使用双括号[[代替脚本中的单括号[

03、检查文件是否不存在

和其他语言相似,test表达式允许使用!(感叹号)做逻辑not运算,示例如下:

FILE=/etc/docker
if [ ! -f "$FILE" ]; then
    echo "$FILE does not exist"
fi
[ ! -f /etc/docker ] && echo "$FILE does not exist"

04、检查是否存在多个文件

不使用复杂的嵌套if/else构造,您可以使用-a(或带[[&&预算符)来测试是否存在多个文件,示例如下:

if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
    echo "Both files exist."
fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then
    echo "Both files exist."
fi

以下脚本语句为不使用if语句等效语句:

[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."

你也可以在不使用if语句的情况下使用test命令,只有当test命令执行后的结果为true时,跟在test命令&&运算符之后的内容才会被执行。

示例如下:

test -f /etc/resolv.conf && echo "$FILE exist"
[ -f /etc/resolv.conf ] && echo "$FILE exist"
[[ -f /etc/resolv.conf ]] && echo "$FILE exist"

如果要在&&运算符之后运行一系列命令,只需将命令括在用&&分隔的大括号中:

[ -f /etc/resolv.conf ] && { echo "$FILE exist"; cp "$FILE" /tmp/; }

&&相反,只有在test命令的exit状态为false时,才会执行||运算符后面的语句。

[ -f /etc/resolv.conf ] && echo "$FILE exist" || echo "$FILE does not exist"

4、复杂逻辑判断

[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件

逻辑与的表达:

您可以使用-a(或带[[&&预算符)来测试是否存在多个文件,示例如下:

if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
    echo "Both files exist."
fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then
    echo "Both files exist."
fi

以下脚本语句为不使用if语句等效语句:

[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."

逻辑或的表达:
1)、if [ $xxx=a -o $xx=b ]

注:-o表示or的意思
2)、if [ $xxx=a ] || [  $xx=b ]

shell 中的与、或表达式 - https://www.cnblogs.com/zhangqigao/p/6215388.html

判断一个命令是否存在

避免使用which,which非内置命令:

$ command -v foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }
$ type foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }
$ hash foo 2>/dev/null || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }

语法

注意:[] 后面是否需要加 “;” ,比较符合(=、<、>……)与左右两个的变量之间要由空格隔开。

#!/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中的if elif else 语句

注意if 、elif和"[" 之间要有空格

if [ ${SERVER_NAME} == ${HOPE_CLOUD_SERVER_NAME}]; then

……

elif [ ${SERVER_NAME} == ${HOPE_VIEW_SERVER_NAME}; then

……

else

……
fi


 

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

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

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

[ ] 和 [[]]区别

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

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

 

[[]]测试[]测试
< 排序比较不支持
> 排序比较不支持
&& 逻辑与-a 逻辑与
== 模式匹配==字符匹配
=~正则匹配不支持

linux之、 [ ] 、 { }、[ ]、、[]、( )、[ ] 、 [ ]、[]、(( ))、[[ ]]、(( ))的作用

案例1:
if [ $1 -gt  5 ];then
        echo "$1的值大于5"
elif [ $1 -eq 5 ];then
        echo "$1的值等于5"
else
        echo "$1的值小于5"
fi

案例2:
if [[ $1 >  5 ]];then
        echo "$1的值大于5"
elif [[ $1 == 5 ]];then
        echo "$1的值等于5"
else
        echo "$1的值小于5"
fi

案例3:从命令行获取路径参数并且判断当前路径是否存在,如果存在判断文件类型
if test -e ./$1;then
        echo "当前目录下$1存在"
        if test -f ./$1;then
                echo "$1是文件类型!"
        elif test -d ./$1;then
                echo "$1是文件夹类型!"
        else 
                echo "$1既不是文件也不是文件夹!"
        fi
else
        echo "当前目录下$1不存在"
fi

判断目录是否为空

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

-----------------------------------------------------------

判断字符串包含关系

见文章:http://t.csdn.cn/vHMmn

判断字符串是否为数字

转自:http://t.csdn.cn/YuCvC

方法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

[[ $? -eq 0 ]] && echo "backup $i success" || exit

#判断上一个命令是否执行正确,退出状态吗如果为0,则执行echo 。否则会认为[[ $? -eq 0 ]] && echo "backup $i success" 这一段执行错误,就会退出

命令行中用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 的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命令内的额外命令。

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值