如何检查 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
The set -xv
将在执行之前打印出每一行,然后在 shell 插入变量等后打印该行。$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
to .profile
,并且我的脚本理解这一点${@:$OPTIND:1}
。最好的事情是它适用于所有 shell,直到原始的 Bourne shell。这意味着,如果您没有像您想象的那样运行 Bash,您将看到脚本失败的地方,并可能解决问题。
我怀疑您可能没有在 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"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)