Shell脚本在两个字符串

时间:2016-01-22 05:48:04

标签: shell sh

我正在尝试创建一个带有两个参数的脚本,第一个是数字,第二个是字符串/文件列表。

listfile 3 test.txt test1.txt test2.txt

基本上我要做的是将文件名放在2个字符串<h></h>下。像这样:

<h>
test.txt
test1.txt
test2.txt
</h>

可以进入的内容数量由第一个参数决定,上面的例子是3。

另一个例子是如果我运行类似:

  listfile 1 test.txt test1.txt test2.txt

在这种情况下,每个<h></h>可以容纳1个文件。所以输出看起来像这样:

<h>
test.txt
</h>
<h>
test1.txt
</h>
<h>
test2.txt
</h>

这是我的尝试:

#!/bin/sh

value=0
arg1=$1
shift
for i in "$@"
do
    if [ $value -eq 0 ]; then
        echo "<h>"
    fi
    if [ $value -lt $arg1 ]; then
        echo "$i"
        value=`expr $value + 1`
    fi
    if [ $value -ge $arg1 ]; then
        echo "</h>"
        value=`expr $value - $value`
    fi
done

到目前为止,我得到了它的工作,但唯一的问题是最后</h>似乎没有得到输出,我似乎无法找到解决方法。如果我尝试:

listfile 4 test.txt test1.txt test2.txt

它输出但缺少</h>

<h>
test.txt
test1.txt
test2.txt

如果有人能给我一个非常感激的提示。

2 个答案:

答案 0 :(得分:1)

#!/bin/sh

value=0
arg1=$1
shift
echo "<h>"
for i in "$@"
do
    if [ $value -ge $arg1 ]; then
        echo "</h>"
        echo "<h>"
        value=`expr $value - $value`
    fi
    echo "$i"
    value=`expr $value + 1`
done
echo "</h>"

答案 1 :(得分:0)

我明白你想要完成的事情。您提供了一组带有前导数字的位置参数,并且您希望在<h>...</h>标记之间对该数量的参数进行分组。

这是一种与其他人略有不同的方法。添加了一个检查,用于测试您的第一个位置参数是否提供标记之间剩余行的均匀分布,如果行数不能均匀分割为该数字的组,则会提供错误。

#!/bin/sh

arg1="$1"
shift
nargs="$#"
if [ $(((nargs - arg1) % arg1)) -ne 0 ]
then
    printf "error: arg1 provides unequal line distribution\n"
    exit 1
fi
echo "<h>"
for ((i = 1; i <= $nargs; i++))
do
    echo "$1"
    if [ $((i % arg1)) -eq 0 ]
    then
        if [ "$i" -lt "$nargs" ]
        then
            printf "</h>\n<h>\n"
        else
            printf "</h>\n"
        fi
    fi
    shift
done

使用/输出

$ sh outputh.sh 1 line.txt line1.txt line2.txt
<h>
line.txt
</h>
<h>
line1.txt
</h>
<h>
line2.txt
</h>

$ sh outputh.sh 2 line.txt line1.txt line2.txt
error: arg1 provides unequal line distribution

$ sh outputh.sh 3 line.txt line1.txt line2.txt
<h>
line.txt
line1.txt
line2.txt
</h>

注意:如果您想允许标签之间的线路分布不均,例如:

$ sh outputh2.sh 2 line.txt line1.txt line2.txt
<h>
line.txt
line1.txt
</h>
<h>
line2.txt
</h>

然后需要进行一些额外的调整。以下内容将允许所有发行版 - 相同或不相同:

#!/bin/sh

closed=1
arg1="$1"
shift
nargs="$#"
echo "<h>"
for ((i = 1; i <= $nargs; i++))
do
    echo "$1"
    if [ $((i % arg1)) -eq 0 ]
    then
        if [ "$i" -lt "$nargs" ]
        then
            printf "</h>\n<h>\n"
            closed=1
        else
            printf "</h>\n"
            closed=0
        fi
    fi
    shift
done

if [ "$closed" -eq 1 ]
then
    echo "</h>"
fi