如何使用文本文件的内容作为 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
嵌套。
我的任务是编写一个 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
然后用执行
/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
嵌套。