首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找后的字符串可识别为一个参数。

查找后的字符串可识别为一个参数。
EN

Stack Overflow用户
提问于 2014-06-10 19:59:25
回答 3查看 81关注 0票数 2

几天前,我重新创建了一个杂乱无章的脚本,它要干净得多。现在我有以下问题:

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

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

代码语言:javascript
复制
FINDVAR="/home /ex -type f -name \*.sh"

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

然而,当我echo $FINDVAR并粘贴输出后发现,它是完美的工作!

我也试着做

代码语言:javascript
复制
find "$FINDVAR"

但这给了我

查找:`/home /ex -type f -name \*.sh':没有这样的文件或目录

因此,它将字符串识别为1参数。

有解决办法吗?我被困在上面好几个小时了

编辑:无法真正找到它,也许你们中的一个能看看吗?我漏掉了长长的荷兰回声的

代码语言:javascript
复制
#!/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"
EN

回答 3

Stack Overflow用户

发布于 2014-06-10 20:03:26

尝试使用数组:

代码语言:javascript
复制
FINDVAR=( /home /ex -type f -name \*.sh )
find "${FINDVAR[@]}"

这应该用适当的转义/引用正确地处理所有参数。

你需要这样的东西

代码语言:javascript
复制
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在做什么。

票数 3
EN

Stack Overflow用户

发布于 2014-06-11 01:17:35

作为一项工作,您可以使用set -f禁用路径名展开。

代码语言:javascript
复制
set -f

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-06-11 03:08:41

您还可以使用:

代码语言:javascript
复制
FINDVAR="/home /ex -type f -name *.sh"
eval "find $FINDVAR"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24149837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档