[英]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
將在執行之前先打印出每一行,然后在外殼插入變量后再打印該行,等等。 $PS4
是set -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
(注意:請使用不同的輸出文件,否則將破壞您的輸入文件)。 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.