Почему «$ Namefile» дает мне такой результат?

В моем коде есть такая часть;

Namefile=$1 for n in $Namefile* do echo $n done 

и только для результата этой части;

 $ sh example.sh hw1 hw1_evening_sun.txt hw1_morning_sun.txt hw1_out_si_wire.txt hw1_script.sh hw1_script2.sh hw1_script3.sh hw1_sun1.txt hw1_sun2.txt 

которые являются файлами с именем, начинающимся с «hw1», но я не понимаю, почему $ Namefile * принимает эти имена . Насколько я знаю * вызывает аргумент, который получает скрипт.

Почему этот метод работает так? Может ли кто-нибудь объяснить логику этого?

4 Solutions collect form web for “Почему «$ Namefile» дает мне такой результат?”

Я не понимаю, почему $ Namefile * принимает эти имена. Насколько я знаю * вызывает аргумент, который получает скрипт.

$ Имя файла расширяется до значения, которое вы передали (возможно, «hw»). Это означает, что $ Namefile * после расширения переменной становится «hw *».

Когда эта строка используется в месте, где она интерпретируется как имя файла, * является специальной. См. «Расширение пути» на странице руководства.

… bash сканирует каждое слово для символов *,? и [. Если появляется один из этих символов, это слово рассматривается как шаблон и заменяется алфавитно отсортированным списком имен файлов, соответствующих шаблону.

Здесь вы делаете замену в цикле. Таким образом, звезда будет соответствовать каждому символу после строки $Namefile (что, я думаю, это «hw1»). Если вы хотите сопоставить все аргументы, предоставленные скрипту, используйте внутреннюю переменную $* . В вашем скрипте вы сохраняете $1 (позиционный параметр номер 1), который является wh1 для переменной Namefile. Поэтому использование * после $Namefile имеет другое значение, чем $* . Для получения дополнительной информации см. Здесь Внутренние переменные (раздел «Позиционные параметры»)

Это просто из- -l вариант ls . В этом случае, поскольку $Namefile* будет расширяться до hw1_evening_sun.txt ..snip.. hw1_sun2.txt :

 ls -l $Namefile* 

эффективно равна

 ls -l hw1_evening_sun.txt ..snip.. hw1_sun2.txt 

Для получения дополнительной информации вы можете запустить man ls . Здесь я цитирую:

 ... -l use a long listing format ... 

Добро пожаловать в * nix.

Это потому, что ваш цикл do так. Для вывода, как ожидается, для -l вам нужно будет выполнить свою часть скрипта внутри обратных тактов, как показано ниже.


tmp.sh

 Namefile=$1 for n in $Namefile* do echo $n done 

Запустите эту конкретную часть,

 ls -l `./tmp.sh "d"` -bash-3.2$ ls -l `./again d` -rw-r--r-- 1 me me 0 Jun 3 05:16 dat -rw-r--r-- 1 me me 0 Jun 3 05:16 dis 
  • установить язык bash и поставить переменные
  • chown не работает через скрипт
  • Извлечь файлы с определенным расширением файла и сохранить структуру каталогов?
  • Файлы размером более 1 ГБ и старше 6 месяцев
  • что такое различие между «$ var» и «$ {var}»
  • bash для выполнения чего-то, когда ключевое слово, увиденное на stdin
  • как определить, завершилось ли выполнение команды в оболочке?
  • Как учесть env vars shell-session, контексты с chroot
  • Получите только размер смонтированной файловой системы
  • Есть ли способ встроить открытый ключ GPG в сценарий, не добавляя его в брелок?
  • Нужен сценарий оболочки для преобразования CSV в формат Apache httpd
  • Linux и Unix - лучшая ОС в мире.