2

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

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

有什么建议吗?

4

2 回答 2

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 中的变量。如果它已经存在(例如在脚本中使用它时),您应该省略它。

于 2013-10-12T15:19:57.883 回答
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如果任何文件不存在,则导致脚本退出。这可能是也可能不是你想要的;如果这不是您想要的,请忽略它。

于 2013-10-12T15:33:05.550 回答