我正在尝试创建一个带有两个参数的脚本,第一个是数字,第二个是字符串/文件列表。
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
如果有人能给我一个非常感激的提示。
答案 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