如何使用文本文件的内容作为 shell 脚本的输入?

How to use contents of text file as input to shell script?

我的任务是编写一个 shell 脚本,该脚本接收 6 个字母和数字的字符串并检查它们是否满足特定条件。

这是那个脚本

FILE=
var=${#FILE}
if [ $var -gt 6 ] || [ $var -lt 6 ]
then
    #echo $FILE "is not a valid NSID"
    exit 1
else if ( echo  | egrep -q '^[A-Za-z]{3}\d{3}$' )
    then
        #echo  "is a valid NSID"
        exit 0
    else
        #echo  "is not a valid NSID"
        exit 1
    fi
fi

有效。所以这不是问题所在。

我想做的是使用 "wrapper" 脚本从文本文件中收集潜在的有效 NSID,并在输入列表中调用该脚本。因此,如果我在我的包装器脚本中调用该脚本,它将遍历我提供给我的包装器的文本文件并检查每一行是否有效。

FILE=
YES= more $FILE

if ( exec /path/to/file/is_nsid.sh $YES -eq 0 )
then
    echo $FILE "is a valid NSID"
else
    echo $FILE "is not a valid NSID"
fi

所以如果我用一个名为 file1.txt 的文本文件调用它,其中包含

yes123
yess12
ye1243

它会输出每个是否有效。

YES= more $FILE

在传递给命令 more $FILE 的环境中设置 YES。这可能不是您想要的。

if ( exec /path/to/file/is_nsid.sh $YES -eq 0 )

启动子shell执行exec /path/to/file/is_nsid.sh $YES -eq 0。 (这就是括号的作用。)exec 然后用执行

的进程替换 subshell
/path/to/file/is_nsid.sh $YES -eq 0

依次在 is_nsid.sh 运行脚本,向其传递两个或三个命令行参数:

  • $YES 的值。如果 shell 变量的值包含空格或 glob 符号,这可能是多个参数,但在这种情况下,它更可能是空的,因为 $YES 尚未定义。

  • -eq

  • 0

因为你的脚本只检查它的第一个参数,这可能等同于

/path/to/file/is_nsid.sh -eq

这可能会以失败状态代码终止,并且由于 subshell 已被脚本执行替换,这也将是 sub[= 的 return 状态74=]。 (没有 exec,基本上没有区别;subshell 的 return 状态是 subshell 中执行的最后一个命令的状态。没有括号或 exec,结果也会相同。所以你可以只写 if /path/to/file/is_nsid.sh $YES -eq 0,它会产生相同的错误结果。)

您可能想要做的是读取文件中的每一行,其名称作为第一个命令行参数传递给脚本。您可以按如下方式进行:

while read -r line; do
  if /path/to/file/is_nsid.sh "$line"; then
    echo "$line is a valid NSID"
  else
    echo "$line is not a valid NSID"
  fi
done < ""

您可以大大简化 is_nsid 脚本。以下是等价的:

[ $#1 -eq 6 ] && echo "" | egrep -q '^[A-Za-z]{3}\d{3}$'

请注意,\d 是 egrep 的 Gnu 扩展,不应依赖于可移植代码(我认为这是试图成为的)。您应该改用 [0-9][[:digit:]]

长度检查实际上是不必要的,因为正则表达式只能匹配六个字符的行。就个人而言,我会忽略它,只使用

echo "" | egrep -q '^[[:alpha:]]{3}[[:digit:]]{3}$'

我删除了所有不必要的 if 语句。如果我把它们留在里面,我会把 else if ... then ... fi 改为简单的 elif ... then ... 以避免不必要的 if 嵌套。