我想在变量前后打印一些文本,但是如果未定义,则什么也不打印。例如,考虑一个函数frotz
,它格式化了一个由两部分组成的消息:第二部分应该出现在括号中,但是如果第二部分为空,则括号中就不应出现:
% frotz foo bar
foo (bar)
% frotz foo
foo
frotz
的实现是什么?显然,我可以使用if
来做到这一点,但是我想更简洁一些,大概是使用参数扩展。但是,我还没有找到一种好的方法。例如,这有效:
print "$1${2:+ (}$2${2:+)}"
…但要求我重复${2
3次。有没有一种方法只需写入一次可能为空的变量的名称? (要获得加分,我想要一个也可以在bash
(1)中使用的解决方案,但是我对zsh
(1)最为感兴趣。)
答案 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”。)
但是,这太复杂了,以至于我只是说了一下“用它来做”,并从中使用了一个函数,调用者和被调用者对此都更具可读性。