Сделайте массив из команд для сценария

У меня есть несколько каталогов, которые я должен обновить, и шаги являются тем же, кроме, очевидно, который каждый каталог имеет различные имена.

Я плохо знаком с созданием сценариев. Я могу сделать массив с, например. $array=('cd dir1', 'cd dir2'); и сделайте a for цикл, который проходит каждый каталог?

пример (** я собираюсь использовать php синтаксис **):

$arr=array('cd dir1','cd dir2', 'cd dir3', 'cd dir4', 'cd dir5')
for($i=0; $<=5; $i++){
    $arr[$i]
    #MAKE STUFF
    #MAKE MORE STUFF
    cd ..
}
1
задан 20 April 2018 в 16:04

3 ответа

Я предлагаю не хранить команды в массиве, а только параметры (спасибо @steeldriver за синтаксис массива в bash):

#!/usr/bin/env bash

dirs=('dir1' 'dir2' 'dir3' 'dir4' 'dir5')
for dir in "${dirs[@]}"; do
    cd "$dir"
    echo "***MAKE STUFF***"
    echo "***MAKE MORE STUFF***"
    cd -
done

Примечание: cd - (минус) возвращается обратно в предыдущий каталог (вместо родительского каталога), поэтому он безопаснее, чем cd ...

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

#!/usr/bin/env bash

cmds=('cd dir1' 'cd dir2' 'cd dir3' 'cd dir4' 'cd dir5')
for cmd in "${cmds[@]}"; do
    $cmd
    echo "***MAKE STUFF***"
    echo "***MAKE MORE STUFF***"
    cd -
done

Обратите внимание, что теперь существует асимметрия в сценарий: последний cd - предполагает, что $cmd на самом деле является командой cd. Я бы не рекомендовал это. Либо поместите обе команды в массив, либо ни одну из них.

2
ответ дан 20 April 2018 в 16:04

Я думаю, тебе нужно сделать это так:

#!/usr/bin/env bash
# declare an array called array and define values
array=('dir1' 'dir2' 'dir3' 'dir4' 'dir5')
for i in "${array[@]}"
do
    cd "$i" || exit
    #MAKE STUFF
    #MAKE MORE STUFF
    cd ..
done 
1
ответ дан 20 April 2018 в 16:04

Подобный вопрос уже задавали (и отвечали) о массивах в Bash: ( https://stackoverflow.com/questions/8880603/loop-through-an-array-of-strings-in-bash ).

Чтобы создать массив строк в Bash, вам нужно объявить ключевое слово , используя параметр -a (-a для массива):

# Array: list of strings (directories)
declare -a directories=("/bin" "/etc" "/usr")

# For each element in the array
for element in "${directories[@]}"
do
        cd $element
        ## DO STUFF
done
0
ответ дан 20 April 2018 в 16:04
  • 1
    Этот метод также работает в Windows 10 к вашему сведению –  11 July 2016 в 21:15
  • 2
    Этот метод также работает в Windows 10 к вашему сведению –  11 July 2016 в 21:15

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

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