我使用名为ThousandsDotting
的别名,每3个数字(经典点数为千位)添加点.
,因此100000
成为100.000
}。
它在shell中工作正常,但不在函数中。
示例文件example.sh
:
#!/bin/bash
function test() {
echo "100000" | ThousandsDotting
}
alias ThousandsDotting="perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/\1./g'"
test
如果我运行它,这就是我得到的:
$ ./example.sh
example.sh: line 3: ThousandsDotting: command not found.
在我的Bash shell脚本的函数中,管道(或者在没有管道的情况下使用它)的正确方法是什么stdout数据到此perl
命令?
答案 0 :(得分:3)
默认情况下,别名在bash中受限制,因此只需启用它即可。
#!/bin/bash
shopt -s expand_aliases
alias ThousandsDotting="perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/\1./g'"
function test() {
echo "100000" | ThousandsDotting
}
test
<强>输出强>
100.000
答案 1 :(得分:2)
在BASH中别名不是继承的。
最好改为创建一个函数:
ThousandsDotting() { perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/\1./g' "$1"; }
然后,您可以将其用作流程替换:
ThousandsDotting <(echo "100000")
100.000
答案 2 :(得分:1)
alias
适用于互动bash
。变化
#!/bin/bash
到
#!/bin/bash -i
来自man bash
:
If the -i option is present, the shell is interactive.
答案 3 :(得分:0)
别名未在bash中展开,无法用作宏。您可以启用它们,有关更多信息,请查看BASH http://tldp.org/LDP/abs/html/aliases.html的永恒指南。
您可以使用bash提供的常规工具实现与宏相同:
#!/bin/bash
function test() {
echo "100000" | perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/\1./g'
}
test
你可以通过使函数具有参数来改进这一点:这样你就可以将任何参数传递给函数test
,通过使用别名来获得你所拥有的:
#!/bin/bash
function test() {
perl -pe 's/(\d{1,3})(?=(?:\d{3}){1,5}\b)/\1./g' "$1"
}
test 100000