Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用文本文件的内容作为shell脚本的输入?_Bash_Shell_Wrapper - Fatal编程技术网

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

Bash 如何使用文本文件的内容作为shell脚本的输入?,bash,shell,wrapper,Bash,Shell,Wrapper,我的任务是编写一个shell脚本,它接收6个字母和数字组成的字符串,并检查它们是否符合特定标准 这就是剧本 FILE=$1 var=${#FILE} if [ $var -gt 6 ] || [ $var -lt 6 ] then #echo $FILE "is not a valid NSID" exit 1 else if ( echo $1 | egrep -q '^[A-Za-z]{3}\d{3}$' ) then #echo $1 "is a v

我的任务是编写一个shell脚本,它接收6个字母和数字组成的字符串,并检查它们是否符合特定标准

这就是剧本

FILE=$1
var=${#FILE}
if [ $var -gt 6 ] || [ $var -lt 6 ]
then
    #echo $FILE "is not a valid NSID"
    exit 1
else if ( echo $1 | egrep -q '^[A-Za-z]{3}\d{3}$' )
    then
        #echo $1 "is a valid NSID"
        exit 0
    else
        #echo $1 "is not a valid NSID"
        exit 1
    fi
fi
它起作用了。所以这不是问题所在

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

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
如果我用一个名为file1.txt的文本文件调用它,其中包含

yes123
yess12
ye1243
它将输出每一行是否有效

YES= more $FILE
if ( exec /path/to/file/is_nsid.sh $YES -eq 0 )
在传递给命令
more$FILE
的环境中设置
YES
。那可能不是你想要的

线路

YES= more $FILE
if ( exec /path/to/file/is_nsid.sh $YES -eq 0 )
启动子shell以执行
exec/path/to/file/is\u nsid.sh$YES-eq 0
。(括号就是这么做的。)
exec
然后用一个执行

/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
,它将产生相同的inco正确的结果。)

您可能想做的是读取文件中的每一行,该行的名称作为第一个命令行参数传递给脚本。你可以这样做:

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"
请注意,
\d
是egrep的Gnu扩展,在可移植代码中不应依赖它(我假设它正在尝试)。您应该使用
[0-9]
[[:digit:]

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

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

我删除了所有不必要的
if
语句。如果我把它们留在里面,我会改变
,否则如果。。。然后。。。fi
到简单的
elif。。。然后…
避免不必要的
if
嵌套。

这很有意义,感谢您将其分解!但是使用该while循环会在反复调用.txt中的第一行时创建一个无限循环。知道为什么吗?@颤栗:对不起;错误的重定向。现在应该修好了。