作为参数传递时从字符串中删除字符

作为参数传递时从字符串中删除字符

我尝试过用 Google 搜索这个问题,也测试了我能想到的所有排列,但还是没找到。:(

我有一个接受已识别输入字符串的函数:

[user@Dreadnaught /]$ myfunction -w InputString

该函数有多个输入选项,因此我需要确定我正在将字符串传递给 -w 选项。我从另一个程序获取的字符串中有破折号:

In-put-St-ring

我可以在测试回声时删除这些破折号:

[user@Dreadnaught /]$ echo "In-put-St-ring" |tr -d -
InputString

但我不知道如何在传递给函数时去掉破折号。我试过(但没有成功):

[user@Dreadnaught /]$ OldString="In-put-St-ring"
[user@Dreadnaught /]$ echo $OldString
In-put-St-ring
[user@Dreadnaught /]$ NewString=$OldString|tr -d -
[user@Dreadnaught /]$ echo $NewString

[user@Dreadnaught /]$ NewString=$($OldString|tr -d -)
-ash: In-put-St-ring: not found
[user@Dreadnaught /]$ NewString=$("$OldString"|tr -d -)
-ash: In-put-St-ring: not found
[user@Dreadnaught /]$ NewString=$(""$OldString"|tr -d -")
-ash: In-put-St-ring|tr -d -: not found

和...

[user@Dreadnaught /]$ myfunction -w $("In-put-St-ring" |tr -d -)
-ash: In-put-St-ring: not found
myfunction: option requires an argument -- 'w'

还有......其他一些。

我确信对于比我更有 Bash 经验的人来说这很简单,但我却不知所措。感谢您的帮助!

答案1

您忘了使用echo

管道不发送变量到命令 – 管道连接一个命令的输出到另一命令的输入。也就是说,echo "In-put-St-ring"首先处理整体,然后才将其输出发送到tr;而不是相反。

换句话说,每次使用管道时,都可以这样解释:

(echo "$OldString") | (tr -d -)

因为替换中使用的语法$( ... )与“主”命令行完全相同,所以您还需要使用echo来实际生产变量的内容在通过管道传输之前作为输出:

NewString=$(echo "$OldString" | tr -d -)

myfunction -w "$(echo "$OldString" | tr -d -)"

也就是说,实际上还有一种替代的 bash 特定方法,用于仅通过管道传输一些文本而不传输整个命令(尽管它不一定更好;在某些情况下甚至可能更糟):

NewString=$(tr -d - <<< "$OldString")

myfunction -w "$(tr -d - <<< "$OldString")"

但你应该只使用参数扩展

NewString=${OldString//-}

myfunction -w "${OldString//-}"

相关内容