我想根据两个条件将文件排序到文件夹中,但这两种条件都不能计算。这些条件基于从文本文件(index.txt)中读取的与特定主题对应的值,值编码为0或1。
Subid DX SEX
XXXX 0 0
YYYY 1 0代码如下
#!/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代替==,但它们仍然没有计算,也没有打印错误。我遗漏了什么?
发布于 2019-12-05 00:11:11
调试shell脚本时最有用的技巧之一是set -x (或使用sh -x运行整个脚本)。这使得shell在执行每个命令时都会打印相应的命令,这样您就可以更好地了解实际发生了什么,以及它是否与您预期的匹配。让我们在您的脚本上尝试一下:
$ 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选项设置变量,然后使用它。类似于:
$ awk -v d="XXXX" '{if($1==d){print $2}}' index.txt
0嘿,上面印的是对的!下面是您的脚本的一个版本,它使用:
#!/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是更安全的。如果您正在这样做,您最好改用[[ ]]而不是[ ],因为它避免了[ ]表达式所遭受的许多语法古怪。)
发布于 2019-12-04 21:48:34
问题不在于您的条件,而在于您使用awk设置的变量。
尝试以下方法来设置变量:
#!/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"
fihttps://stackoverflow.com/questions/59184788
复制相似问题