如何在bash shell中格式化string?

我想在Linux中格式化一个variables

str="Initial Value = 168" echo "New Value=$(echo $str| cut -d '=' -f2);">>test.txt 

我期待以下输出

 Value = 168; 

但取而代之

 Value = 168 ^M; 

不要在DOS或Windows上编辑你的bash脚本。 你可以在bash脚本上运行dos2unix 。 问题是Windows使用“\ r \ n”作为行分隔符,Linux使用“\ n”。 您也可以在Linux上的编辑器中手动删除“\ r”字符。

尝试这个:

 #! /bin/bash str="Initial Value = 168" awk '{print $2"="$4}' <<< $str > test.txt 

输出:

 cat test.txt Value=168 

我有评论说,它没有解决^ M,我其实是这样的:

 echo -e 'Initial Value = 168 \r' | cat -A Initial Value = 168 ^M$ 

awk之后:

 echo -e 'Initial Value = 168 \r' | awk '{print $2"="$4}' | cat -A Value=168$ 

首先,总是引用你的变量。

 #!/bin/bash str="Initial Value = 168" echo "New Value=$(echo "$str" | cut -d '=' -f2);" 

对我来说,这导致了输出:

 New Value= 168; 

如果你在数字和分号之间得到一个回车符,那么你的echo可能是错误的,或者你的输入数据可能不是你想象的那样。 也许你正在Windows机器上编辑你的脚本并将其复制回来,而你的变量赋值是获得DOS风格的换行符。 根据你提供的信息,我不能告诉你。

无论如何,我不会这样做。 我会用printf

 #!/bin/bash str="Initial Value = 168" value=${str##*=} printf "New Value=%d;\n" "$value" 

printf的输出是可以预测的,并且当你不需要的时候,它可以轻松地去掉像空白那样的垃圾。

请注意更换您的cut 。 bash内置函数的功能记录在Bash手册页的“Parameter Expansion”下,如果你想查看它的话。 我在这里包含的替换与您提出的问题不完全相同 ,但在功能上与您提供的示例数据相同。

 str="Initial Value = 168" newstr="${str##* }" echo "$newstr" # 168 

模式匹配是要走的路。