我已经重新创建了几天前发布的杂乱的脚本,而且它更清洁了。现在我有以下问题:
我的脚本根据所有给定的参数创建一个变量字符串,因为部分参数需要转换为查找参数。
例如,我的脚本会创建以下内容:
FINDVAR="/home /ex -type f -name \*.sh"
当我尝试执行以下操作时:
find $FINDVAR
或find ${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"
答案 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"