我的任务是编写一个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];
}
它会输出每个是否有效。
答案 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
由于您的脚本只检查其第一个参数,这可能等同于
/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
嵌套。