шаблоны процессов в сценариях bash

Explorer ключевой штрих можно найти на некоторых ноутбуках, если вы хотите открыть домашнюю папку с помощью nautilus, этот ярлык вам не поможет, потому что он откроется с помощью диспетчера файлов thunder, так что нажмите пользовательский ярлык и нажмите +, затем в поле ввода имя, которое вы хотите, и в команде напишите это nautilus /home/<your username> или любой каталог вместо

, затем выберите ярлык для него, щелкнув Disable, затем погладьте ключ, который вы хотите использовать для быстрого доступа с клавиатуры

будет работать

4
задан 17 May 2017 в 08:00

4 ответа

*.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|

Внутри bash скрипт, вы можете использовать "$@", чтобы получить все переданные ему аргументы, или использовать $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
ответ дан 18 July 2018 в 13:10

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

#!/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
ответ дан 18 July 2018 в 13:10

*.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|

Внутри bash скрипт, вы можете использовать "$@", чтобы получить все переданные ему аргументы, или использовать $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
ответ дан 24 July 2018 в 20:07
  • 1
    чтобы быть следующим: он не увидит шаблон, если есть хотя бы один файл, соответствующий этому шаблону? Но если в текущем каталоге человека, набравшего script *.pdf, нет файлов * .pdf, сценарий действительно получит *.pdf, так как оболочка не сможет заменить его никакими именами файлов. И можно пройти *.pdf, помещая его внутри кавычек ("*.pdf" или '*.pdf') или избегая * (\*.pdf) – Olivier Dulac 17 May 2017 в 17:15

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

#!/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
ответ дан 24 July 2018 в 20:07

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

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