繁体   English   中英

对脚本当前所在目录以外的目录运行 bash 脚本时,二进制运算符预期错误

[英]Binary operator expected error when running a bash script against a directory other than the one the script is currently located in

首先,我对 bash 脚本非常陌生。 我编写了一个脚本来检查目录中的条目并打印有关条目的信息。 如果条目是文件,它会打印文件大小,如果有目录,它会打印这些目录中有多少项目。 当我针对它位于脚本中的目录运行脚本时,它成功完成。 如果我对另一个目录运行脚本,我会收到错误“Binary operator expected”。 这是可以预料的吗? 这是代码:

#!/bin/bash
# Print the contents of a directory with details on files and directories

files=( $1* )
count=0
for entry in $1/*
do
    if [ -d $entry ]
    then
        for f in $entry/*
            do
                let count=count+1
            done
        echo $entry ":" "This is a directory with $count files present."
        let count=0
    else [ -f $entry ]
        echo $entry "This is a file of" $(wc -c <"$entry") "bytes."
    fi
done

我确信这段代码并不完美,而且很可能有一个更简单的方法,所以我只是在寻找一些建议。 感谢您的任何帮助。

弗曼德国人

固定脚本:

#!/usr/bin/env sh

for entry in "$1/"*; do
  if [ -d "$entry" ]; then
    count="$(printf '%s\0' "$entry/"* | grep -cF '')"
    printf '%s : This is a directory with %d files present.\n' "$entry" "$count"
  else
    if [ -f "$entry" ]; then
      size="$(wc -c <"$entry")"
      printf '%s This is a file of %d bytes.\n' "$entry" "$size"
    fi
  fi
done
  • 删除了$1参数周围缺少引号的未使用赋值:
    files=( $1* )
  • 修复了$entry变量周围缺少引号的问题:
    if [ -d $entry ]
  • 将循环替换为单个赋值、损坏的缩进和路径$entry/的非通配部分周围缺少引号:

     for f in $entry/* do let count=count+1 done
  • 用正确的printf替换echo混合文字和变量缺少引号: echo $entry ":" "This is a directory with $count files present." echo $entry "This is a file of" $(wc -c <"$entry") "bytes."
  • $entry变量周围添加了缺少的引号并添加了缺少的if块: else [ -f $entry ]

关于在不运行 shell 循环的情况下计算目录中的条目的说明:

printf '%1s\0' "$entry/"* | grep -cF '' printf '%1s\0' "$entry/"* | grep -cF ''

  • printf '%1s\0' "$entry/"* :打印所有文件的 null 分隔列表。
  • | grep -cF '' | grep -cF '' : Pipe 它进入grep以计算null字符)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM