如何使以下z shell脚本发挥与bash中相同的作用?
for x in {f..k}
do echo ${x}
done
在bash中,我打印了f j k,但是在zsh中,我按字面上打印了{f..k}。
编辑
我实际上想做的(最初应该提到的)是:
FIRSTLETTER=a
LASTLETTER=b
for x in {$FIRSTLETTER..$LASTLETTER}
do
echo "/dev/sd${x}1"
done
答案 0 :(得分:1)
有效:
for x ({f..k}); echo ${x}
答案 1 :(得分:1)
在bash
中,括号扩展发生在参数扩展之前。结果是{$FIRSTLETTER..$LASTLETTER}
不需要大括号扩展,因为它不是有效的序列表达式:
序列表达式的格式为{x..y [.incr]},其中x和y为 整数或单个字符
然后,文字字符串才进行参数扩展,从而产生单个单词{a..b}
。
在zsh
中,括号扩展发生在 之后,其他几种扩展类型(包括参数扩展)也已发生。因此,{$FIRST_LETTER..$LAST_LETTER}
扩展为{a..b}
,然后进行括号扩展以生成a b
。
最终结果是您所做的工作应该在zsh
中有效,但不能在bash
中有效。此外,由于缺少使用eval
的方法,因此无法在bash
中进行所需的操作。
for x in $(eval "echo {$FIRSTLETTER..$LASTLETTER}")
请记住,这是脆弱的,并且要求您非常确保两个参数只能扩展为单个字母。
答案 2 :(得分:0)
没有zsh方便,只是尝试解决方法。会这样做吗?
for o in $(seq 102 107)
do x=$(printf %x $o)
printf "\x$x"
done