我怎样才能使这个 Bash 变量起作用:myformat="--format=fuller --date=format:%Y-%m-%d T%H"

我怎样才能使这个 Bash 变量起作用:myformat="--format=fuller --date=format:%Y-%m-%d T%H"

这是一个关于 Bash 如何处理单词分组和变量扩展的问题。我将用一个非常具体的例子来演示这个问题:

bash$ git log --format=fuller --date=format:"%Y-%m-%d T%H"    # This works.

# Sample output:
commit aba22155684
Author:     SerMetAla
AuthorDate: 2018-04-12 T23
Commit:     SerMetAla
CommitDate: 2018-04-12 T23

    Here is the commit message.

我希望这个能够起作用:

bash$ git log "$myformat"    # It should print the same stuff.

我不知道如何仅使用一个 Bash 变量来实现这一点。这是一个包含两个变量的工作示例:

# Define the two variables:
bash$ mypref="--format=fuller"
bash$ mydate="--date=format:%Y-%m-%d T%H"    # Note: No " after the colon.

# Now use it:
bash$ git log "$mypref" "$mydate"    # It works.

问题是:我怎样才能仅使用一个 Bash 变量来实现这一点?可能吗?

主要问题:

git log --format=fuller --date=format:"%Y-%m-%d T%H"
                       |                       ^ This space is inside one argument.
                       |
                       ^ This space separates two arguments.

我想使用普通的字符串变量。我不想使用数组变量,我不想使用$'...',我不想使用函数,我不想使用别名。当字符串是不可变的,并且当它不在命令的开头时,感觉它应该是 Bash 变量。

我可以非常轻松地用函数以相当易读的方式解决这个问题。我可以用其他 Bash 技巧以一种令人恐惧的方式解决这个问题。我想使用一个字符串变量。

答案1

我不想使用数组变量

你拒绝使用适合该工作的工具。好吧,你可以尝试eval

$> foo='a "b c"'
$> printf "%s\n" $foo
a
"b
c"
$> eval printf '"%s\n"' $foo
a
b c
$>

对于你来说,它将会是这样的:

myformat='--format=fuller --date=format:"%Y-%m-%d T%H"'
eval git log $myformat

答案2

这是一个常见的常见问题解答。https://mywiki.wooledge.org/BashFAQ/050

简而言之,解决这个问题的方法是将参数放在一个数组中。

myformat=("$mypref" "$mydate")
git log "${myformat[@]}"

作为一个非常粗鲁的解决方法,您还可以使用printf引用格式说明符:

printf -v myformat '%q %q' "$mypref" "$mydate"
git log $myformat

相关内容