【问题标题】:bash arguments with quotes in scriptbash 脚本中带引号的参数
【发布时间】:2019-02-08 07:27:29
【问题描述】:

我正在尝试在 bash 中构建对程序的(复杂的)调用。

程序需要一个文件列表,其中文件名可能包含空格。

我构造调用如下:

for VAR in $ARR; do
    CALL_ARGS+=" \"${VAR}.csv\""
done

然后用./program ${CALL_ARGS}调用程序

例如,当$VAR"a b c" 时,我想要./program "a b c",但我得到的是'"a' b 'c.csv"',这显然是错误引用的。

我已经在 StackOverflow 上看到了一些类似的问题/答案,但似乎没有一个适用于我的问题。

【问题讨论】:

  • 文件列表是否作为单独的参数传递给您的脚本?然后只需使用 ./program "$@" 即可。
  • 不,不是。我通过调用许多不同的程序来构建列表。
  • 可以和set -- "$@" "$file"一一添加到位置参数吗?
  • 在普通变量中存储列表永远不会正确;改用数组。有关动态生成 arg 列表的示例,请参阅 this previous question,有关一般信息,请参阅 BashFAQ #50。顺便说一句,$ARR(它似乎不是一个数组)和$CALL_ARGS 都有这个问题,您需要修复 both 才能正常工作。哦,避免使用eval 的诱惑——那样会带来疯狂和真正奇怪的错误。

标签: bash quotes


【解决方案1】:

在 Bash 中处理可能包含空格(或各种其他字符)的项目列表的最简单和最安全的方法是使用数组。例如:

files=('a b c' 'd e' f)
args=()

for f in "${files[@]}" ; do
    args+=( "$f".csv )
done

./program "${args[@]}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 2012-11-15
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多