Bash 如何使用文本文件的内容作为shell脚本的输入?
我的任务是编写一个shell脚本,它接收6个字母和数字组成的字符串,并检查它们是否符合特定标准 这就是剧本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
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
,并向其传递两个或三个命令行参数:
的值。如果shell变量的值包含空格或glob符号,则这可能是几个参数,但在这种情况下,它更可能是零,因为尚未定义$YES
$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中的第一行时创建一个无限循环。知道为什么吗?@颤栗:对不起;错误的重定向。现在应该修好了。