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

时间:2016-12-03 22:08:25

标签: bash shell wrapper

我的任务是编写一个shell脚本,该脚本包含6个字母和数字的字符串,并检查它们是否符合某个标准。

这是脚本

FILE=$1
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

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

我要做的是使用"包装"脚本从文本文件中收集潜在的有效NSID,并在输入列表上调用该脚本。因此,如果我在我的包装器脚本中调用该脚本,它将逐步执行我给我的包装器的文本文件,并检查每行是否有效。

yes123
yess12
ye1243

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

$my_string = "key0:value0,key1:value1,key2:value2";

$convert_to_array = explode(',', $my_string);

for($i=0; $i < count($convert_to_array ); $i++){
    $key_value = explode(':', $convert_to_array [$i]);
    $end_array[$key_value [0]] = $key_value [1];
}

它会输出每个是否有效。

1 个答案:

答案 0 :(得分:2)

该行

YES= more $FILE

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

该行

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

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

/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

这可能会以失败状态代码终止,并且由于子shell已被脚本执行替换,因此也将是子shell的返回状态。 (没有exec,基本上没有区别;子shell的返回状态是子shell中执行的最后一个命令。没有括号或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 < "$1"

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

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

请注意\d是egrep的Gnu扩展,不应该依赖于可移植代码(我假设这是尝试)。您应该使用[0-9][[:digit:]]代替。

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

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

我删除了所有不必要的if语句。如果我让他们离开,我会将else if ... then ... fi更改为elif ... then ...,以避免不必要的if嵌套。