"FILENAME=$(echo $INFILE | grep -oE "[^/]+$") 是什么意思?

aka*_*asb 1 linux shell scripting shell-script

FILENAME=$(echo /root/Source/code/script.sh | grep -oE "[^/]+$")
Run Code Online (Sandbox Code Playgroud)

我知道它会给我文件路径中的文件名作为script.sh. 但是有人可以向我解释一下吗?

Sté*_*las 6

让我们计算一下错误的数量:

FILENAME=$(echo $INFILE | grep -oE "[^/]+$")
Run Code Online (Sandbox Code Playgroud)
  1. echo不应用于任意数据。根据实现,如果$INFILE-反斜杠开头或包含反斜杠或两者兼而有之,它将失败。
  2. 不加引号的变量是split+glob运算符。对于许多可能的 值,这将导致上述操作失败$INFILE。除非你有很好的理由,否则永远不应该不引用变量。
  3. grep 适用于它输入的每一行,而在这里您希望它只对整个字符串进行处理。
  4. 如果$INFILE/some/dir/or /,那将返回空字符串而不是diror /
  5. -o选项是特定于 GNU 的,因此它仅适用grep于 GNU grep
  6. 化妆品/约定:所有大写变量名称都应保留用于环境变量。
  7. 命令替换删除尾随的换行符,因此如果$INFILE以换行符结尾,上述方法将不起作用。

要获取文件的基本名称,有一个标准命令:

filename=$(basename -- "$infile")
Run Code Online (Sandbox Code Playgroud)

或者为了避免上面的(7):

filename=$(basename -- "$infile"; echo .); filename=${filename%??}
Run Code Online (Sandbox Code Playgroud)

或者,使用 shell 扩展运算符:

filename=${infile##*/}
Run Code Online (Sandbox Code Playgroud)

(仍然有上面的问题(4))。