Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Bash保存tr操纵的字符串_String_Bash_Replace_Character - Fatal编程技术网

String Bash保存tr操纵的字符串

String Bash保存tr操纵的字符串,string,bash,replace,character,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)}”没有像我希望的那样保存变量。例如,当

我有一个小程序,它要求用户输入它的名字和姓氏。我需要将给定姓氏的最后一个字符更改为名字和姓氏中的下划线(以及字符串中出现的任何下划线)。我还需要将用户的名字改为大写字母。我得到了代码的这一部分,在这里我操作给定的字符串

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_uo_uuNikko”
。我试图通过编写
echo“${X^^}”tr${Y:(-1)}”
来解决这个问题,但它仍然返回
“Hello CANNON Nikko”
。我发现n和n不是同一个字符,所以不会改变

但是为什么不在第2行保存变量呢?我需要如何处理这个问题?

如果我理解正确, 与此相反:

您要执行以下操作:

X=$(tr ${Y:(-1)} "_" <<< "$X")
如果我理解正确的话, 与此相反:

您要执行以下操作:

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

X=$(tr${Y:(-1)}”使用正确的工具更改字符串
${/}

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"

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

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"

当然,第2行不生成输出;赋值语句不生成输出,因此管道不读取任何内容。此外,您正在子shell中设置
X
,该子shell在管道完成后退出。当然,第2行不生成输出;赋值语句不生成输出,因此管道不读取任何内容。此外,您正在su中设置
X
b管道完成后退出的shell。
^
表示每个匹配模式的大写字母(如果省略,则默认为
),因此不需要
首字母
。只需使用
${first^}
@janos是的,谢谢你的回答。我来自java,对Bash是个新手。我现在知道了如何正确地用tr保存一个被操纵的字符串。
^
表示每个匹配的模式都是大写的(如果省略,默认为
),所以
第一个字母
是不必要的。只需使用
${first^}
@janos是的,谢谢你的回答。我来自java,对Bash不熟悉。我现在了解了如何使用tr正确保存已操纵的字符串。谢谢,我已经准备好了阅读部分。不过,我在前面编辑了问题,说找到的最后一个字符需要替换,字符串中出现的每一个字符都需要替换为谢谢,我已经准备好了阅读部分。但是我在前面编辑了问题,说找到的最后一个字符需要替换,字符串中出现的每一个字符都需要替换。