决定如何使用set和shift更清晰的解决方案

时间:2016-04-11 13:52:12

标签: linux bash command-line

我想列出英语和法语的一周中的所有日子(见下面的示例图片),但我发现自己正在为一个简单的问题编写一些复杂的语法。

对于这种情况,是否有更清洁,更好的解决方案?

这是我的bash脚本

#!/bin/bash

en_weeks='mon tue wed thu fri sat sun'

fr_weeks='lun mar mer jeu ven sam dim'

for i in $(seq 0 6)
do
    set $en_weeks
    shift $i
    echo -n "$1 "
    set $fr_weeks
    shift $i
    echo $1
done

这是脚本的输出:

sample output

3 个答案:

答案 0 :(得分:1)

仅限英文名称:

#!/usr/bin/env bash

weeks=(mon tue wed thu fri sat sun)

for i in {0..6}; do
    echo "${weeks[$i]}"
done

我正在使用数组,因为它更干净。

答案 1 :(得分:1)

我不确定您是否想要一种更简单的方法来做同样的事情,或者如果您需要来使用set / shift ...

由于你正在使用bash,我会利用这些基础知识并使用:

en_weeks=(mon tue wed thu fri sat sun)
fr_weeks=(lun mar mer jeu ven sam dim)

for i in {0..6}
do
  echo ${en_weeks[$i]} ${fr_weeks[$i]}
done

答案 2 :(得分:1)

1)POSIX,没有 bash 主义:

en_weeks="mon tue wed thu fri sat sun"
fr_weeks="lun mar mer jeu ven sam dim"
echo $fr_weeks | tr ' ' '\n'  | \
for i in $en_weeks ; do read x ; echo $i $x ; done

不需要 seq ,一个列表通过直接逐项列出,一个循环读取获取另一个列表 - 管道到 for 循环就像管道一样工作循环。

2)非常简短,使用BSD reshape util rs 来转置数据:

echo -e $fr_weeks'\n'$en_weeks | rs -T