Цикл не работает в функции с аргументами

Цикл не работает в функции с аргументами

Итак, я создаю функцию, которая выполняет цикл for по всем файлам в каталоге в качестве заданного аргумента и выводит все файлы и каталоги:

#!/bin/bash

List () {
    for item in $1
            do
            echo "$item"
            done
}

List ~/*

Однако при запуске скрипта он выводит только первый файл в каталоге.

Есть идеи?

решение1

Если вы пытаетесь перебрать файлы в каталоге, вам нужно выполнить глобальную подстановку каталога следующим образом:

#!/bin/bash

List () {
    for item in "${1}/"*
            do
            echo "$item"
    done
}

Тогда назовите это так:

$ list ~

В качестве альтернативы, если вы хотите передать несколько файлов в качестве аргументов, вы можете написать свой forцикл следующим образом:

List () {
    for item
            do
            echo "$item"
    done
}

Который тогда можно назвать как:

$ list ~/*

Что не так с вашей текущей функцией:

Когда вы вызываете его с glob, он передает каждый файл в каталоге как отдельный аргумент. Допустим, ваш домашний каталог содержит file1, file2, и file3. Когда вы вызываете list ~/*, вы по сути вызываете:

list ~/file1 ~/file2 ~/file3

Тогда в ваш forцикл передается только позиционный параметр 1, for item in ~/file1а остальные позиционные параметры не используются.

Также спасибо Ilkkachu за то, что указал на то, что вы забыли про a /в своем хэшбэнге, что я совершенно упустил.

Связанный контент