zsh:如果定义了变量,则带有周围的文本?

时间:2019-05-29 20:26:49

标签: shell zsh

我想在变量前后打印一些文本,但是如果未定义,则什么也不打印。例如,考虑一个函数frotz,它格式化了一个由两部分组成的消息:第二部分应该出现在括号中,但是如果第二部分为空,则括号中就不应出现:

% frotz foo bar
foo (bar)
% frotz foo
foo

frotz的实现是什么?显然,我可以使用if来做到这一点,但是我想更简洁一些,大概是使用参数扩展。但是,我还没有找到一种好的方法。例如,这有效:

print "$1${2:+ (}$2${2:+)}"

…但要求我重复${2 3次。有没有一种方法只需写入一次可能为空的变量的名称? (要获得加分,我想要一个也可以在bash(1)中使用的解决方案,但是我对zsh(1)最为感兴趣。)

2 个答案:

答案 0 :(得分:1)

并非完全符合您的要求,但是使用POSIX constructor() { super(); this.state = { lastDayOfMonth: [], currentLastDate: [], currentDate: new Date(), }; } storeLastDate = () => { let date, string, lastDate, list = []; date = new Date(); for (let i = 1; i < 13; i++) { lastDate = new Date(date.getFullYear(), i, 0); string = lastDate.toDateString().split(' '); list.push(string); } return list; } /* Finds the matching month of current date */ curLastDate = () => { for (let i = 0; i < this.state.lastDayOfMonth.length; i++) { if (this.state.currentDate[1] === this.state.lastDayOfMonth[i][1]) { console.log(this.state.lastDayOfMonth[i][1]); return this.state.lastDayOfMonth[i][1]; } } } componentDidMount = () => { const lastDayOfMonth = this.storeLastDate(); this.setState({ lastDayOfMonth: lastDayOfMonth }, () => { this.setState({ currentLastDate: this.curLastDate() }); }) // curLastDate as callback, which will be executed after setting state } 运算符可以消除对:+的引用。

$2

({frotz () { print "$1${2:+ ($2)}" } 可能可以通过仅引用zsh来做到这一点,但我尚不清楚那是什么。)

答案 1 :(得分:0)

尽管找到了zsh特定的方法,但它需要先设置EXTENDED_GLOB选项:

frotz () {
    print "$1${2/(#b)(?*)/ (${match[1]})}"
}

它无条件打印$2,但是由于?*仅匹配 non -空字符串,因此空字符串仍然不打印任何内容,这是我想要的,但不打印-空字符串获取空格和括号。 ((#b)激活了反向引用,这是我发现在替换中使用匹配的字符串的唯一方法-${match[1]}。请参见zshexpn(1),“ globbing flags”。)

但是,这太复杂了,以至于我只是说了一下“用它来做”,并从中使用了一个函数,调用者和被调用者对此都更具可读性。