我有一个小程序,询问用户的名字和姓氏。我需要将给定姓氏的最后一个字符更改为名字和姓氏中的下划线(以及在字符串中进一步出现的任何一个)。此外,我需要将用户的名字更改为大写字母。我得到了代码的这一部分,我操纵给定的字符串。
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行?我该如何处理?
答案 0 :(得分:2)
如果我理解正确, 而不是这个:
X="$X" | tr ${Y:(-1)} "_"
你想这样做:
X=$(tr ${Y:(-1)} "_" <<< "$X")
也就是说,您希望将tr
的输出写回X
。
最初的声明根本没有这样做,
它做了一些完全不同的事情:
X
的值设置为"$X"
tr
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"