Bash保存tr操纵的字符串

时间:2015-10-28 19:30:38

标签: string bash replace character

我有一个小程序,询问用户的名字和姓氏。我需要将给定姓氏的最后一个字符更改为名字和姓氏中的下划线(以及在字符串中进一步出现的任何一个)。此外,我需要将用户的名字更改为大写字母。我得到了代码的这一部分,我操纵给定的字符串。

echo -n "Hello "
X="$X" | tr ${Y:(-1)} "_"
echo -n "${X^^}"
echo " $Y" | tr ${Y:(-1)} "_"

由于某种原因,第2行:X="$X" | tr ${Y:(-1)} "_"并没有像我想要的那样保存变量。当我填写"Cannon Nikkon"时,程序返回"Hello CANNON Nikko_"。但是当我打印echo "$X" | tr ${Y:(-1)} "_"它打印"Hello Ca__o_ Nikko_"时。我尝试用echo "${X^^}" | tr ${Y:(-1)} "_"编写来解决它,但它仍然返回"Hello CANNON Nikko_"。我想通了,因为n和N不是相同的字符,它不会改变。

但为什么不将变量保存在第2行?我该如何处理?

2 个答案:

答案 0 :(得分:2)

如果我理解正确, 而不是这个:

X="$X" | tr ${Y:(-1)} "_"

你想这样做:

X=$(tr ${Y:(-1)} "_" <<< "$X")

也就是说,您希望将tr的输出写回X。 最初的声明根本没有这样做, 它做了一些完全不同的事情:

  1. X的值设置为"$X"
  2. 将作业的输出(无)传递给tr
  3. tr的输出已打印,并且未保存在X中, 与你可能相信的相反。

答案 1 :(得分:2)

使用正确的工具更改字符串${//}

first="jason";
echo "${first/%?/_}"     ### Using % means: "at the end of the string".

完整的更改将是:

first="jason";
first="${first/%?/_}"
first="${first^}"              ### Use ^^ to change all the string.
echo "$first"

并且,询问用户将是:

#!/bin/bash
read -rp "Your first name, please: ? " first
read -rp "Your Last  name, please: ? " last
first="${first/%?/_}"
first="${first^}"
last="${last/%?/_}"
last="${last^}"
echo "$first $last"