bash变量的延迟评估

时间:2017-05-13 19:17:16

标签: bash

我需要定义一个字符串(<?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

如果可能的话,我也想避免使用功能,因为我不想让事情变得比他们需要的更复杂。

1 个答案:

答案 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;与大多数参数扩展不同,它的值可以通过应用引用来解析为多个单词。

或者:One-Liner Function Shims

--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