мы хотим построить 6 папок точки монтирования в качестве примера
/data/sdb
/data/sdc
/data/sdd
/data/sde
/data/sdf
/data/sdg
поэтому мы написали этот простой скрипт bash, используя массив
folder_mount_point_list="sdb sdc sdd sde sdf sdg"
folderArray=( $folder_mount_point_list )
counter=0
for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6
do
folder_name=${folderArray[counter]}
mkdir /data/$folder_name
let counter=$counter+1
done
Теперь мы хотим изменить код без счетчика и пусть = $ counter = counter + 1
Можно ли сдвинуть каждый цикл массива, чтобы получить следующее значение массива?
как-то так
${folderArray[++]}
for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6
он не используется внутри тела цикла?for i in "your_list_goes_here"; do mkdir /data/"$i"; done
?Ответы:
Общее замечание. Нет смысла определять массив следующим образом:
Вы бы сделали это вместо этого:
Теперь к вашему вопросу:
или
источник
set -- $list_of_folders
но еще раз: строковые переменные не подходят:set -- "${folders[@]}"
set -- ....
? этот хак нужен только в оболочках, которые не поддерживают массивы - в оболочке, которая поддерживает массивы, он не нужен.for folder_name in "${folderArray[@]}"; do ... ; done
это все, что нужно.set
подход.Чтобы ответить на вопрос в заголовке, вы можете «сдвинуть» массив с помощью обозначения подстроки / подмассива. (
shift
Сам работает только с позиционными параметрами.)Аналогично, чтобы «вытолкнуть» последний элемент из массива:
a=("${a[@]:0:${#a[@]} - 1}" )
илиunset "a[${#a[@]}-1]"
Итак, если вы хотите, вы можете сделать это:
Но он разрушает массивы, так что обычное индексирование может быть лучше. Или может вместо этого использовать ассоциативный массив:
источник
Вы можете просто перебрать все значения без необходимости сдвига:
источник
Вам не нужен цикл для этого:
Хитрость заключается в том, что если массив заключен в двойные кавычки с помощью subscript
*
("${array[*]}"
), он расширяется до одного слова со значением каждого элемента массива, разделенного первым символомIFS
переменной. После этого мы используем механизм расширения фигурных скобок для присоединения/data/
к каждому элементу массива иeval
использования всего этого.источник
cd /data ; mkdir "${folderArray[@]}"
Я делал то же самое раньше, но в таком случае я бы этого не сделал. Но +1 за продвинутый подход.mkdir
команды. И даже массив не нужен,cd /data; mkdir abc def
как сделал бы нормальный человек. Но не может быть так просто для других задач, поэтому полезно знать, как быстро прикрепить строку к каждому элементу массива без цикла.echo "${folderArray[((counter++))]}"
если вам действительно нравится этот подход. Материал внутри(())
оценивается как математика (обратите внимание на отсутствие$
передcounter
).