此代碼...
#!/usr/local/bin/bash
getDeclared() {
local v
v=$( set -o posix ; set )
IFS=$'\n' read -d '\034' -r -a v <<<"${v}\034"
echo "${v[*]}"
}
declare -a _hints=()
declare _hint="start.hint"
declare _paths
declare _basepath="root/devops/cloud"
declare _base="/"
declare _hintmaxdepth=0
echo "${BASH_VERSION}"
x=$(getDeclared)
x=($x)
for ((y=0;y<${#x[@]};y )); do
[ "${x[y]::1}" == "_" ] && echo "$y: ${x[y]}"$'\n'
done
有這個輸出:
? sometest bash working.sh
5.1.16(1)-release
66: _=posix
67: __CFBundleIdentifier=com.sublimetext.4
68: __CF_USER_TEXT_ENCODING=0x1F6:0x0:0x0
69: _base=/
70: _basepath=root/devops/cloud
71: _hint=start.hint
72: _hintmaxdepth=0
73: _hints=()
到目前為止,一切都很好
但是,如果我更改函式以包含顯示邏輯,如...
此代碼...
#!/usr/local/bin/bash
getDeclared() {
local v
local x
v=$( set -o posix ; set )
IFS=$'\n' read -d '\034' -r -a v <<<"${v}\034"
x=($v)
for ((y=0;y<${#x[@]};y )); do
[ "${x[y]::1}" == "_" ] && echo "$y: ${x[y]}"$'\n'
done
}
declare -a _hints=()
declare _hint="start.hint"
declare _paths
declare _basepath="root/devops/cloud"
declare _base="/"
declare _hintmaxdepth=0
echo "${BASH_VERSION}"
getDeclared
這個輸出
? sometest bash working1.sh
5.1.16(1)-release
0: BASH=/usr/local/bin/bash
不是我所期望的。如果我將其更改為僅回顯所有內容(不在“_”上過濾),則結果相同...
此代碼...
#!/usr/local/bin/bash
getDeclared() {
local v
local x
v=$( set -o posix ; set )
IFS=$'\n' read -d '\034' -r -a v <<<"${v}\034"
x=($v)
for ((y=0;y<${#x[@]};y )); do
echo "$y: ${x[y]}"$'\n'
done
}
declare -a _hints=()
declare _hint="start.hint"
declare _paths
declare _basepath="root/devops/cloud"
declare _base="/"
declare _hintmaxdepth=0
echo "${BASH_VERSION}"
getDeclared
有相同的輸出
? sometest bash working1.sh
5.1.16(1)-release
0: BASH=/usr/local/bin/bash
Shellcheck 只是x=($v)在函式內部顯示一個警告,說要參考以防止拆分。但是當我這樣做時我沒有看到任何區別x="($v)",只是在結果周圍加上括號:
? sometest bash working1.sh
5.1.16(1)-release
0: (BASH=/usr/local/bin/bash)
我在這里想念什么?幫助!:)
uj5u.com熱心網友回復:
[為什么我得到兩個代碼片段之間的差異?]
因為$v只是陣列的第一個元素,所以里面只有一個元素x。如果你想復制一個陣列,你應該使用x=("${v[@]}").
只是-d ''和喜歡mapfile。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/491445.html
下一篇:在n個非連續空行后拆分檔案
