shell if 语句

本文详细介绍了Linux shell中用于文件和字符串比较的各种运算符,包括文件存在性、类型、权限以及字符串的长度和内容比较。这些运算符在shell脚本中用于条件判断,如文件是否存在、是否可读写、字符串是否相等等,对于系统管理和自动化任务至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[-a file] 如果file存在则为真 

不过貌似有时候-a表示为and:条件与

[-b file] 如果file存在且是一个块特殊文件则为真 
[-c file] 如果file存在且是一个字特殊文件则为真 
[-d file] 如果file文件存在且是一个目录则为真 
-d前的!是逻辑非 
例如: 
if [ ! -d $lcd_path/$par_date ] 
表示后面的那个目录不存在,则执行后面的then操作 
[-e file] 如果file文件存在则为真 
[-f file] 如果file存在且是一个普通文件则为真 
[-g file] 如果file存在且已经设置了SGID则为真(SUID 是 Set User ID, SGID 是 Set Group ID的意思) 
[-h file] 如果file存在且是一个符号连接则为真 
[-k file] 如果file存在且已经设置粘制位则为真 
当一个目录被设置为"粘制位"(用chmod a+t),则该目录下的文件只能由 
一、超级管理员删除 
二、该目录的所有者删除 
三、该文件的所有者删除 
也就是说,即便该目录是任何人都可以写,但也只有文件的属主才可以删除文件。 
具体例子如下: 
#ls -dl /tmp 
drwxrwxrwt 4 root    root  ......... 
注意other位置的t,这便是粘连位。 
[-p file] 如果file存在且是一个名字管道(F如果O)则为真 
管道是linux里面进程间通信的一种方式,其他的还有像信号(signal)、信号量、消息队列、共享内存、套接字(socket)等。 
[-r file] 如果file存在且是可读的则为真 
[-s file] 如果file存在且大小不为0则为真 
[-t FD] 如果文件描述符FD打开且指向一个终端则为真 
[-u file] 如果file存在且设置了SUID(set userID)则为真 
[-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或者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则为真 
[sting1==string2] 如果2个字符串相同。“=”may be used instead of “==”for strict posix compliance则为真 
[string1!=string2] 如果字符串不相等则为真 
[string1<string2] 如果“string1”sorts before“string2”lexicographically in the current locale则为真 
[arg1 OP arg2] “OP”is one of –eq,-ne,-lt,-le,-gt or –ge.These arithmetic binary oprators 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“agr2”,respectively.“arg1”and “agr2”are integers. 

===========================================================================

常用:

shell 编程中使用到得if语句内判断参数

  –b 当file存在并且是块文件时返回真

  -c 当file存在并且是字符文件时返回真

  -d 当pathname存在并且是一个目录时返回真

  -e 当pathname指定的文件或目录存在时返回真

  -f 当file存在并且是正规文件时返回真

  -g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真

  -h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效

  -k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真

  -p 当file存在并且是命令管道时返回为真

  -r 当由pathname指定的文件或目录存在并且可读时返回为真

  -s 当file存在文件大小大于0时返回真

  -u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真

  -w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。

  -o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。

  UNIX Shell 里面比较字符写法:

  -eq   等于

  -ne    不等于

  -gt    大于

  -lt    小于

  -le    小于等于

  -ge   大于等于

  -z    空串

  =    两个字符相等

  !=    两个字符不等

  -n    非空串

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

  更为详细的说明:

  运算符                     描述                          示例

  文件比较运算符

  -e filename     如果 filename 存在,则为真            [ -e /var/log/syslog ]

  -d filename     如果 filename 为目录,则为真          [ -d /tmp/mydir ]

  -f filename     如果 filename 为常规文件,则为真      [ -f /usr/bin/grep ]

  -L filename     如果 filename 为符号链接,则为真      [ -L /usr/bin/grep ]

  -r filename     如果 filename 可读,则为真            [ -r /var/log/syslog ]

  -w filename     如果 filename 可写,则为真            [ -w /var/mytmp.txt ]

  -x filename     如果 filename 可执行,则为真          [ -L /usr/bin/grep ]

  filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]

  filename1 -ot filename2   如果 filename1 比 filename2 旧,则为真  [ /boot/bzImage -ot arch/i386/boot/bzImage ]

  字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

