首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在IF语句中不计算多个条件的Shell

问在IF语句中不计算多个条件的Shell
EN

Stack Overflow用户
提问于 2019-12-04 21:16:13
回答 2查看 953关注 0票数 1

我想根据两个条件将文件排序到文件夹中,但这两种条件都不能计算。这些条件基于从文本文件(index.txt)中读取的与特定主题对应的值,值编码为0或1。

代码语言:javascript
复制
Subid   DX    SEX
XXXX    0      0
YYYY    1      0

代码如下

代码语言:javascript
复制
    #!/bin/sh 
    d=XXXX
    dx=$(awk '{if($1=='$d'){print $2}}' index.txt)
    sex=$(awk '{if($1=='$d'){print $3}}' index.txt)
    if [ "$dx" == "0" ] && [ "$sex" == "0" ];then
     commands
    fi

我试过使用双括号[[ <condition 1> ]] && [[ <condition 2> ]];、折叠括号if [ <condition1> && <condition2> ];、括号和使用-eq代替==,但它们仍然没有计算,也没有打印错误。我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-05 00:11:11

调试shell脚本时最有用的技巧之一是set -x (或使用sh -x运行整个脚本)。这使得shell在执行每个命令时都会打印相应的命令,这样您就可以更好地了解实际发生了什么,以及它是否与您预期的匹配。让我们在您的脚本上尝试一下:

代码语言:javascript
复制
$ sh -x reader.sh
+ d=XXXX
++ awk '{if($1==XXXX){print $2}}' index.txt
+ dx=
++ awk '{if($1==XXXX){print $3}}' index.txt
+ sex=
+ '[' '' == 0 ']'

注意,它将dx和sex设置为空字符串。如果你看一下正在执行的awk脚本,你会发现为什么:XXXX没有双引号,所以awk把它当作一个变量名,而不是一个要匹配的文字字符串。

您可以添加双引号,但这并不是最好的方法;将文字字符串插入可执行代码(在本例中是awk脚本)可能会使部分字符串被误认为是可执行代码,这可能会产生非常奇怪/糟糕的后果。更好的方法是将数据作为数据传递,使用awk的-v选项设置变量,然后使用它。类似于:

代码语言:javascript
复制
$ awk -v d="XXXX" '{if($1==d){print $2}}' index.txt
0

嘿,上面印的是对的!下面是您的脚本的一个版本,它使用:

代码语言:javascript
复制
#!/bin/sh
d=XXXX
dx=$(awk -v d="$d" '{if($1==d){print $2}}' index.txt)
sex=$(awk -v d="$d" '{if($1==d){print $3}}' index.txt)
if [ "$dx" = "0" ] && [ "$sex" = "0" ];then
    commands
fi

注意,名为d的awk变量与名为d的shell变量没有内在连接;-v d="$d"位将shell变量复制到同名的awk变量中。另外,在比较中,我将==转换为=,因为这是[ ]中的标准字符串-相等操作符。bash允许==作为同义词,但并非所有的shell都这样做;如果您是专门为bash编写的,则应该使用特定的bash行(#!/bin/bash或#!/usr/bin/env bash),而不是#!/bin/sh。

(实际上,我建议使用bash shebang,因为如果您不清楚什么是标准shell语法和bash扩展,那么您可能不会编写可移植性,所以明确请求bash是更安全的。如果您正在这样做,您最好改用[[ ]]而不是[ ],因为它避免了[ ]表达式所遭受的许多语法古怪。)

票数 2
EN

Stack Overflow用户

发布于 2019-12-04 21:48:34

问题不在于您的条件,而在于您使用awk设置的变量。

尝试以下方法来设置变量:

代码语言:javascript
复制
#!/bin/sh
d=XXXX
dx=$(awk '{if ($1 ~ /'$d'/) print $3}' index.txt)
sex=$(awk '{if ($1 ~ /'$d'/) print $3}' index.txt)
if [ "$dx" = "0" ] && [ "$sex" = "0" ];then
echo "works"
fi
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59184788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档