函数输入和 awk 参数之间的 BASH 名称冲突

Posted

技术标签:

【中文标题】函数输入和 awk 参数之间的 BASH 名称冲突【英文标题】:BASH name-*** between function input and awk argument 【发布时间】:2021-09-03 03:30:48 【问题描述】:

我希望动态获取文件夹中的第一个文件。到目前为止我所尝试的:

get_first_file () 
    local folder_name=$1
    filenames=`ls $folder_name/*`
    first_file=(echo $filenames | awk 'print $1')

get_first_file my_folder

这会产生以下错误:

my_shell_script.sh: line 4: syntax error near unexpected token `|'
my_shell_script.sh: line 4: `    first_file=(echo $filenames | awk 'print $1')'

请帮助我理解这个错误的含义,以及如何解决它。

【问题讨论】:

您有基本的语法错误。有更大的问题,但语法错误可以通过以下方式解决:get_first_file () local dir=$1; filenames=$(ls $dir/*); first_file=$(echo $filenames | awk 'print $1'); 特别是,您缺少进程替换上的$ 和函数定义上的终止 使用shellcheck.net 谢谢你,@WilliamPursell,正是我所需要的。如果你把评论内容变成答案,我可以接受。 Don't parse ls 【参考方案1】:

您的代码存在多个问题。我将只解决语法错误:

get_first_file () 
    local folder_name=$1
    filenames=`ls $folder_name/*`
    first_file=$(echo $filenames | awk 'print $1')


get_first_file my_folder

实际上不需要中间变量,但也许您在全局范围内使用filenames,所以使用它们没有任何问题。反引号实际上已经过时了几十年,永远不应该使用,像这样解析ls 的输出通常不是一个好主意。

不过,你真的不应该这样做。特别是,允许​​在 echo 上进行分词以消除所有空白并生成要由awk 过滤的单行输出,这很奇怪。如果你的文件名表现良好,你可以摆脱这个,但这不是一个好习惯。也许写这样的东西会更好:

get_first_file () 
        first_file=$(for i in *; do echo "$i"; exit; done;)

get_first_file () 
        first_file=$(find "$1" -not -name '.*' -maxdepth 1 -print0 | 
        perl -0ne 'print if $. == 1')

但不清楚你在用filenames做什么

【讨论】:

以上是关于函数输入和 awk 参数之间的 BASH 名称冲突的主要内容,如果未能解决你的问题,请参考以下文章

使用 bash 命令 awk sed 等从脚本中提取参数字段

Bash & awk:尝试在 awk 中使用 bash 脚本参数时出现分段错误

带有输入的 Bash 函数失败 awk 命令

Bash - Linux - 在一行中找到匹配并打印到SED / Awk / Grep行的末尾

Rdio 和 Google Core 库之间的静态库函数名称冲突

解析/传递命令行参数到bash脚本 - “$ @”和“$ *”之间有什么区别?