【问题标题】:BASH name-clash between function input and awk argument函数输入和 awk 参数之间的 BASH 名称冲突
【发布时间】: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}'); }
  • 特别是,您缺少进程替换上的$ 和函数定义上的终止}
  • 谢谢你,@WilliamPursell,正是我所需要的。如果你把评论内容变成答案,我可以接受。

标签: string bash function input awk


【解决方案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做什么

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 2016-01-18
    • 2015-10-05
    • 2013-12-11
    • 2011-04-21
    • 2011-04-15
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多