函数输入和 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 名称冲突的主要内容,如果未能解决你的问题,请参考以下文章