-z string               如果 string 长度为零,则为真               [ -z $myvar ]

  -n string                      如果 string 长度非零,则为真        [ -n $myvar ]

  string1 = string2         如果 string1 与 string2 相同,则为真     [ $myvar = one two three ]

  string1 != string2        如果 string1 与 string2 不同,则为真     [ $myvar != one two three ]

  算术比较运算符

  num1 -eq num2              等于         [ 3 -eq $mynum ]

  num1 -ne num2              不等于       [ 3 -ne $mynum ]

  num1 -lt num2               小于        [ 3 -lt $mynum ]

  num1 -le num2            小于或等于     [ 3 -le $mynum ]

  num1 -gt num2             大于          [ 3 -gt $mynum ]

  num1 -ge num2             大于或等于    [ 3 -ge $mynum ]

  脚本示例:

  #!/bin/bash

  # This script prints a message about your weight if you give it your

  # weight in kilos and hight in centimeters.

  if [ ! $# == 2 ]; then

  echo "Usage: $0 weight_in_kilos length_in_centimeters"

  exit

  fi

  weight="$1"

  height="$2"

  idealweight=$[$height - 110]

  if [ $weight -le $idealweight ] ; then

  echo "You should eat a bit more fat."

  else

  echo "You should eat a bit more fruit."

  fi

  # weight.sh 70 150

  You should eat a bit more fruit.

  # weight.sh 70 150 33

  Usage: ./weight.sh weight_in_kilos length_in_centimeters

  位置参数 $1, $2,..., $N,$#代表了命令行的参数数量, $0代表了脚本的名字,

  第一个参数代表$1,第二个参数代表$2,以此类推,参数数量的总数存在$#中,上面的例子显示了怎么改变脚本,如果参数少于或者多余2个来打印出一条消息。

  执行,并查看情况。

  # bash -x tijian.sh 60 170

  + weight=60

  + height=170

  + idealweight=60

  + '[' 60 -le 60 ']'

  + echo 'You should eat a bit more fat.'

  You should eat a bit more fat.

  其中-x用来检查脚本的执行情况。

### Shell脚本中if语句的使用方法 在Shell脚本中,`if`语句用于条件判断和执行相应的代码块。以下是关于如何使用`if`语句的详细说明[^1]。 #### 1. 基本语法 最简单的`if`语句形式如下: ```bash if [ 条件 ]; then # 符合条件时执行的语句 fi ``` 这里的`[ 条件 ]`是一个测试命令,通常使用方括号`[]`包围条件表达式。 #### 2. 使用`else`分支 如果需要在条件不满足时执行其他代码,可以添加`else`分支: ```bash if [ 条件 ]; then # 符合条件时执行的语句 else # 不符合条件时执行的语句 fi ``` #### 3. 使用`elif`分支 当有多个条件需要判断时,可以使用`elif`(即`else if`)来扩展逻辑: ```bash if [ 条件1 ]; then # 符合条件1时执行的语句 elif [ 条件2 ]; then # 符合条件2时执行的语句 else # 所有条件都不符合时执行的语句 fi ``` #### 4. 字符串比较 在Shell中进行字符串比较时,需要注意以下几点: - 使用`= `或`!=`进行字符串相等性或不相等性判断。 - 必须将字符串用双引号括起来以避免空值或其他特殊字符引发错误[^3]。 示例代码: ```bash if [ "$str1" = "$str2" ]; then echo "两个字符串相等" else echo "两个字符串不相等" fi ``` #### 5. 数字比较 对于数字比较,可以使用以下操作符: - `-eq`:等于 - `-ne`:不等于 - `-gt`:大于 - `-lt`:小于 - `-ge`:大于等于 - `-le`:小于等于 示例代码: ```bash if [ $num -eq 10 ]; then echo "数字等于10" else echo "数字不等于10" fi ``` #### 6. 文件测试 Shell中的`if`语句还可以用来测试文件的状态。常见的文件测试操作符包括: - `-e`:文件是否存在 - `-f`:是否为普通文件 - `-d`:是否为目录 - `-r`:是否可读 - `-w`:是否可写 - `-x`:是否可执行 示例代码: ```bash if [ -f "$filename" ]; then echo "这是一个普通文件" else echo "这不是一个普通文件" fi ``` #### 7. 综合案例 以下是一个综合使用的示例,展示如何结合多个条件进行判断: ```bash #!/bin/bash read -p "请输入一个数字:" num if [ -z "$num" ]; then echo "不能输入空值" elif [ $num -eq 10 ]; then echo "你输入的数字是10" else echo "你输入的数字不是10" fi ``` #### 8. 注意事项 - 在Bash中,字符串比较可以使用`==`,但在Dash和Zsh中需要使用`=`[^1]。 - 条件表达式中的空格非常重要,缺少空格会导致语法错误。 - 如果变量可能为空,建议始终将其用双引号括起来。 ### 示例:检查服务状态并启动 以下是一个实际应用案例,用于检查HTTP服务是否运行,并根据结果采取相应措施[^4]: ```bash port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}') if [ "$port" == "open" ]; then echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log else /etc/rc.d/init.d/httpd start > /dev/null echo "$(date) restart httpd !!" >> /tmp/autostart-err.log fi ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值