gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:47:50 24 4
gpt4 key购买 nike

我重新创建了几天前发布的一个杂乱的脚本,它更加清晰。现在我有以下问题:

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

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

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

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

但是当我 echo $FINDVAR并在找到后粘贴输出,效果很好!

我也试过

find "$FINDVAR"

但这给了我

find: `/home /ex -type f -name \*.sh': No such file or directory

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

有什么解决办法吗?我已经坚持了几个小时了

编辑:真的找不到,也许你们中的一个可以看一下?我省略了长荷兰语 echo

#!/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"

最佳答案

尝试使用数组:

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

关于bash - 查找后的字符串被识别为一个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24149837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com