sh shell使用for循环的脚本

时间:2011-10-27 13:15:50

标签: shell sh

我使用sh shell脚本来读取文件夹的文件并显示在屏幕上:

for d in `ls -1 $IMAGE_DIR | egrep "jpg$"`
do
  pgm_file=$IMAGE_DIR/`echo $d | sed 's/jpg$/pgm/'`

  echo "file  $pgm_file";
done

输出结果逐行读取:

  

file file1.jpg

     

file file2.jpg

     

file file3.jpg

     

file file4.jpg

因为我不熟悉这种语言,所以我希望得到的结果是将前2个结果打印在同一行中,如下所示:

  

file file1.jpg; file file2.jpg;

     

file file3.jpg; file file4.jpg;

在其他语言中,我只是放了d ++,但它不适用于这种情况。

这可行吗?如果您能提供示例代码,我将很高兴。

提前感谢。

4 个答案:

答案 0 :(得分:3)

让shell为你做更多工作:

end_of_line=""
for d in "$IMAGE_DIR"/*.jpg
do
  file=$( basename "$d" )
  printf "file %s; %s" "$file" "$end_of_line"
  if [[ -z "$end_of_line" ]]; then
    end_of_line=$'\n'
  else
    end_of_line=""
  fi

  pgm_file=${d%.jpg}.pgm
  # do something with "$pgm_file"
done

答案 1 :(得分:1)

for d in "$IMAGE_DIR"/*jpg; do
  pgm_file=${d%jpg}pgm
  printf '%s;\n' "$d"
done |
  awk 'END { 
        if (ORS != RS)
          print RS
          }
       ORS = NR % n ? FS : RS
       ' n=2

将n设置为您需要的任何值。 如果您使用 Solaris ,请使用 nawk / usr / xpg4 / bin / awk (不要使用 / usr / bin / awk )。

另请注意,我正在尝试使用标准的shell语法, 鉴于您的问题与 sh 相关(即您没有提及 bash ksh , 例如)。

答案 2 :(得分:0)

循环中有这样的东西:

echo -n "something; "
[[ -n "$oddeven" ]] && oddeven= || { echo;oddeven=x;}

应该这样做。

每行三个就像

[[ "$((n++%3))" = 0 ]] && echo
在进入循环之前

(使用n=1)。

答案 3 :(得分:0)

为什么要使用循环?怎么样:

ls $IMAGE_DIR | egrep 'jpg$' |
   sed -e 's/$/;/' -e 's/^/file /' -e 's/jpg$/pgm/' |
   perl -pe '$. % 2 && chomp'

(perl只删除所有其他换行符。如果最后一行是奇数,你可能想要插入一个空格并添加一个尾随换行符。)