我需要定义一个字符串(<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.twinkle94.lab_work.MainActivity">
<com.example.twinkle94.lab_work.GameView
android:id="@+id/gameView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
),其中包含一个稍后将在脚本中提供的变量(options
)。
这就是我提出的,使用稍后会进行评估的文字字符串。
group
它有效,但它使用了#!/bin/bash
options='--group="$group"' #$group is not available at this point
#
# Some code...
#
group='trekkie'
eval echo "$options" # the result is used elsewhere
我想避免的,如果不是绝对必要的话(我不想因为不可预测的数据而冒险潜在的问题)。
我已经在多个地方寻求帮助,并且我得到了一些指示我使用indirect variables的答案。
问题是我根本没有看到间接变量如何帮助我解决问题。据我所知,他们只提供间接引用其他变量的方法:
eval
如果可能的话,我也想避免使用功能,因为我不想让事情变得比他们需要的更复杂。
答案 0 :(得分:2)
当您还不知道组名时,请不要尝试预先定义--group="$group"
参数;相反,设置一个标志,指示是否需要参数,并在形成最终参数列表时尊重该标志。
通过以下方法,您可以避免任何“延期评估”的需要:
#!/bin/bash
# initialize your flag as unset
unset needs_group
# depending on your application logic, optionally set that flag
if [[ $application_logic_here ]]; then
needs_group=1
fi
# ...so, the actual group can be defined later, when it's known...
group=trekkies
# and then check the flag to determine whether to pass the argument:
yourcommand ${needs_group+--group="$group"}
如果您不需要将标志与组变量分开,则更容易:
# pass --group="$group" only if "$group" is a defined shell variable
yourcommand ${group+--group="$group"}
相关语法为parameter expansion:${var+value}
仅在value
定义时才会扩展为var
;与大多数参数扩展不同,它的值可以通过应用引用来解析为多个单词。
在--group="$group"
知道之前,您确实 定义group
:
#!/bin/bash
if [[ $application_logic_here ]]; then
with_optional_group() { "$@" --group="$group"; }
else
with_optional_group() { "$@"; }
fi
group=trekkies
with_optional_group yourcommand