我正在尝试编写一个需要用户交互的脚本。基本上,该脚本必须向用户询问 3 个参数:用户想要查找的文件的名称、文件修改的天数以及 tar 存档的名称。当所有参数已知时,脚本必须找到适当的文件并将它们放入具有给定名称的存档中。当我将单个命令写入终端时:
find -name 'zad*' -mtime -10 | tar -cvf archive.tar.gz -T -
效果很好。如何使用用户输入的变量来调用同一脚本中的命令?我的脚本正在制作一个空档案。
我的脚本:
echo "Enter a number of days"
read days
echo "Enter the name of file"
read nameoffile
echo "Enter the name of tar archive"
read nameofarchive
find -name '"$nameoffile"' -mtime -"$days" | tar -cvf "$nameofarchive".tar.gz -T -
答案1
尝试删除多余的'
引号'"$nameoffile"'
例子:
maulinglawns@debian-HP:~$ read nameoffile
myFile
maulinglawns@debian-HP:~$ echo '"$nameoffile"'
"$nameoffile"
maulinglawns@debian-HP:~$ echo "$nameoffile"
myFile
如果您需要单引号,请像这样转义它们:
echo \'$nameoffile\'
'myFile'
答案2
一般来说,需要用户交互是一个非常糟糕的主意。它使您的脚本无法自动化,并且使您的用户很难使用,因为他们需要在不允许制表符完成的环境中手动输入内容。
自从@maulinglawns已经解释过为什么你的脚本失败了,我将为你提供一种更简单的方法,不需要你的用户费力地输入信息:
#!/usr/bin/env sh
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
然后,要查找foo.txt
最近 3 天内修改的名为 的文件并将它们存档到 bar.tar.gz`,您可以运行:
script.sh 3 foo.txt bar
您还可以添加一些简单的错误检查,以确保脚本始终使用正确数量的参数运行:
#!/usr/bin/env sh
if [ $# -ne 3 ]; then
echo "You need to enter three arguments"
exit 1
fi
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
答案3
read 支持命名变量,例如;
#!/bin/bash
read -p "How many files? (0-100) " VAR_NUMBER_OF_FILES
read -p "How many days? (0-100) " VAR_NUMBER_OF_DAYS
read -p "Tar file name? " VAR_TAR_NAME
...
find -name '"$VAR_NUMBER_OF_FILES"' -mtime -"$VAR_NUMBER_OF_DAYS" | tar -cvf "$VAR_TAR_NAME".tar.gz -T -