查找后的字符串被识别为一个参数

时间:2014-06-10 19:59:26

标签: bash shell find

我已经重新创建了几天前发布的杂乱的脚本,而且它更清洁了。现在我有以下问题:

我的脚本根据所有给定的参数创建一个变量字符串,因为部分参数需要转换为查找参数。

例如,我的脚本会创建以下内容:

FINDVAR="/home /ex -type f -name \*.sh"

当我尝试执行以下操作时: find $FINDVARfind ${FINDVAR}甚至$(find $FINDVAR) 我没有收到任何输出。

然而当我echo $FINDVAR时 找到后粘贴输出,效果很好!

我也试过

find "$FINDVAR"

但那给了我

  

find:`/ 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"

3 个答案:

答案 0 :(得分:3)

尝试使用数组:

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正在做什么。

答案 1 :(得分:1)

作为解决方法,您可以使用set -f禁用路径名扩展:

set -f

FINDVAR="/home /ex -type f -name *.sh"
find $FINDVAR

这是有效的,因为bash从不尝试用文件名替换*.sh,只是保持原样。

答案 2 :(得分:0)

您也可以使用:

FINDVAR="/home /ex -type f -name *.sh"
eval "find $FINDVAR"