Сделать массив команд для скрипта

Для меня эта проблема вызвана неправильным владением некоторыми папками и файлами в /usr.

root@mybox-01:~# ls /usr -la
total 152
drwxrwxr-x  11  501   501  4096 Nov 27 15:03 .
drwxr-xr-x  26 root root   4096 Dec 25 15:00 ..
drwxrwxr-x   2  501   501 57344 Dec 28 09:27 bin
drwxr-xr-x   2 root root   4096 Dec 25 19:45 games
drwxr-xr-x  35 root root   4096 Dec 25 19:45 include
drwxrwxr-x 167  501   501 36864 Dec 28 09:27 lib
drwxrwxr-x   3  501   501  4096 Nov 27 15:03 lib64
drwxrwsr-x  10 root staff  4096 Dec 24 18:34 local
drwxr-xr-x   2 root root  12288 Dec 28 09:27 sbin
drwxrwxr-x 278  501   501 12288 Dec 28 09:27 share
drwxr-xr-x   5 root root   4096 Dec 28 09:27 src

Исправление должно было выполняться chown root.root -R /usr

Тогда снова запустите файл VBoxManage extpack install <package> ..

Я не уверен, как это было вызвано, но я надеюсь, что «исправление» не сломает ничего в моей системе ..

1
задан 20 April 2018 в 16:04

9 ответов

Я предлагаю не хранить команды в массиве, а только параметры (спасибо @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
ответ дан 22 May 2018 в 15:43

Я предлагаю не хранить команды в массиве, а только параметры (спасибо @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
ответ дан 17 July 2018 в 23:43

Я предлагаю не хранить команды в массиве, а только параметры (спасибо @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
ответ дан 24 July 2018 в 17:05

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

#!/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
ответ дан 22 May 2018 в 15:43

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

Чтобы создать массив строк в Bash, вам нужно использовать ключевое слово declare, используя параметр -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
ответ дан 22 May 2018 в 15:43
  • 1
    Не нужно декларировать. Вам нужно declare -A ассоциативные массивы, но не нормальные, основанные на индексе. array=('foo' 'bar' 'baz') достаточно. – terdon♦ 8 January 2018 в 16:37

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

#!/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
ответ дан 17 July 2018 в 23:43

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

Чтобы создать массив строк в Bash, вам нужно использовать ключевое слово declare, используя параметр -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
ответ дан 17 July 2018 в 23:43

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

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

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

Чтобы создать массив строк в Bash, вам нужно использовать ключевое слово declare, используя параметр -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
ответ дан 24 July 2018 в 17:05
  • 1
    Не нужно декларировать. Вам нужно declare -A ассоциативные массивы, но не нормальные, основанные на индексе. array=('foo' 'bar' 'baz') достаточно. – terdon♦ 8 January 2018 в 16:37

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

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