簡體   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