zip在终端中起作用,但在脚本中不起作用?

时间:2019-05-07 18:35:31

标签: linux bash shell zip

我正在写一个基于zenity的bash脚本,该脚本允许用户选择要压缩的文件并使用zip压缩文件。 问题是,每当我到达“压缩”部分时,它都将不起作用。另一方面,当我直接将完全相同的命令直接写入终端时,一切正常,并出现新的zip文件。

当然,我的脚本代码顶部确实有#!/bin/bash。 我已经尝试了两种命令,带引号和撇号(在终端的撇号允许使用多个单词的文件名,而引号仅适用于一个单词的文件名),但是没有一个。这就是我使用命令的方式:

命令:

    zip 'file name.zip' '/home/user/filetozip.txt'
    zip "file name.zip" "/home/user/filetozip.txt"

两个选项都让我省了(当然一个会打印撇号,另一个会打印引号):

    zip warning: name not matched: name.zip'
    zip warning: name not matched: '/home/user/filetozip.txt'
    zip error: Nothing to do! ('file.zip)

正如我之前说过的,无论我是否使用单字文件名,撇号选项在输入终端时都可以完美地工作。带引号的仅适用于一字文件名。我不知道为什么脚本总是输出这些错误。

理想情况下,我希望脚本允许使用多个单词的文件名,但是如果有人至少可以为我提供一个单词的文件名的答案,我也将不胜感激。


这是脚本中负责压缩的部分:

    FILE=`zenity --file-selection --title "Choose the file for compression"`
    NAME=`zenity --entry --title "File name" --text "Enter the name for the zip file:"`
    zenity --question --title "Encryption" --text="Do you want your zip file to be password protected?" --ok-label="Yes" --cancel-label="No" --width 230
    if [[ $? -eq 0 ]]; then
       PASS=`zenity --password --title "Password" --text "Enter password:" --width 250`
       while [[ -z $PASS ]]; do
       zenity --error --title "Error" --text "Empty password" --width 200
       PASS=`zenity --password --title "Password" --text "Enter password:" --width 250`
       done
       #zip with password
       ODP="-P ${PASS} '${NAME}.zip' '${FILE}'"
    else #zip without password
       ODP="'${NAME}.zip' '${FILE}'"
    fi
    zip $ODP

1 个答案:

答案 0 :(得分:1)

请确保您首先通过https://www.shellcheck.net检查代码,以避免常见的shell问题。

由于shell脚本阻塞了空白字符,因此这里最好使用数组。这样会保留实际的字符串。

  FILE=$(zenity --file-selection --title "Choose the file for compression")
    NAME=$(zenity --entry --title "File name" --text "Enter the name for the zip file:")
    zenity --question --title "Encryption" --text="Do you want your zip file to be password protected?" --ok-label="Yes" --cancel-label="No" --width 230
    if [[ $? -eq 0 ]]; then
       PASS=$(zenity --password --title "Password" --text "Enter password:" --width 250)
       while [[ -z $PASS ]]; do
       zenity --error --title "Error" --text "Empty password" --width 200
       PASS=$(zenity --password --title "Password" --text "Enter password:" --width 250)
       done
       #zip with password
       ODP=(-P "${PASS}" "${NAME}".zip "${FILE}")
    else #zip without password
       ODP=("${NAME}.zip" "${FILE}")
    fi
    zip "${ODP[@]}"