Bash:与空格重叠字符串的回显变量



我正在寻找变量中的特定行,例如

echo "$CodeDesc"
0x19 ERASE(6)
0x1A MODE SENSE(6)
0x1B START STOP UNIT
0x1C RECEIVE DIAGNOSTIC RESULTS
0x1D SEND DIAGNOSTIC
0x1E PREVENT ALLOW MEDIUM REMOVAL
0x23 READ FORMAT CAPACITIES
0x24 SET WINDOW

。如果我只是在寻找"MODE SENSE(6)",我正在使用grep和awk(也尝试使用sed)

desc="$( grep "0x1A" <<< "$CodeDesc" | awk '{print substr($0, index($0,$2))}' )"

这确实给了我正确的字符串,即。"MODE SENSE(6)",但当我回显时,它重叠了一些字符串:

echo "DESC: "$desc""

给我:

  "SC:"MODE SENSE(6)

注意"移到了开头,DE不见了。

之后,我还打印了相同的变量和另一个变量:

echo -e "${desc}${code}"

我希望输出:

MORE SENSE(6) 0x1A 1

但是我得到:

 0x1a 1NSE(6)

我不知道这是怎么回事,希望你能帮助我。

显然,您的$CodeDesc是由由CRLF终止的行组成的字符串。grepawk忠实地保留行结尾,shell的$()替换去掉最后的LF,留下一个以CR结尾的字符串。

当打印CR时,光标移动到行首,接下来打印的内容将覆盖原来的内容。

您可以通过将| tr -d '15'添加到您的管道来修复此问题,或者您可以在awk中完成所有操作,包括grep部分:

desc="$(awk '{gsub(/r/,"")} /0x1A/ {print substr($0, index($0,$2))}' <<< "$CodeDesc")"

这里不需要awks和greps。

Bash version> v4:

declare -A codes
while read -r code desc; do
    codes["$code"]=$desc
done <<< "$CodeDesc"
printf 'DESC: "%s"' "${codes['0x1A']}"

Bash版本

while read -r code desc; do
    [[ $code = '0x1A' ]] && printf 'DESC: "%s"' "$desc"
done <<< "$CodeDesc"

最新更新