我经常会收到无序的文档ID列表。我可以很容易地对它们进行排序和打印,但我想为每个可用文档打印一行,并在给定列表中的所有值旁边显示一个星号(或任何真正的,只是为了突出显示)。
比如......
$ ./t.sh "1,4,3" 5
1*
2
3*
4*
5
$
第一个参数是无序列表,第二个参数是文档总数。
答案 0 :(得分:1)
如果“可用文档”是指“磁盘上的现有文件”,则假设您有5个文件,并且您正在检查是否有1,4和3.以下脚本将生成排序输出。
#!/bin/bash
#Store the original IFS
ORGIFS=$IFS
#Now Set the Internal File Separater to a comma
IFS=","
###Identify which elements of the array we do have and store the results
### in a separate array
#Begin a loop to process each array element
for X in ${1} ; do
if [[ -f ${X} ]] ; then
vHAVE[$X]=YES
fi
done
#Now restore IFS
IFS=$ORGIFS
#Process the sequence of documents, starting at 1 and ending at $2.
for Y in $(seq 1 1 $2) ; do
#Check if the sequence exists in our inventoried array and mark accordingly.
if [[ ${vHAVE[$Y]} == YES ]] ; then
echo "$Y*"
else
echo "$Y"
fi
done
返回结果:
rtcg@testserver:/temp/test# ls
rtcg@testserver:/temp/test# touch 1 3 4
rtcg@testserver:/temp/test# /usr/local/bin/t "1,4,3" 5
1*
2
3*
4*
5
答案 1 :(得分:0)
以下代码适用于您的示例。
A
)contains
检查A
中的一个元素是否在第一步生成的序列中我没有检查参数长度,你应该这样做以获得更合适的脚本。
#!/bin/bash
function contains() {
local n=$#
local value=${!n}
for ((i=1;i < $#;i++)) {
if [ "${!i}" == "${value}" ]; then
echo "y"
return 0
fi
}
echo "n"
return 1
}
IFS=', ' read -a array <<< $1
for i in $(seq $2); do
if [ $(contains "${array[@]}" "${i}") == "y" ]; then
echo "${i}*"
else
echo "${i}"
fi
done
答案 2 :(得分:0)
您可以使用参数替换来构建扩展模式,该模式可用于将文档编号与要标记的文档列表进行匹配。
#!/bin/bash
# 1,4,3 -> 1|4|3
to_mark=${1//,/|}
for(( doc=1; doc <= $2; doc++)); do
# @(1|4|3) matches 1, 4 or 3
printf "%s%s\n" "$doc" "$( [[ $doc = @($to_mark) ]] && printf "*" )"
done