shell 中if 喜欢用的表达式

来源:互联网 发布:我是皇进阶数据 编辑:程序博客网 时间:2024/05/22 17:41

if 使用的表达式

Primary 意义
[ -a 文件 ] 如果文件存在为真。
[ -b 文件 ] 如果 文件 存在 而且 是一个 块-特殊 文件为真。
[ -c 文件 ] 为真 如果 文件 存在 而且 是一个 字-特殊 文件。

[ -d 文件 ] 为真 如果 文件 存在 而且 是一个 目录。
[ -e 文件 ] 为真 如果 文件 存在。
[ -f 文件 ] 为真 如果 文件 存在 而且 是一个 普通 文件。
[ -g 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SGID 位。
[ -h 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。
[ -k 文件 ] 为真 如果 文件 存在 而且 他的粘住位已经设置。
[ -p 文件 ] 为真 如果 文件 存在 而且 是一个 已经命名的管道 (F 如果O)。
[ -r 文件 ] 为真 如果 文件 存在 而且 是可读的。
[ -s 文件 ] 为真 如果 文件 存在 而且 比零字节大。
[ -t FD ] 为真 如果 文件 文件描述符已经打开 而且 指向一个终端。
[ -u 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SUID (set user ID)位。
[ -w 文件 ] 为真 如果 文件 为真 如果 文件 存在 而且 是可写的。
[ -x 文件 ] 为真 如果 文件 存在 而且 是可执行的。
[ -O 文件 ] 为真 如果 文件 存在 而且 属于有效用户ID。
[ -G 文件 ] 为真 如果 文件 存在 而且 属于有效组ID。
[ -L 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。
[ -N 文件 ] 为真 如果 文件 存在 而且 has been mod 如果ied since it was last read。
[ -S 文件 ] 为真 如果 文件 存在 而且 是一个 socket。
[ 文件1 -nt 文件2 ] 为真 如果 文件1 has been changed more recently than 文件2, or 如果
文件1 存在 而且
文件2 does not。
[ 文件1 -ot 文件2 ] 为真 如果 文件1 比 文件2 旧, 或者 文件2 存在而且 文件1 不存在。
[ 文件1 -ef 文件2 ] 为真 如果 文件1 而且 文件2 refer to the same device 而且 inode
numbers。
[ -o 选项名 ] 为真 如果 shell 选项 "选项名" 开启。
[ -z STRING ] 为真 如果 "STRING"的长度是零。
[ -n STRING ] 或者 [ STRING ] 为真 "STRING"的长度是非零值。
[ STRING1 == STRING2 ] 如果两个字符串相等为真。 "=" 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" 是 -eq, -ne, -lt, -le, -gt or -ge 其中一个。 These arithmetic binary operators
return 为真 如果 "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" 而且 "ARG2" are
integers。
表达式可以借以下操作符组合起来, listed in decreasing order of precedence:
操作符效果
[ ! EXPR ] 如果EXPR 为假则为真。
[ ( EXPR ) ] 返回EXPR 的值。 这样可以用来忽略正常的操作符优先级。

[ 表达式1 -a 表达式2 ] 如果表达式1 而且表达式2 同时为真则为真 。
[ 表达式1 -o 表达式2 ] 如果表达式1 或者表达式2 其中之一为真则为真。
 

If语句:
1,if[expression]
then
  #code block
fi
2,if[expression]
then
  #code block
else
    #code block
fi
3,if[expression]
then
  #code block
else
if[expression]
then
#code block
else
#code block
fi
fi
比较操作       整数操作      字符操作:
相同             -eq               =
不同             -ne              !=
大于             -ge               >
小于             -lt                <
大于或等于       -ge
小于或等于       -le
为空             -z
不为空           -n
例:
比较整数a和b是否相等:if [ $a = $b ](也可用eq)
判断整数a是否大于整数b:if [ $a -gt $b ]
比较字符串a和b是否相等:if [ $a = $b ]
判断字符串a是否为空:if [ -z $a ]
判断整数变量a是否大于b:if [ $a -gt $b ]
注意:
1,在“[”和"]"符号的左右都留有空格
2,“=”左右都有空格
判断:
-e 文件已经存在
-f 文件是普通文件
-s 文件大小不为零
-d 文件是一个目录
-r  文件对当前用户可以读取
-w 文件对当前用户可以写入
-x 文件对当前用户可以执行
例:
#!/bin/sh
folder=/home
[ -r "$folder" ] && echo"Can read $foldeer"(当[ -r "$folder" ]为真时才考虑后面的条件,可以被打印出来)
[ -f "folder" ] || echo"this is not file"(当[ -f "folder"]为假时才考虑后面的条件,可以被打印出来 )
for循环结构与c语言中有所不同,在BASH中for循环的基本结构是:
for var in [list]
do
 #code block
done
其中$var是循环控制变量,[list]是var需要遍历的一个集合,do/done对包含了循环体,相当于c语言中的一对大括号。另外如果do和for被写在同一行,必须在do前面加上“;”。如:for $var in [list];do
例:
1,#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do 
  echo $day
done
运行结果:Sun
         Mon
         Tue
         Wed
         Thu
         Fri
         Sat

2,如果列表被包含在一对双引号中,则被认为是一个元素:
#!/bin/bash
for day in "Sun Mon Tue Wed Thu Fri Sat"
do
   echo $day
done
运行结果:Sun Mon Tue Wed Thu Fri Sat
注意:在for所在那行,变量day是没有加“$”符号的,而在循环体内,echo所在行变量$day是必须加上“$’符号的。
while循环结构是:
while [condition]
do
  #code block
done
until循环结构是:
until [condition]
do
  #code block
done
while和until区别在于while是为真时执行,until是为假时执行
BASH中的case结构与c语言中的switch语句的功能比较类似,可以用于进行多项分支控制。
case "$var"in
  Condition1)
     ;;
   Condition2)
      ;;
    *)
       default statments;;
esac
例:
#!/bin/bash
echo "Hit a key, then hit return."
read keypress
case "$keypress"in
  [A-Z] echo "Uppercase letter";;
  [a-z] echo "Lowercase letter";;
  [0-9] echo "Digit";;
*) echo "Punctuation, whitespace, or otheer";;
esac

原创粉丝点击