Я делаю простой сценарий Shell из скучной, постоянно повторяющейся работы. Скрипт корректно меняет каталог, и теперь я хочу запускать другие скрипты на основе аргумента, который я набрал при запуске скрипта. Другие скрипты разбросаны по подкаталогам и каждый из них уникален. Поэтому я хочу вставить только имя файла и позволить сценарию выяснить, в каком подкаталоге находится этот файл.

Я попробовал что-то вроде этого:

filename="default.ini"
while [ $# -gt 0 ] 
do
    case "$1" in
        -f) filename="$(find ./ -name $2)"; shift;;
        -*) echo >&2 \
            "usage: $0 [-v] [-f file] [file ...]"
            exit 1;; 
        *)  break;;     # terminate while loop
    esac
    shift
done

echo $filename

Но find не возвращает никакого результата, поэтому он остается default.ini . Есть ли другой способ решить эту проблему?

1 ответ1

1

Я бы предположил, что это более идиоматический способ анализа параметров:

filename="default.ini"
v_opt=false

while getopts :vf: opt; do
    case $opt in 
        f) find_out=$(find . -name "$OPTARG") 
           # do something with $find_out, such as checking if it's empty, or
           # if more than one file was found ...
           [[ $find_out ]] && filename=$(head -n 1 <<< "$find_out")
           ;;
        v) v_opt=true ;;
        ?) echo "usage: ..."; exit 1;;
    esac
done
shift $((OPTIND-1))

echo $filename

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .