假设我有一个脚本,在开头设置了一堆常量,我按字母顺序排序以获得更好的概述:
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中对此进行评估。
答案 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
)。
但是这会减慢一切,因为每次使用时都会重新创建每个值。也许你可以忍受这个。