我尝试过用 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//-}"