几天前,我重新创建了一个杂乱无章的脚本,它要干净得多。现在我有以下问题:
我的脚本根据所有给定的参数创建变量字符串,因为部分参数需要转换为find参数。
例如,我的脚本创建了以下内容:
FINDVAR="/home /ex -type f -name \*.sh"当我尝试执行以下操作时:find $FINDVAR或find ${FINDVAR},甚至$(find $FINDVAR),我没有收到任何输出。
然而,当我echo $FINDVAR并粘贴输出后发现,它是完美的工作!
我也试着做
find "$FINDVAR"但这给了我
查找:`/home /ex -type f -name \*.sh':没有这样的文件或目录
因此,它将字符串识别为1参数。
有解决办法吗?我被困在上面好几个小时了
编辑:无法真正找到它,也许你们中的一个能看看吗?我漏掉了长长的荷兰回声的
#!/bin/bash
#FUNCTIONS
#Foutmelding
charfout(){
echo "Uw ingevoerde eerste letter met argument -l is ongeldig."
echo "Gebruik: $0 -e <extensie> -l <a>/<a-c>"
}
extfout() {
echo 1>&2;
echo 1>&2;
exit
}
#Help
help() {
echo
echo "--- Help ---"
echo
exit
}
#Opties in getopt instellen + argumenten in volgorde plaatsen (mappen achter case-opties)
OPTS=$(getopt -o e:hl:b:f:s: -l "help,nn,nr,fout" -n "ExamenScript" -- "$@");
eval set -- "$OPTS";
#Case doorlopen om opties aan respectievelijke variabelen toe te wijzen
while true; do
case "$1" in
-e)
shift;
if [ -n "$1" ]; then
BESTANDSEXTENSIE=$1;
shift;
fi
;;
-h|--help)
shift;
help;
;;
-l)
shift;
if [ -n "$1" ]; then
BEGINLETTER=$1;
shift;
fi
;;
-b)
shift;
if [ -n "$1" ]; then
BLOCKDEVICE=$1;
shift;
fi
;;
--nn)
shift;
NONUMBERS=true;
;;
--nr)
shift;
NORECURSION=true;
;;
-f|--fout)
shift;
if [ -n "$1" ]; then
FOUTLOG=true;
shift;
fi
;;
-s)
shift;
if [ -n "$1" ]; then
ZOEKEN=$1;
shift;
fi
;;
--)
shift;
break;
;;
esac
done
#De overige argumenten, ergo de te-doorzoeken-folders, in een array plaatsen
TEDOORZOEKENFOLDERS=("$@")
#De array van folders als eerste argumenten van de find functie opgeven
#FINDARGUMENTEN=$(printf "%s " "${TEDOORZOEKENFOLDERS[@]}")
#Nagaan of er een block device gemount dient te worden
if [[ $BLOCKDEVICE ]]; then
echo "Gelieve admin rechten te geven om het block-device te kunnen mounten."
sudo mount /dev/$BLOCKDEVICE /mnt
TEDOORZOEKENFOLDERS+=(" /mnt") #Pad van gemounte drive aan array toevoegen
fi
#Beargumenteren dat er naar bestanden moet gezocht worden (type -f)
FINDARGUMENTEN="-type f"
#Indien de no-recursion vlag gebruikt is, enkel level 1 mappen toestaan
if [[ $NORECURSION ]]; then
FINDARGUMENTEN=$FINDARGUMENTEN" -maxdepth 1"
fi
#De extensie implementeren door een naamfilter aan find toe te voegen
#Indien geen extensie opgegeven, foutmelding
if [[ $BESTANDSEXTENSIE ]]; then
FINDARGUMENTEN=$FINDARGUMENTEN" -name \*.${BESTANDSEXTENSIE}"
else
extfout
fi
#Nagaan hoeveel karakters er aan het -l argument toegewezen zijn
case ${#BEGINLETTER} in
0) #Niets toegewezen
;;
1) FINDARGUMENTEN=$FINDARGUMENTEN" -name ${BEGINLETTER}*" #Beginnen met een letter
;;
3) FINDARGUMENTEN=$FINDARGUMENTEN" -name [${BEGINLETTER}]*" #Beginnenn met een letter-range
;;
*) charfout
;;
esac
#Indien de no-numbers vlag gebruikt is, nummers verbieden in de bestandsnaam
if [[ $NONUMBERS ]]; then
FINDARGUMENTEN=$FINDARGUMENTEN" \! -name '*[0-9]*'"
fi
find "${TEDOORZOEKENFOLDERS[@]} $FINDARGUMENTEN"发布于 2014-06-10 20:03:26
尝试使用数组:
FINDVAR=( /home /ex -type f -name \*.sh )
find "${FINDVAR[@]}"这应该用适当的转义/引用正确地处理所有参数。
你需要这样的东西
FINDARGUMENTEN=( -type f )
if [[ $NORECURSION ]]; then
FINDARGUMENTEN+=( -maxdepth 1 )
fi
if [[ $BESTANDSEXTENSIE ]]; then
FINDARGUMENTEN+=( -name "\\*.${BESTANDSEXTENSIE}" )
fi
case ${#BEGINLETTER} in
1) FINDARGUMENTEN+=( -name "${BEGINLETTER}\\* ) ;;
3) FINDARGUMENTEN+=( -name "[${BEGINLETTER}]\\*" ) ;;
esac
if [[ $NONUMBERS ]]; then
FINDARGUMENTEN+=( '\!' -name '*[0-9]*' )
fi
find "${TEDOORZOEKENFOLDERS[@]}" "${FINDARGUMENTEN[@]}"我不确定双反斜杠.你得试试。您可能需要1或2或3反斜杠。
在进行测试时,执行set -x,这样就可以看到bash在做什么。
发布于 2014-06-11 01:17:35
作为一项工作,您可以使用set -f禁用路径名展开。
set -f
FINDVAR="/home /ex -type f -name *.sh"
find $FINDVAR这是因为bash从不尝试用文件名替换*.sh,而只是保持原样。
发布于 2014-06-11 03:08:41
您还可以使用:
FINDVAR="/home /ex -type f -name *.sh"
eval "find $FINDVAR"https://stackoverflow.com/questions/24149837
复制相似问题