I want to write в shell рукописный шрифт that counts number of поля, directories, and temporary поля in в directory. The рукописный шрифт below throws an ошибка.
#!/bin/bash
cd '/home/Ubuntulover/Shell'
file=0
dir=0
temp=0
for d in *;
do
for f in *;
do
if [ -d "$d" ]; then
dir=$((dir+1))
elif [ -f "$f" ]; then
file=$((file+1))
else
temp=$((temp+1))
fi
done
echo "Files $file"
echo "Directories $dir"
echo "Temporaryfiles $temp"
У Вас есть слишком многие for
операторы: В настоящий момент существует переменная цикла d рассчитывающий через все объекты в каталоге и вторую переменную цикла f выполнение этого снова для каждого существующего файла - поэтому, если у Вас будет 4 файла тогда, то Вы доберетесь 4*4=16 повторения (или был бы, если эти done
были корректны).
Вы могли использовать оператор как ls -l | wc -l
, чтобы сделать быструю проверку, что приблизительное значение в порядке.
я считаю, что это больше, что Вы хотите:
#!/bin/bash
cd '/home/Ubuntulover/Shell'
file=0
dir=0
temp=0
for d in *;
do
if [ -d "$d" ]; then
dir=$((dir+1))
elif [ -f "$d" ]; then
file=$((file+1))
else
temp=$((temp+1))
fi
done
echo "Files $file"
echo "Directories $dir"
echo "Temporaryfiles $temp"
У Вас есть синтаксическая ошибка как done
, ключевое слово пропускает в верхнем большинство for
цикл:
#!/bin/bash
cd '/home/479153/Temp' || exit
file=0
dir=0
temp=0
for d in *;
do
for f in *; # this loop actually not needed
do
if [ -d "$d" ]; then
dir=$((dir+1))
elif [ -f "$f" ]; then # can be replace as $d
file=$((file+1))
else
temp=$((temp+1))
fi
done
done
echo "Files $file"
echo "Directories $dir"
echo "Temporaryfiles $temp"
можно всегда использовать http://www.shellcheck.net/ сайт для проверки синтаксической ошибки в код удара.