使用cut来解析字符串并检查内容是否存在

时间:2013-10-12 15:14:53

标签: bash variables cut

我正在写一个脚本,我有一个变量MINIENTREGA_FICHEROS="informe.txt programa.c"

此变量可以包含用空格分隔的任意数量的文件。我需要做的是检查当前文件夹以确保存在这些文件并告诉用户。我认为适合这种情况的是使用cut将所有单词彼此分开并将每个单词分配给局部变量。然后在for中使用if [ -e $var ]并回显结果,或沿着这些行的某些内容。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

当先前已知所需字段时,最好使用

cut,即从文本中选择列/列。我认为,一个简单的do循环在这里更适合:

 MINIENTREGA_FICHEROS="informe.txt programa.c"
 for i in $MINIENTREGA_FICHEROS; do 
   [ ! -e $i ] &&  echo 'file "'$i'" is missing'
 done

输出:

 file "informe.txt" is missing
 file "programa.c" is missing

编辑:准确地说,如果您尝试使用该命令,则第一个命令仅包含在此处以实际初始化shell中的变量。如果它已经存在(例如在脚本中使用它时),则应该省略它。

答案 1 :(得分:3)

虽然它要求你的名字中没有任何文件有空格,但这样可行。 (正如@chepner在评论中指出的那样,你可以通过使$MINIENTREGA_FICHEROS成为数组而不是简单的字符串来避免这个问题;当然,这将改变你构造该变量的方式。)

无论如何,有一种更简单的方法也可以起作用:

ls $MINIENTREGA_FICHEROS > /dev/null || exit 1

# If you change the variable to an array, this becomes:
ls "${MINIENTREGA_FICHEROS[@]}" > /dev/null || exit 1

注意:我故意在第一行中省略了变量扩展的引号。

如果文件不存在,这利用了ls将在stderr为每个作为参数提供的文件名生成错误消息的事实。重定向stdout/dev/null会消除文件名的回声,这会让人分心。如果任何文件不存在,|| exit会导致脚本退出。这可能是也可能不是你想要的;如果它不是你想要的,就把它留下来。