我正在写一个基于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
答案 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[@]}"