簡體   English   中英

檢查文件是否存在[BASH]

[英]Check if file exists [BASH]

如何檢查bash中是否存在文件?

當我嘗試這樣做時:

FILE1="${@:$OPTIND:1}"
if [ ! -e "$FILE1" ]
then 
    echo "requested file doesn't exist" >&2
    exit 1
elif
<more code follows>

我總是得到以下輸出:

 requested file doesn't exist

該程序的用法如下:

script.sh [-g] [-p] [-r FUNCTION_ID|-d FUNCTION_ID] FILE

有什么想法嗎? 我會很高興為您提供任何幫助。

附言:我希望我能顯示整個文件,而不會因為重復而被學校開除。 如果有一種私人的交流方式,我會很樂意承擔。

我的錯。 Fas強制將二進制文件放入錯誤的位置。 感謝大家的幫助。

調試此類問題的小技巧。 將這些行添加到腳本頂部:

export PS4="\$LINENO: "
set -xv

set -xv將在執行之前先打印出每一行,然后在外殼插入變量后再打印該行,等等。 $PS4set -xv使用的提示。 這將在執行時打印shell腳本的行號。 您將能夠了解正在發生的事情以及可能遇到的問題。

這是一個測試腳本的示例:

#! /bin/bash

export PS4="\$LINENO: "
set -xv

FILE1="${@:$OPTIND:1}"         # Line 6
if [ ! -e "$FILE1" ]           # Line 7
then 
    echo "requested file doesn't exist" >&2
    exit 1
else
    echo "Found File $FILE1"   # Line 12
fi

這是我運行它時得到的:

$ ./test.sh .profile
    FILE1="${@:$OPTIND:1}"
6: FILE1=.profile
    if [ ! -e "$FILE1" ]
    then 
        echo "requested file doesn't exist" >&2
        exit 1
    else
        echo "Found File $FILE1"
    fi
7: [ ! -e .profile ]
12: echo 'Found File .profile'
Found File .profile

在這里,我可以看到將$FILE1設置$FILE1 .profile ,並且腳本了解了${@:$OPTIND:1} 最好的是,它可以在所有原始Bourne外殼上使用。 這意味着,如果您沒有按照自己的預期運行Bash,則會看到腳本失敗的地方,並可能會解決問題。

我懷疑您可能未在Bash中運行腳本。 你放#! /bin/bash #! /bin/bash在頂部?


script.sh [-g] [-p] [-r FUNCTION_ID | -d FUNCTION_ID]文件

您可能要使用getopts解析參數:

#! /bin/bash

USAGE=" Usage:
    script.sh [-g] [-p] [-r FUNCTION_ID|-d FUNCTION_ID] FILE
"
while getopts gpr:d: option
do
    case $option in
        g)  g_opt=1;;
        p)  p_opt=1;;
        r)  rfunction_id="$OPTARG";;
        d)  dfunction_id="$OPTARG";;
        [?])
            echo "Invalid Usage" 1>&2
            echo "$USAGE"        1>&2
            exit 2
            ;;
    esac
done

if [[ -n $rfunction_id && -n $dfunction_id ]]
then
    echo "Invalid Usage: You can't specify both -r and -d" 1>&2
    echo "$USAGE" >2&
    exit 2
fi

shift $(($OPTIND - 1))
[[ -n $g_opt ]] && echo "-g was set"
[[ -n $p_opt ]] && echo "-p was set"
[[ -n $rfunction_id ]] && echo "-r was set to $rfunction_id"
[[ -n $dfunction_id ]] && echo "-d was set to $dfunction_id"
[[ -n $1 ]] && echo "File is $1"

要(概述)並添加到@DavidW。的出色答案:

  • 檢查腳本的shebang行 (第一行)以確保它由bash執行:是#!/bin/bash還是#!/usr/bin/env bash

  • 檢查腳本文件中是否存在隱藏的控制字符 (例如\\r ),這些字符可能導致意外的行為; 運行cat -v scriptFile | fgrep ^ cat -v scriptFile | fgrep ^ -應該不產生輸出; 如果文件確實包含\\r字符,則它們將顯示為^M

    • 要刪除\\r實例(更准確地說,是將Windows風格的\\r\\n換行符序列轉換為Unix \\n only序列),可以使用dos2unix file進行就地轉換; 如果沒有此實用程序,則可以使用sed 's/'$'\\r''$//' file > outfile (注意:請使用不同的輸出文件,否則將破壞您的輸入文件); 要刪除所有 \\r實例(即使后面沒有\\n ),請使用tr -d '\\r' < file > outfile (注意:請使用不同的輸出文件,否則將破壞您的輸入文件)。
  • 除了@DavidW。出色的調試技術外,您還可以添加以下內容以直觀地檢查傳遞給腳本的所有參數
i=0; for a; do echo "\$$((i+=1))=[$a]"; done 

(例如,將值包含在[...]的目的是查看值的確切邊界。)

這將產生類似以下內容:

$1=[-g]
$2=[input.txt]
...

但是請注意,如果未傳遞任何參數,則什么也不會打印。

嘗試打印FILE1以查看它是否具有所需的值,如果這不是問題,則這里是一個簡單的腳本(下面的網站):

#!/bin/bash
file="${@:$OPTIND:1}"
if [ -f "$file" ]
then
    echo "$file found."
else
    echo "$file not found."
fi

http://www.cyberciti.biz/faq/unix-linux-test-existence-of-file-in-bash/

相反,在一個棘手的方式采摘的項目了“$ @”的,你為什么不shift掉你用getopts的處理ARGS:

while getopts ...
done

shift $(( OPTIND - 1 ))

FILE1=$1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM