Bash - Error: Syntax error: operand expected (error token is "testdir/.hidd1/")
Bash - Error: Syntax error: operand expected (error token is "testdir/.hidd1/")
我正在为 uni work 做一个任务,目的是计算给定目录中的所有文件和目录,然后是所有子目录。我们被禁止使用 find、locate、du 或任何递归命令(例如 ls -R)。
为了解决这个问题,我尝试制作自己的递归命令并将 运行 放入上面的错误中,更具体地说是 line 37: testdir/.hidd1/: syntax error: operand expected (error token is ".hidd1/")
The Hierarchy I'm using
代码如下:
tgtdir=
visfiles=0
hidfiles=0
visdir=0
hiddir=0
function searchDirectory {
curdir=
echo "curdir = $curdir"
# Rather than change directory ensure that each recursive call uses the $curdir/NameOfWantedDirectory
noDir=$(ls -l -A $curdir| grep ^d | wc -l) # Work out the number of directories in the current directory
echo "noDir = $noDir"
shopt -s nullglob # Enable nullglob to prevent a null term being added to the array
directories=(*/ .*/) # Store all directories and hidden directories into the array 'directories'
shopt -u nullglob #Turn off nullglob to ensure it doesn't later interfere
echo "${directories[@]}" # Print out the array directories
y=0 # Declares a variable to act as a index value
for i in $( ls -d ${curdir}*/ ${curdir}.*/ ); do # loops through all directories both visible and hidden
if [[ "${i:(-3)}" = "../" ]]; then
echo "Found ./"
continue;
elif [[ "${i:(-2)}" = "./" ]]; then
echo "Found ../"
continue;
else # When position i is ./ or ../ the loop advances otherwise the value is added to directories and y is incremented before the loop advances
echo "Adding $i to directories"
directories[y]="$i"
let "y++"
fi
done # Adds all directories except ./ and ../ to the array directories
echo "${directories[@]}"
if [[ "${noDir}" -gt "0" ]]; then
for i in ${directories[@]}; do
echo "at position i ${directories[$i]}"
searchDirectory ${directories[$i]} #### <--- line 37 - the error line
done # Loops through subdirectories to reach the bottom of the hierarchy using recursion
fi
visfiles=$(ls -l $tgtdir | grep -v ^total | grep -v ^d | wc -l)
# Calls the ls -l command which puts each file on a new line, then removes the line which states the total and any lines starting with a 'd' which would be a directory with grep -v,
#finally counts all lines using wc -l
hiddenfiles=$(expr $(ls -l -a $tgtdir | grep -v ^total | grep -v ^d | wc -l) - $visfiles)
# Finds the total number of files including hidden and puts them on a line each (using -l and -a (all)) removes the line stating the total as well as any directoriesand then counts them.
#Then stores the number of hidden files by expressing the complete number of files minus the visible files.
visdir=$(ls -l $tgtdir | grep ^d | wc -l)
# Counts visible directories by using ls -l then filtering it with grep to find all lines starting with a d indicating a directory. Then counts the lines with wc -l.
hiddir=$(expr $(ls -l -a $tgtdir | grep ^d | wc -l) - $visdir)
# Finds hidden directories by expressing total number of directories including hidden - total number of visible directories
#At minimum this will be 2 as it includes the directories . and ..
total=$(expr $visfiles + $hiddenfiles + $visdir + $hiddir) # Calculates total number of files and directories including hidden.
}
searchDirectory $tgtdir
echo "Total Files: $visfiles (+$hiddenfiles hidden)"
echo "Directories Found: $visdir (+$hiddir hidden)"
echo "Total files and directories: $total"
exit 0
感谢您的帮助
第 37 行是 searchDirectory ${directories[$i]}
,我数了一下。是吗?
- 将 for 循环替换为
for i in "${directories[@]}"; do
- 添加双引号。这会将每个元素保留为自己的单词。
- 将第 37 行替换为
searchDirectory "$i"
。 for
循环为您提供 i
中数组的每个 元素 ,而不是每个 索引 。因此,您不需要再次进入 directories
- i
已经有您需要的词。
此外,我注意到第 22 行和第 25 行的 echo
s 被交换了 :) .
我正在为 uni work 做一个任务,目的是计算给定目录中的所有文件和目录,然后是所有子目录。我们被禁止使用 find、locate、du 或任何递归命令(例如 ls -R)。
为了解决这个问题,我尝试制作自己的递归命令并将 运行 放入上面的错误中,更具体地说是 line 37: testdir/.hidd1/: syntax error: operand expected (error token is ".hidd1/")
The Hierarchy I'm using
代码如下:
tgtdir=
visfiles=0
hidfiles=0
visdir=0
hiddir=0
function searchDirectory {
curdir=
echo "curdir = $curdir"
# Rather than change directory ensure that each recursive call uses the $curdir/NameOfWantedDirectory
noDir=$(ls -l -A $curdir| grep ^d | wc -l) # Work out the number of directories in the current directory
echo "noDir = $noDir"
shopt -s nullglob # Enable nullglob to prevent a null term being added to the array
directories=(*/ .*/) # Store all directories and hidden directories into the array 'directories'
shopt -u nullglob #Turn off nullglob to ensure it doesn't later interfere
echo "${directories[@]}" # Print out the array directories
y=0 # Declares a variable to act as a index value
for i in $( ls -d ${curdir}*/ ${curdir}.*/ ); do # loops through all directories both visible and hidden
if [[ "${i:(-3)}" = "../" ]]; then
echo "Found ./"
continue;
elif [[ "${i:(-2)}" = "./" ]]; then
echo "Found ../"
continue;
else # When position i is ./ or ../ the loop advances otherwise the value is added to directories and y is incremented before the loop advances
echo "Adding $i to directories"
directories[y]="$i"
let "y++"
fi
done # Adds all directories except ./ and ../ to the array directories
echo "${directories[@]}"
if [[ "${noDir}" -gt "0" ]]; then
for i in ${directories[@]}; do
echo "at position i ${directories[$i]}"
searchDirectory ${directories[$i]} #### <--- line 37 - the error line
done # Loops through subdirectories to reach the bottom of the hierarchy using recursion
fi
visfiles=$(ls -l $tgtdir | grep -v ^total | grep -v ^d | wc -l)
# Calls the ls -l command which puts each file on a new line, then removes the line which states the total and any lines starting with a 'd' which would be a directory with grep -v,
#finally counts all lines using wc -l
hiddenfiles=$(expr $(ls -l -a $tgtdir | grep -v ^total | grep -v ^d | wc -l) - $visfiles)
# Finds the total number of files including hidden and puts them on a line each (using -l and -a (all)) removes the line stating the total as well as any directoriesand then counts them.
#Then stores the number of hidden files by expressing the complete number of files minus the visible files.
visdir=$(ls -l $tgtdir | grep ^d | wc -l)
# Counts visible directories by using ls -l then filtering it with grep to find all lines starting with a d indicating a directory. Then counts the lines with wc -l.
hiddir=$(expr $(ls -l -a $tgtdir | grep ^d | wc -l) - $visdir)
# Finds hidden directories by expressing total number of directories including hidden - total number of visible directories
#At minimum this will be 2 as it includes the directories . and ..
total=$(expr $visfiles + $hiddenfiles + $visdir + $hiddir) # Calculates total number of files and directories including hidden.
}
searchDirectory $tgtdir
echo "Total Files: $visfiles (+$hiddenfiles hidden)"
echo "Directories Found: $visdir (+$hiddir hidden)"
echo "Total files and directories: $total"
exit 0
感谢您的帮助
第 37 行是 searchDirectory ${directories[$i]}
,我数了一下。是吗?
- 将 for 循环替换为
for i in "${directories[@]}"; do
- 添加双引号。这会将每个元素保留为自己的单词。 - 将第 37 行替换为
searchDirectory "$i"
。for
循环为您提供i
中数组的每个 元素 ,而不是每个 索引 。因此,您不需要再次进入directories
-i
已经有您需要的词。
此外,我注意到第 22 行和第 25 行的 echo
s 被交换了 :) .