我正在写一个脚本,我有一个变量MINIENTREGA_FICHEROS="informe.txt programa.c"
此变量可以包含用空格分隔的任意数量的文件。我需要做的是检查当前文件夹以确保存在这些文件并告诉用户。我认为适合这种情况的是使用cut
将所有单词彼此分开并将每个单词分配给局部变量。然后在for中使用if [ -e $var ]
并回显结果,或沿着这些行的某些内容。
有什么建议吗?
答案 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
会导致脚本退出。这可能是也可能不是你想要的;如果它不是你想要的,就把它留下来。