从另一个变量中提取变量中的值
Pull values in a variable from another variable
我正在尝试根据文件中的参数条目从序列中提取一个值。在我的例子中,值将是“seq”、“date”或“count”。
function ParseHeader {
local varHeaderLine=
local varType=
local varOut=""
if [[ -z "$varType" ]]; then
echo "Cannot find! - ($varType)"
exit 1
elif [[ "$varType" = "seq" ]]; then
varOut=$(echo "$varHeaderLine" | cut -d\| -f 3)
echo "Sequence: $varOut"
elif [[ "$varType" = "date" ]]; then
varOut=$(echo "$varHeaderLine" | cut -d\| -f 4)
echo "Date: $varOut"
elif [[ "$varType" = "count" ]]; then
varOut=$(echo "$varHeaderLine" | cut -d\| -f 5)
echo "Line Count: $varOut"
else
echo "Invalid input! Your Header is: $varHeaderLine"
fi
return $?
}
sequence='XXXXX|Y|1|20220429|9999'
ProfSeq=$(ParseHeader "${sequence}" "count")
echo $ProfSeq
这是整个文件的一部分,但这里发生的是我将接收一个文件,提取其序列,然后从该特定序列中提取一些值。
感谢您的帮助,这就是我最终得到的。现在我正在寻找它 CPU 密集度,如果可能的话。
注意:这篇文章是一段时间的文件脚本,将 运行 每天针对不同环境中的不同服务器
只关注当前的代码片段...
Assumptions/Understandings:
- 变量
ProfSeq
将包含函数echo
调用的输出;我们可以通过让函数用 ProfSeq="..."
替换 echo "..."
调用来消除子进程调用 (ProfSeq=$( ... subprocess call ...)
)(即让函数直接填充 ProfSeq
变量
- 通过使用
bash/read
内置函数 消除对拆分 varHeaderLine
($(echo ... | cut ...)
) 的双重子进程调用,可以获得额外的性能改进
函数重写的一个想法:
ParseCOTHeader () {
local varHeaderLine=
local -l varType= # force to all lowercase
local ignore1 ignore2 in_seq in_date in_count rc
# split varHeaderLine into 5 variables based on '|' delimiter:
# NOTE: assumes varHeaderLine has exactly 5x '|' delimited fields otherwise OP
# may want to add some code to validate the structure of varHeaderLine
IFS='|' read -r ignore1 ignore2 in_seq in_date in_count <<< "${varHeaderLine}"
# reset variables:
ProfSeq=
rc=0
if [[ -z "${varType}" ]]
then
ProfSeq="Cannot find! - ()" # since varType= is empty at this point we will always print '()' ... ?
rc=1
else
case "${varType}" in
seq) ProfSeq="Sequence: ${in_seq}" ;;
date) ProfSeq="Date: ${in_date}" ;;
count) ProfSeq="Line Count: ${in_count}" ;;
*) ProfSeq="Invalid input! Your Header is: '$varHeaderLine'"
rc=1 ;;
esac
fi
return "${rc}"
}
逐步完成功能:
$ sequence='SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" 'seq'
$ echo "$? : ${ProfSeq}"
0 : Sequence: 1
$ ParseCOTHeader "${sequence}" 'DaTe'
$ echo "$? : ${ProfSeq}"
0 : Date: 20220429
$ ParseCOTHeader "${sequence}" 'COUNT'
$ echo "$? : ${ProfSeq}"
0 : Line Count: 9999
$ ParseCOTHeader "${sequence}" 'fire-truck'
$ echo "$? : ${ProfSeq}"
1 : Invalid input! Your Header is: 'SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" ''
$ echo "$? : ${ProfSeq}"
1 : Cannot find! - ()
如果重复调用该函数需要将消息字符串保存在不同的变量中:
- 在函数的顶部添加行
local -n myoutput=
(这定义了一个本地 nameref 变量 myoutput
作为指向 $3 中传递的变量名称的指针)
- 将函数中的所有
ProfSeq="..."
替换为myoutput="..."
- 删除函数
中的行ProfSeq=
(变量重置)
试用新功能:
$ sequence='SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" 'seq' ProfSeq
$ echo "$? : ${ProfSeq}"
0 : Sequence: 1
$ ParseCOTHeader "${sequence}" 'DaTe' ProfSeq
$ echo "$? : ${ProfSeq}"
0 : Date: 20220429
$ ParseCOTHeader "${sequence}" 'COUNT' ProfSeq
$ echo "$? : ${ProfSeq}"
0 : Line Count: 9999
$ ParseCOTHeader "${sequence}" 'fire-truck' SomeOtherVar
$ echo "$? : ${SomeOtherVar}"
1 : Invalid input! Your Header is: 'SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" '' YetAnotherVar
$ echo "$? : ${YetAnotherVar}"
1 : Cannot find! - ()
您可以使用 read
和关联数组:
$ function ParseHeader {
local -A fields=(["seq"]=2 ["date"]=3 ["count"]=4)
local -A mess=(["seq"]="Sequence" ["date"]="Date" ["count"]="Line Count")
IFS='|' read -ra arr <<< ""
if [[ -n "${fields[]:+x}" ]]; then
printf -v ProfSeq '%s: %s' "${mess[]}" "${arr[${fields[]}]}"
else
printf -v ProfSeq 'Invalid input! Your Header is: %s' ""
fi
}
$ ParseHeader "XXXXX|Y|1|20220429|9999" "seq"
$ echo "$ProfSeq"
Sequence: 1
$ ParseHeader "XXXXX|Y|1|20220429|9999" "date"
$ echo "$ProfSeq"
Sequence: 20220429
$ ParseHeader "XXXXX|Y|1|20220429|9999" "count"
$ echo "$ProfSeq"
Line Count: 9999
$ ParseHeader "XXXXX|Y|1|20220429|9999" "foo"
$ echo "$ProfSeq"
Invalid input! Your Header is: 31
我正在尝试根据文件中的参数条目从序列中提取一个值。在我的例子中,值将是“seq”、“date”或“count”。
function ParseHeader {
local varHeaderLine=
local varType=
local varOut=""
if [[ -z "$varType" ]]; then
echo "Cannot find! - ($varType)"
exit 1
elif [[ "$varType" = "seq" ]]; then
varOut=$(echo "$varHeaderLine" | cut -d\| -f 3)
echo "Sequence: $varOut"
elif [[ "$varType" = "date" ]]; then
varOut=$(echo "$varHeaderLine" | cut -d\| -f 4)
echo "Date: $varOut"
elif [[ "$varType" = "count" ]]; then
varOut=$(echo "$varHeaderLine" | cut -d\| -f 5)
echo "Line Count: $varOut"
else
echo "Invalid input! Your Header is: $varHeaderLine"
fi
return $?
}
sequence='XXXXX|Y|1|20220429|9999'
ProfSeq=$(ParseHeader "${sequence}" "count")
echo $ProfSeq
这是整个文件的一部分,但这里发生的是我将接收一个文件,提取其序列,然后从该特定序列中提取一些值。 感谢您的帮助,这就是我最终得到的。现在我正在寻找它 CPU 密集度,如果可能的话。
注意:这篇文章是一段时间的文件脚本,将 运行 每天针对不同环境中的不同服务器
只关注当前的代码片段...
Assumptions/Understandings:
- 变量
ProfSeq
将包含函数echo
调用的输出;我们可以通过让函数用ProfSeq="..."
替换echo "..."
调用来消除子进程调用 (ProfSeq=$( ... subprocess call ...)
)(即让函数直接填充ProfSeq
变量 - 通过使用
bash/read
内置函数 消除对拆分
varHeaderLine
($(echo ... | cut ...)
) 的双重子进程调用,可以获得额外的性能改进
函数重写的一个想法:
ParseCOTHeader () {
local varHeaderLine=
local -l varType= # force to all lowercase
local ignore1 ignore2 in_seq in_date in_count rc
# split varHeaderLine into 5 variables based on '|' delimiter:
# NOTE: assumes varHeaderLine has exactly 5x '|' delimited fields otherwise OP
# may want to add some code to validate the structure of varHeaderLine
IFS='|' read -r ignore1 ignore2 in_seq in_date in_count <<< "${varHeaderLine}"
# reset variables:
ProfSeq=
rc=0
if [[ -z "${varType}" ]]
then
ProfSeq="Cannot find! - ()" # since varType= is empty at this point we will always print '()' ... ?
rc=1
else
case "${varType}" in
seq) ProfSeq="Sequence: ${in_seq}" ;;
date) ProfSeq="Date: ${in_date}" ;;
count) ProfSeq="Line Count: ${in_count}" ;;
*) ProfSeq="Invalid input! Your Header is: '$varHeaderLine'"
rc=1 ;;
esac
fi
return "${rc}"
}
逐步完成功能:
$ sequence='SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" 'seq'
$ echo "$? : ${ProfSeq}"
0 : Sequence: 1
$ ParseCOTHeader "${sequence}" 'DaTe'
$ echo "$? : ${ProfSeq}"
0 : Date: 20220429
$ ParseCOTHeader "${sequence}" 'COUNT'
$ echo "$? : ${ProfSeq}"
0 : Line Count: 9999
$ ParseCOTHeader "${sequence}" 'fire-truck'
$ echo "$? : ${ProfSeq}"
1 : Invalid input! Your Header is: 'SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" ''
$ echo "$? : ${ProfSeq}"
1 : Cannot find! - ()
如果重复调用该函数需要将消息字符串保存在不同的变量中:
- 在函数的顶部添加行
local -n myoutput=
(这定义了一个本地 nameref 变量myoutput
作为指向 $3 中传递的变量名称的指针) - 将函数中的所有
ProfSeq="..."
替换为myoutput="..."
- 删除函数 中的行
ProfSeq=
(变量重置)
试用新功能:
$ sequence='SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" 'seq' ProfSeq
$ echo "$? : ${ProfSeq}"
0 : Sequence: 1
$ ParseCOTHeader "${sequence}" 'DaTe' ProfSeq
$ echo "$? : ${ProfSeq}"
0 : Date: 20220429
$ ParseCOTHeader "${sequence}" 'COUNT' ProfSeq
$ echo "$? : ${ProfSeq}"
0 : Line Count: 9999
$ ParseCOTHeader "${sequence}" 'fire-truck' SomeOtherVar
$ echo "$? : ${SomeOtherVar}"
1 : Invalid input! Your Header is: 'SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" '' YetAnotherVar
$ echo "$? : ${YetAnotherVar}"
1 : Cannot find! - ()
您可以使用 read
和关联数组:
$ function ParseHeader {
local -A fields=(["seq"]=2 ["date"]=3 ["count"]=4)
local -A mess=(["seq"]="Sequence" ["date"]="Date" ["count"]="Line Count")
IFS='|' read -ra arr <<< ""
if [[ -n "${fields[]:+x}" ]]; then
printf -v ProfSeq '%s: %s' "${mess[]}" "${arr[${fields[]}]}"
else
printf -v ProfSeq 'Invalid input! Your Header is: %s' ""
fi
}
$ ParseHeader "XXXXX|Y|1|20220429|9999" "seq"
$ echo "$ProfSeq"
Sequence: 1
$ ParseHeader "XXXXX|Y|1|20220429|9999" "date"
$ echo "$ProfSeq"
Sequence: 20220429
$ ParseHeader "XXXXX|Y|1|20220429|9999" "count"
$ echo "$ProfSeq"
Line Count: 9999
$ ParseHeader "XXXXX|Y|1|20220429|9999" "foo"
$ echo "$ProfSeq"
Invalid input! Your Header is: 31