如果传递的文件是错误的扩展名,则打破bash脚本执行

时间:2017-06-07 10:56:25

标签: bash shell if-statement terminal

我有一个小的bash文件,我用来压缩PDF并进行其他一些文件操作。如果传递的文件名没有 .pdf .PDF 扩展名,我想暂停执行此bash脚本。

目前的做法:

# Take file name
fle_nme=$1

# Check if passed PDF file
# -ne - not equal
if ["${fle_nme: -4}" -ne ".pdf"] ||  ["${fle_nme: -4}" -ne ".PDF"]; then
        echo "Incorrect file."
        exit
fi

当前输出

脚本失败但没有所需的消息:

[me@onthebox bashStuff ERR]$ compressPDF ~/bashFun/failWithThisExtension.bad
compressPDF.sh: line 16: [.bad: command not found
compressPDF.sh: line 16: [.bad: command not found

期望的结果

  • 脚本的执行应该完成
  • 消息不正确的文件应打印到控制台

2 个答案:

答案 0 :(得分:2)

bash中修复if条件,在[]周围添加空格并始终记住引用变量并记住-ne用于整数比较和 用于字符串比较。

fle_nme="$1"
if [ "${fle_nme: -4}" != ".pdf" ] ||  [ "${fle_nme: -4}" != ".PDF" ]; then

(或)您拥有相对较新版本的bash,您可以设置nocasematch选项,该选项适用于.pdf.PDF

shopt -s nocasematch
if [[ "${fle_nme: -4}" != ".pdf" ]]; then
..

shopt -u nocasematch

另外值得补充的是,您要设置的shell选项需要在比较完成后立即禁用。如果不是,该选项将传播到脚本的其余部分,这可能会影响您的其他字符串比较。

作为旁注,从文件名中提取扩展名的最佳方法是使用如下所示的参数扩展语法,这样您就不必担心包含文件扩展名的字符数

shopt -s nocasematch
if [[ "${fle_nme##*.}" != "pdf" ]]; then

答案 1 :(得分:1)

这不是正确的语法。它应该是:

-ne

正如Inian所说,你需要空间。此外,-a用于数字比较。最后,使用.Pdf代替括号内的

Inian的第二个选项最好,如果你还想允许.pDf.frm-find-people table td:nth-child(1) { padding: 5px 15px; width: 100px } .frm-find-people table td:nth-child(2) { border: 1px solid red; }以及所有其他此类人选。