Почему этот скрипт bash не работает?

Когда я запускаю следующую команду

./command *

, используя этот скрипт

#!/bin/bash

for f in ./$1
do
    echo $f
done

, отражается только первый файл, указанный в $ 1. Мой вопрос: почему?

1
задан 11 November 2013 в 17:42

2 ответа

Когда вы запускаете команду, оболочка расширяет *. Таким образом, запуск сценария эквивалентен

./command file1.txt file2.txt file3.txt

$1 соответствует первому аргументу, поэтому цикл имеет только одну итерацию.

2
ответ дан 24 May 2018 в 15:24

$1 относится только к первому аргументу. Вы должны использовать $*.

#!/bin/bash

for f in $*
do
     echo $f
done
0
ответ дан 24 May 2018 в 15:24
  • 1
    Нет, никогда не используйте $*, если вы не знаете точно , что это значит. Вместо этого используйте "$@" (с кавычками). – gniourf_gniourf 11 November 2013 в 18:04
  • 2
    @gniourf_gniourf: Ваш комментарий не является полезным, потому что он не содержит существенной информации. – Clausi 11 November 2013 в 18:13
  • 3
    Мои комментарии никогда не будут полезны. О, если вы не желаете узнать разницу между $* и $@, в этом случае вы можете посмотреть ссылки в Интернете. Это бесплатно, мне сказали. Например, эта ссылка о специальных параметрах Bash . – gniourf_gniourf 11 November 2013 в 18:18
  • 4
    @gniourf_gniourf: Извините, я уже прочитал это, но все еще не понимаю проблему. Я готов учиться, но если вы не хотите объяснять, возможно, вы не в нужном месте. – Clausi 11 November 2013 в 18:35
  • 5
    $* нарушается, если вы указываете параметры, содержащие пробелы. "$*" расширяется до одного слова, так что это не хорошо. Единственная возможность - "$@" (цитируется), которая будет работать независимо от того, насколько смешны символы в аргументах. – gniourf_gniourf 11 November 2013 в 18:40

Другие вопросы по тегам:

Похожие вопросы: