подстановочные знаки процесса в сценариях удара

Мне просто нужен простой пример сценария удара для обрабатывания единственного файла или нескольких файлов, если подстановочный знак передается как аргументы

если я работаю

myscript file1

сделайте что-то с файлом, и если я выхожу

myscript *.pdf

сделайте что-то с критериями соответствия файла

Кто-либо может дать простой пример?

4
задан 16 May 2017 в 22:00

2 ответа

Эти *.pdf будет расширен оболочкой прежде, чем выполнить сценарий, таким образом, сценарий не будет видеть *.pdf, это будет видеть имена файлов соответствия непосредственно:

$ cat foo.sh
#! /bin/sh

printf "|%s|\n" "$@"
$ touch {1..10}.pdf
$ ./foo.sh 1.pdf
|1.pdf|
$ ./foo.sh *.pdf
|1.pdf|
|10.pdf|
|2.pdf|
|3.pdf|
|4.pdf|
|5.pdf|
|6.pdf|
|7.pdf|
|8.pdf|
|9.pdf|

В рамках сценария удара, можно использовать "$@" для получения, все аргументы передали ему, или используйте $1, $2, и т.д. для доступа к первому, второму, и т.д. аргумент непосредственно.

можно просто циклично выполниться по всем спорам с плоскостью for:

for i     # Or, for i in "$@"
do
    echo "Processing argument $i"
done

произведет:

Processing argument 1.pdf
Processing argument 10.pdf
Processing argument 2.pdf
Processing argument 3.pdf
Processing argument 4.pdf
Processing argument 5.pdf
Processing argument 6.pdf
Processing argument 7.pdf
Processing argument 8.pdf
Processing argument 9.pdf
9
ответ дан 23 November 2019 в 11:41

Вот тот, читающий в Вашем файле (файлах) как массив, разрешающий Вам работать с ним как Вам нравится:

#!/bin/bash

filearray=( "$@" )

if [ ${#filearray[@]} -gt "1" ] || [ ${#filearray[@]} == "0" ]; then
    isare=are
    ent=entries
else
    isare=is
    ent=entry
fi

echo "There $isare ${#filearray[@]} $ent."
echo ""
if [ ${#filearray[@]} == "0" ]; then
    echo "Nothing entered."
    exit
else
    echo "This is what you entered or what was found: "
    echo ""
    printf '%s\n' "${filearray[@]}"
fi

Используя "" для массива делает его так, чтобы это считало файлы, даже если они будут иметь пробелы и не разделят их, когда они печатают. Я также добавил изменения формулировки на основе количества найденных файлов. Никакая запись не покажет 0. ${#filearray[@]} количества число элементов, где ${filearray[@]} покажет все элементы.

Примеры:

Одна запись:

$ ./myscript myfile.txt
There is 1 entry.

This is what you entered or what was found: 

myfile.txt

Многократные въезды:

$ ./myscript *.sh
There are 5 entries.

This is what you entered or what was found: 

blue-ray_encode.sh
lightsOn.sh
removeoffender.sh
test1.sh
test.sh

Никакие записи:

$ ./myscript 
There are 0 entries.

Nothing entered.
3
ответ дан 23 November 2019 в 11:41

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

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