函数输入和 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 - Linux - 在一行中找到匹配并打印到SED / Awk / Grep行的末尾