Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell参数扩展:如果没有目录部分,如何获取文件名?_Shell_Makefile_Variable Expansion - Fatal编程技术网

Shell参数扩展:如果没有目录部分,如何获取文件名?

Shell参数扩展:如果没有目录部分,如何获取文件名?,shell,makefile,variable-expansion,Shell,Makefile,Variable Expansion,我正在写一个makefile,假设我有以下内容: FILES = file1.py \ folder1/file2.py \ folder2/file3.py 我有以下for循环: -@for file in $(FILES); do \ echo $${file/folder1\/}; \ done 以上将打印: file1.py file2.py folder2/file3.py 我想要的输出是: file1.py file2.py

我正在写一个makefile,假设我有以下内容:

FILES = file1.py \
    folder1/file2.py \
    folder2/file3.py
我有以下for循环:

    -@for file in $(FILES); do \
           echo $${file/folder1\/}; \
    done
以上将打印:

file1.py
file2.py
folder2/file3.py
我想要的输出是:

file1.py
file2.py
file3.py
我已经看过一些关于shell扩展的文档,但还没有找到一种方法来处理这个问题。我可以知道如何更改代码以获得正确的输出吗?任何帮助都将不胜感激


编辑:语法

尝试使用
echo$${file##*/}
。这将只给出文件名部分,不包含最后一个斜杠。

您已经接受了@Jens的shell风格的答案,但我将建议一个解决方案:

-@for file in $(notdir $(FILES)); do \
       echo $${file}; \
done

您是否忘记了
文件=
行中的反斜杠?你忘了回声后面的分号了吗?哦,对不起,我忘了把它们加进去,但我确实把它们写在了生成文件中。很抱歉给您添麻烦。非常感谢!顺便问一下,我能知道在哪里可以找到与此相关的信息吗?我在网上找不到任何有用的资源。我不认为每次我有这样的问题时都应该在StackExchange上提问。它应该在您的sh/ksh/bash/zsh手册的“参数扩展”下。请注意,
make
使用
/bin/sh
而不是登录shell来运行命令
/bin/sh
可能是伪装的狂欢。用于参数扩展的POSIX规范如下所示