Флаги Bash на основе операторов if

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

find u/ -type f -print0 | xargs -r -0 rm -f

это приведет к удалению только файлов; чтобы удалить все, используйте

find u/ -print0 | xargs -r -0 rm -rf

вы, вероятно, можете использовать опцию --deleteдля find, если она есть в вашей системе:

find u/ -type f --delete

или фанковый метод сrsync:

mkdir emptyfolder
rsync -r --delete emptyfolder/ u/

rsyncнамного быстрее, чем rmпри удалении вещей, поскольку он обходит некоторые проверки.

1
25.05.2020, 22:18
2 ответа

Вы можете построить команду в виде массива:

#!/bin/bash
var=ON
cmd=( /home/username/myscript )   # create array with one element
if [ "$var" == "ON" ]; then
    cmd+=( -a )                   # append to the array
fi
cmd+=( -b 76 )                    # append two elements

Затем запустите его с помощью:

"${cmd[@]}"

Обратите внимание на кавычки вокруг последней части и круглые скобки вокруг назначений выше. Синтаксис уродлив, но он работает с аргументами, содержащими пробелы и тому подобное. (Используйте кавычки для добавления аргументов с пробелами, например.cmd+=("foo bar"))

Связанные, с менее уродливыми методами и способами, которыми они могут потерпеть неудачу:


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

var=x
myscript ${var:+"-a"} -b 76

Здесь ${var:+foo}вставляет foo, если varне пусто (, поэтому var=ON, var=FALSE, var=xвсе вставят его ), и ничего, если оно пусто или не установлено(var=или unset var). Будьте осторожны с обычными вопросами цитирования.

9
18.03.2021, 23:32

Если я правильно вас понял:

var=ON
if [ "$var" = "ON" ]; then
    /home/username/myscript -a -b 76
else
    /home/username/myscript -b 76
fi
1
18.03.2021, 23:32

Теги

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