bash变量转发声明

时间:2017-03-03 14:56:52

标签: bash global-variables

假设我有一个脚本,在开头设置了一堆常量,我按字母顺序排序以获得更好的概述:

declare -r home_folder=/home/
declare -r user_folder=$home_folder$user_name/
declare -r user_name=$USER

显然,第二行的评估不会给出第一眼看到的结果,因为bash只进行一次评估,因此稍后调用$user_folder仍然会给{{1} }}。有没有办法克服这个问题?

编辑:首选解决方案看起来像

/home/

在评估declare -r home_folder=/home/ declare -r user_folder=$home_folder$pointer-to-user_name/ declare -r user_name=$USER 时评估指针,但我不知道是否可以在bash中对此进行评估。

2 个答案:

答案 0 :(得分:0)

bash脚本是从上到下逐行执行的,因为它只是逻辑上的。与许多其他编程语言相同。变量始终包含您之前分配给它的值。

也许我不明白“前瞻性宣言”是什么意思。或者你将“赋值”和“声明”混合在一起?

答案 1 :(得分:0)

您可以通过shell函数替换所有变量:

private void saveCoordinate(final String android_id, final String latitude, final String longitude, final String timestamp) {

        StringRequest stringRequest = new StringRequest(Request.Method.POST, MainActivity.URL_SAVE_COORDINATE,

                new Response.Listener<String>() {

                    @Override
                    public void onResponse(String response) {

                        try {

                            JSONObject obj = new JSONObject(response);

                            if (!obj.getBoolean("error")) {
                                // delete the synced sign row
                                db.deleteSyncedCoordinate(timestamp);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }) {

            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("android_id", android_id);
                params.put("latitude", latitude);
                params.put("longitude", longitude);
                params.put("timestamp", timestamp);

                return params;
            }
        };

        stringRequest.setRetryPolicy(new DefaultRetryPolicy(30000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        VolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(stringRequest);
    }
}

然后在您使用的代码中,您始终可以写home_folder() { echo "/home/"; } user_folder() { echo "$(home_folder)$(user_name)/"; } user_name() { echo "$USER"; } 来访问$(xxx)的内容(而不是通常的xxx$xxx)。

但是这会减慢一切,因为每次使用时都会重新创建每个值。也许你可以忍受这个。