«плохая замена» в сценариях оболочки Linux

#shell #scripting

Вопрос:

 # !/bin/sh
echo "Enter file name:"
read fname
set ${ls -la $fname}
echo "The size of test.sh is $5 byte"
exit 0
 

Я хочу создать код, который может печатать размер файла с помощью команды «установить» в скрипте оболочки Linux, поэтому я использую ls-la, но он не работает, и мой терминал просто говорит «плохая замена» в строке 4 . Любая помощь, пожалуйста 🙂

Комментарии:

1. Я думаю , ты хотел использовать $() , а не ${} . Не уверен , что вы хотите сделать с выводом ls и set , хотя. Возможно , вы имели в виду set -- $(ls -la "$fname") , но это кажется хрупким .

Ответ №1:

Я бы предложил попробовать следующее:

 # !/bin/sh
echo "Enter file name:"
read fname
SIZE=$(ls -l "${fname}" |awk '{print $5}')
echo "The size of ${fname} is ${SIZE} bytes"
exit 0
 

SIZE переменная будет содержать размер прочитанного имени файла. Пожалуйста, обратите внимание, что ls -al так же, как ls -l и раньше, но он также показывает скрытые файлы (те, которые начинаются с».»).

Использование set для определения переменных на самом деле не является лучшей практикой. Вот предложение об использовании набора.

Комментарии:

1. Я думал, что это не нужно, если у вас есть скобки, но я рад уточнить их на основе хороших отзывов. Спасибо!

2. Скобки не препятствуют расширению (они хороши по другим причинам, но в данном случае не имеют значения). Попробуйте a='*' ; echo ${a} vs a='*' ; echo "${a}" .

Ответ №2:

Следуя и исправляя кастеля, я бы скорее сказал:

 # !/bin/sh
read -p "Enter file name: " fname
SIZE=$(ls -l "$fname" | awk '{print $5}')
echo "The size of $fname is $SIZE bytes"
 

Комментарии:

1. @Биффен: ой, извини. Также добавлены кавычки вокруг второго появления fname .